目录

2024-11-30-数据库连接池可能造成的问题

数据库连接池可能造成的问题

一.引例:(仍为之前连接数据库的案例)

https://i-blog.csdnimg.cn/blog_migrate/cbd23e2580d2d500bf235c4ec1f40017.png

如果出现异常NoSuchFieldError,可能是由于类不存在造成的 :

https://i-blog.csdnimg.cn/blog_migrate/e1ecedae089f21926109947c52d899aa.png

在左边的target文件中classes下就缺少了User类–>导致后台无法找到对应的类

https://i-blog.csdnimg.cn/blog_migrate/1e42f7c4678c2abf331d64abf09dbcd6.png


上述问题与 数据库连接池 有关

二.解决方案:

首先明确一点:数据库连接池与创建Springboot工程时的服务器URL有关


1.当服务器URL使用 (idea 默认的)时:–>无需再接数据库连接池

(但也可以更改为自己需要的数据库连接池)

https://i-blog.csdnimg.cn/blog_migrate/f9464dc15426f26aba8ed86e2f007491.png

**该URL是idea默认使用的URL-->因此会使用springboot工程下默认使用的Hikari数据库连接池**(追光者数据库连接池)

a.注意:

https://i-blog.csdnimg.cn/blog_migrate/f7f558991e8107ed79bf8091439603d1.png

这个URL下在引入驱动包时,比如Spring Boot的3.3.0版本以上(包括3.3.0版本)会不支持Mybatis Framework这个驱动包,因此使用该驱动包时需要3.3.0以下的版本

别的驱动包根据需求选择


b.数据库连接信息:

https://i-blog.csdnimg.cn/blog_migrate/a75f2da5013888c6e769f6f757e7ad07.png

代码:

spring.application.name=spring_Test

spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

spring.datasource.url=jdbc:mysql://localhost:3306/mybatis

spring.datasource.username=root

spring.datasource.password=1234

c.pom.xml文件:如果要用lombok,只需要引入lombok依赖即可–>位置千万别放错了(放对了左侧会有蓝色 标志提醒)

https://i-blog.csdnimg.cn/blog_migrate/ad1d2fba114fb049c46bb8e6a323957c.png


d.引入lombok依赖后实体类可用注解简化:

https://i-blog.csdnimg.cn/blog_migrate/a28386e98f8bd2fd3ceda82b7eff2368.png

简化的内容可通过查看左下角target文件下的User类查看

代码:

package com.springtest.spring_test.pojo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor //无参构造
@AllArgsConstructor //全参构造
public class User {
    private Integer age;
    private String name;
}

e.UserMapper接口代码:
package com.springtest.spring_test.mapper;

import com.springtest.spring_test.pojo.User;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;

import java.util.List;

@Mapper
public interface UserMapper {
    @Select("select * from student")
    public List<User> list();
}

f.student数据库:

https://i-blog.csdnimg.cn/blog_migrate/4630a117893b390723e526cb0891f32e.png

源代码:

-- auto-generated definition
create table student
(
    age  tinyint unsigned not null comment '年龄',
    name varchar(10)      not null comment '姓名'
)
    collate = utf8mb4_0900_ai_ci;

g.测试类:

https://i-blog.csdnimg.cn/blog_migrate/9e03ca764dab8814511e667ddf499003.png

代码:

package com.springtest.spring_test;

import com.springtest.spring_test.pojo.User;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
class SpringTestApplicationTests {

    @Test
    void contextLoads() {
        User u=new User(12,"zhangsan");
        System.out.println(u);
    }
}

h.运行结果:

https://i-blog.csdnimg.cn/blog_migrate/8853623f2e3c7473b1478b9739cbfab6.png


i.包的结构:target文件下必须要出现实体类

https://i-blog.csdnimg.cn/blog_migrate/eca18705db66239bd7770998bba69128.png


2.当服务器URL使用 时:

为阿里服务器,使用该服务器时,最好把数据库连接池更改为Druid数据库连接池(阿里公司开发的一种高效数据库连接池),

不然可能出现不兼容的情况,导致无法正常访问类


a.建立新模块–>需要改服务器URL:

https://i-blog.csdnimg.cn/blog_migrate/1b3580199d3dcddf3d5a6af50c7dd3b1.png

https://i-blog.csdnimg.cn/blog_migrate/0c9cb1f6680ff0dad08b88c8061f5fee.png


b.pom.xml文件(关键所在):

https://i-blog.csdnimg.cn/blog_migrate/127e132e94a878730a08dfc284068f8f.png

注意1:由于使用的是阿里提供的数据库,因此需要把数据库连接池更改为Druid。

代码: 注意别把位置放错了;

版本也必须写上如1.2.8

<!--druid连接池-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.2.8</version>
        </dependency>
