本文已参与「新人创作礼」活动,一起开启掘金创作之路。
一. 数据源配置方式
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容器中获取到了