SpringBoot数据访问(数据库配置)

296 阅读4分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

一. 数据源配置方式

1.1 选择数据库驱动的库文件(mysql)

在maven中配置数据库驱动

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
</dependency>

1.2 配置数据库连接

在application.properties中配置数据库连接

spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql:///baize?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=root

1.3 配置spring-boot-starter-jdbc

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>

1.4 编写测试类

@RunWith(SpringRunner.class)
@SpringBootTest(classes = SpringBootMytestApplication.class)
class SpringBootMytestApplicationTests {
    
    @Autowired
    DataSource dataSource;
    
    @Test
    public void contextLoads() throws SQLException {
        Connection connection = dataSource.getConnection();
    }
}

二. 连接池配置方式

2.1 SpringBoot提供了三种数据库连接池:HikariCP,Commons DBCP2,Tomcat JDBC Connection Pool

现在spring boot2.x版本默认使用HikariCP,maven中配置如下:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>

如果不使用HikariCP,而改用Commons DBCP2,需要排除HikariCP,则配置如下:

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-dbcp2</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jdbc</artifactId>
    <exclusions>
        <exclusion>
            <groupId>com.zaxxer</groupId>
            <artifactId>HikariCP</artifactId>
        </exclusion>
    </exclusions>
</dependency>

如果不使用HikariCP,改用Tomcat JDBC Connection Pool,需要排除HikariCP,则配置如下:

<dependency>
    <groupId>org.apache.tomcat</groupId>
    <artifactId>tomcat-jdbc</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jdbc</artifactId>
    <exclusions>
        <exclusion>
            <groupId>com.zaxxer</groupId>
            <artifactId>HikariCP</artifactId>
        </exclusion>
    </exclusions>
</dependency>

三. Druid连接池的配置

3.1 在pom.xml中引入druid数据源,因为我们springBoot2.0以后使用的日志框架已经不再使用log4j了。此时应该引入相应的适配器

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid-spring-boot-starter</artifactId>
    <version>1.1.10</version>
</dependency>
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-log4j12</artifactId>
</dependency>

3.2 在application.yml中引入druid的相关配置(这个不要复制,格式可能不对哦)

spring:
    datasource:
        username: root
        password: root
        url: jdbc:mysql:///baize?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=UTC
        driver-class-name: com.mysql.cj.jdbc.Driver
        initialization-mode: always
        # 使用druid数据源
        type: com.alibaba.druid.pool.DruidDataSource
        # 数据源其他配置
        initialSize: 5
        minIdle: 5
        maxActive: 20
        maxWait: 60000
        timeBetweenEvictionRunsMillis: 60000
        minEvictableIdleTimeMillis: 300000
        validationQuery: SELECT 1 FROM DUAL
        testWhileIdle: true
        testOnBorrow: false
        testOnReturn: false
        poolPreparedStatements: true
        # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
        filters: stat,wall,log4j
        maxPoolPreparedStatementPerConnectionSize: 20
        useGlobalDataSourceStat: true
        connectionProperties:
druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500

3.3 编写整合druid的配置类DruidConfig

public class DruidConfig {

    @ConfigurationProperties(prefix = "spring.datasource")
    
    @Bean
    public DataSource druid(){
        return new DruidDataSource();
    }
}

四. SpringBoot项目整合Mybatis

新建springboot项目,并导入mybatis的pom配置

<!-- 配置数据库驱动和mybatis dependency -->
<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>1.3.2</version>
</dependency>
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <optional>true</optional>
</dependency>

application.yml配置

spring:
    datasource:
    username: root
    password: root
    url: jdbc:mysql:///springboot_h?useUnicode=true&characterEncoding=utf-   8&useSSL=true&serverTimezone=UTC
    driver-class-name: com.mysql.jdbc.Driver
    # 使用druid数据源
    type: com.alibaba.druid.pool.DruidDataSource

基础Model类

import lombok.Data;

@Data
public class User {
    private Integer id;
    private String username;
    private Integer age;
}

dao类(mybatis使用注解开发)

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

@Mapper
public interface UserDao {

    @Select("SELECT * FROM USER")
    List<User> getUserList();
}

service类

import com.example.demo.dao.UserDao;
import com.example.demo.domain.User;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;

@Service
public class UserService {

Logger logger = LoggerFactory.getLogger(UserService.class);
    @Autowired
    private UserDao userDao;
    
    public List<User> getUser(){
        List<User> userList = userDao.getUser();
        logger.info("查询出来的用户信息,{}",userList.toString());
        return userList;
    }
}

测试类

import com.example.demo.DemoApplicationTests;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import static org.junit.Assert.*;

public class UserServiceTest extends DemoApplicationTests {

    @Autowired
    private UserService userService;
    
    @Test
    public void getUser() {
        userService.getUser();
    }
}

五. Mybatis自动配置源码分析

5.1 ## @SpringBootApplication

      SpringBoot项目最核心的就是自动加载配置,该功能则依赖的是一个注解@SpringBootApplication中的@EnableAutoConfiguration

5.2 EnableAutoConfiguration类

      EnableAutoConfiguration类主要是通过AutoConfigurationImportSelector类来加载,以mybatis为例,*selector通过反射加载spring.factories中指定的java类,也就是加载MybatisAutoConfiguration类(该类有Configuration注解,属于配置类)

5.3 MybatisAutoConfiguration:

(1). MybatisProperties类

MybatisAutoConfiguration类中有个MybatisProperties类,该类对应的是mybatis的配置文件

(2). MybatisAutoConfiguration类

      SpringBootMybatisAutoConfiguration类中有个sqlSessionFactory方法,作用是创建SqlSessionFactory类、Configuration类(mybatis最主要的类,保存着与mybatis相关的东西)

(3). SelSessionTemplate,

      SpringBootSelSessionTemplate作用是与mapperProoxy代理类有关,sqlSessionFactory主要是通过创建了一个SqlSessionFactoryBean,这个类实现了FactoryBean接口,所以在Spring容器就会注入这个类中定义的getObject方法返回的对象。现在已经得到了SqlSessionFactory了,接下来就是如何扫描到相关的Mapper接口了

(4)@Import

      SpringBoot通过@Import的方式会扫描到MapperScannerRegistrar类。MapperScannerRegistrar实现了ImportBeanDefinitionRegistrar接口,那么在spring实例化之前就会调用到registerBeanDefinitions方法。MapperScannerConfigurer实现了BeanDefinitionRegistryPostProcessor接口,所以接着又会扫描并调用到postProcessBeanDefinitionRegistry方法。

(5). MapperFactoryBea

      @MapperScan(basePackages = “com.mybatis.mapper”)这个定义,扫描指定包下的mapper接口,然后设置每个mapper接口的beanClass属性为MapperFactoryBean类型并加入 到spring的bean容器中。MapperFactoryBean实现了FactoryBean接口,所以当spring从待实例化的bean容器中遍历到这个bean并开始执行实例化时返回的对象实际上是getObject方法中返回的对象。到此,mapper接口现在也通过动态代理生成了实现类,并且注入到spring的bean容器中了,之后使用者就可以通过@Autowired或者getBean等方式,从spring容器中获取到了