注意2: 用阿里的URL服务时 如果引入lombok一定要标注版本号,且必须是最新版,旧版可能出现不兼容的情况
<!--lombok,注意目录-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.32</version>  <!--要用最新的版本,低版本可能不兼容-->
        </dependency>

c.数据库连接信息:

https://i-blog.csdnimg.cn/blog_migrate/285e3c02aae86d36acd435dc032782f3.png


d.UserMapper接口:

https://i-blog.csdnimg.cn/blog_migrate/8cf9ea187e35ad604d90c44e6f2fda23.png

代码:

package com.itheima.mapper;

import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
import com.itheima.pojo.User;

import java.util.List;


@Mapper
public interface UserMapper {

    //定义一个方法,用于查询全部用户信息
    @Select("select * from user")
    public List<User> list();


}

e.实体类User:

https://i-blog.csdnimg.cn/blog_migrate/b1defa227df0a36277cd31028ab0d9e1.png

代码:

package com.itheima.pojo;

import lombok.*;

//引入lombok依赖后就可以用注解简化代码了
/*@Getter
@Setter
@ToString
@EqualsAndHashCode*/

@Data
@NoArgsConstructor //无参构造
@AllArgsConstructor //全参构造
public class User {
    //在实体类中,定义属性值的类型建议用包装类型
    private Integer id;
    /*id在数据库中为int型,java中可用包装类Integer*/
    private String name;
    private Short age;
    private Short gender;//性别
    /*数据库中gender为tinyint型,java中可用short型->包装类为Short*/
    private String phone;//手机号
    /*数据库中varchar型在java中用String型*/


    
}

f.测试类:

https://i-blog.csdnimg.cn/blog_migrate/5efc1f3d809e18fb153883528ca26625.png

https://i-blog.csdnimg.cn/blog_migrate/f3a381c3619e3973b3736be2e32fa8c5.png

代码:

package com.itheima;

import com.itheima.mapper.UserMapper;
import com.itheima.pojo.User;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.List;
import java.util.ListIterator;

@SpringBootTest  //@SpringBootTest注解代表springboot整合单元测试的注解
class SpringbootMybatisQuickstartApplicationTests {

    /*
    @Test
    void contextLoads() {
    }*/

    @Autowired //@Autowired注解用来完成依赖注入
    private UserMapper userMapper;

    @Test
    public void testListUser() {
        //调用UserMapper的list方法来查询全部用户信息
        /* 但UserMapper为接口,不能实例化
           但有了@Mapper注解,运行时会自动生成该接口的实现类对象(代理对象),并且将该对象交给IOC容器管理
           已经成为IOC容器里的bean了
           之后要在单元测试中用到这个bean对象,可以通过依赖注入的形式,将这个bean对象注入进来
           因此,在测试方法上声明一个UserMapper类型的对象,
         */

        //调用list方法
        List<User> userList = userMapper.list();

        ListIterator<User> it = userList.listIterator();
        while (it.hasNext()) {
            User u = it.next();
            System.out.println(u);
        }
    }

    /* 注:由于该单元测试是SpringBoot整合的单元测试,上面有一个注解@SpringBootTest,一旦加了这个注解,
          其中的单元测试方法(@Test注解下)在运行时会自动加载整个SpringBoot的环境,并且创建SpringBoot的IOC容器,
          IOC容器创建好后,通过依赖注入(@Autowired注解下)的形式从IOC容器中获取UserMapper这个类型的bean对象,
          之后即可调用bean对象的list方法来查询全部用户信息
     */
}

g.user数据库:

https://i-blog.csdnimg.cn/blog_migrate/9684a3468c72ec8212dcbaad234d89ac.png

源代码:

-- auto-generated definition
create table user
(
    id     int auto_increment comment 'id'
        primary key,
    name   varchar(10)      not null comment '姓名',
    age    tinyint unsigned not null comment '年龄',
    gender tinyint unsigned not null comment '性别:1.男 , 2.女',
    phone  varchar(11)      not null comment '电话号码',
    constraint id
        unique (id),
    constraint phone
        unique (phone)
)
    comment '用户';
​
​

h.运行结果:

https://i-blog.csdnimg.cn/blog_migrate/be3ae80f8d6f6419431e2fb50aa02d52.png


i.包的结构:target文件下必须要出现实体类

https://i-blog.csdnimg.cn/blog_migrate/2e4f9ee1c7ff8ead0bec69085f51b4c9.png


三.总结:

1.当服务器URL使用 (idea 默认的)时,此时不需要再手动书写数据库连接池了

但也可以在pom.xml文件中进行更改数据库连接池。

2.当服务器URL使用 时,此时需要把数据库连接池改为Druid数据库连接池,为了不出问题。

(比如防止引入lombok后出现找不到类的情况)

3.创建新模块时切记关注服务器URL。

68747470:733a2f2f626c6f672e6373646e2e6e65742f4144437662562f:61727469636c652f64657461696c732f313339333331383239