整合 Druid 数据源
导入 JDBC 场景
在Maven中导入JDBC场景spring-boot-starter-data-jdbc
:
1 2 3 4 5
| <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jdbc</artifactId> </dependency>
|
导入该场景后,将出现数据源Hikari、JDBC和事务等依赖:
导入数据库MySQL驱动的依赖:
1 2 3 4
| <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency>
|
Spring Boot提供的MySQL驱动的默认版本:<mysql.version>8.0.22</mysql.version>
若想要修改版本,可以:
- 直接依赖引入具体版本(maven的就近依赖原则)
- 重新声明版本(maven的属性的就近优先原则)
1 2 3 4 5 6 7 8 9 10 11
| <properties> <java.version>1.8</java.version> <mysql.version>5.1.49</mysql.version> </properties>
<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.49 </version> </dependency>
|
数据源自动配置原理
DataSourceAutoConfiguration: 数据源的自动配置类
- 修改数据源相关的配置前缀:
"spring.datasource"
- 数据库连接池的配置,是容器中没有自定义的DataSource时才自动配置的
- 底层自动配置的数据源是:HikariDataSource
修改数据源的配置项:
1 2 3 4 5 6
| spring: datasource: url: jdbc:mysql://localhost:3306/school?useUnicode=true&characterEncoding=utf8&useSSL=true username: root password: zhaoyuyun driver-class-name: com.mysql.jdbc.Driver
|
其他数据库相关的自动配置类:
- DataSourceTransactionManagerAutoConfiguration: 事务管理器的自动配置
- JdbcTemplateAutoConfiguration: JdbcTemplate的自动配置,可以来对数据库进行crud。容器中有JdbcTemplate这个组件,可以修改配置前缀
"spring.jdbc"
来修改JdbcTemplate的配置。
- JndiDataSourceAutoConfiguration: jndi的自动配置
- XADataSourceAutoConfiguration: 分布式事务相关的
Druid 数据源
Druid官方github地址:https://github.com/alibaba/druid
引入Druid官方提供的starter
场景依赖:
1 2 3 4 5
| <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.1.17</version> </dependency>
|
其向容器中添加了一个Druid数据源自动配置类DruidDataSourceAutoConfigure:
- 该配置器在Spring Boot自带的数据源自动配置器DataSourceAutoConfiguration之前配置,因此不再注册Spring Boot默认的数据源HikariDataSource。
- 该配置器绑定了DataSourceProperties和DruidStatProperties资源配置类,分别对应资源路径
"spring.datasource"
和"spring.datasource.druid"
- 该配置器导入了其他相关的配置类,用于开启配置页、防火墙、Web监控等功能
导入的其他相关配置类如下:
- DruidSpringAopConfiguration.class(
spring.datasource.druid.aop-patterns
):监控Spring Bean
- DruidStatViewServletConfiguration.class(
spring.datasource.druid.stat-view-servlet
):配置监控页:
- DruidWebStatFilterConfiguration.class(
spring.datasource.druid.web-stat-filter
):Web监控配置
- DruidFilterConfiguration.class:配置Druid的所有Filters:
1 2 3 4 5 6 7 8
| private static final String FILTER_STAT_PREFIX = "spring.datasource.druid.filter.stat"; private static final String FILTER_CONFIG_PREFIX = "spring.datasource.druid.filter.config"; private static final String FILTER_ENCODING_PREFIX = "spring.datasource.druid.filter.encoding"; private static final String FILTER_SLF4J_PREFIX = "spring.datasource.druid.filter.slf4j"; private static final String FILTER_LOG4J_PREFIX = "spring.datasource.druid.filter.log4j"; private static final String FILTER_LOG4J2_PREFIX = "spring.datasource.druid.filter.log4j2"; private static final String FILTER_COMMONS_LOG_PREFIX = "spring.datasource.druid.filter.commons-log"; private static final String FILTER_WALL_PREFIX = "spring.datasource.druid.filter.wall";
|
配置示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| spring: datasource: url: jdbc:mysql://localhost:3306/db_account username: root password: 123456 driver-class-name: com.mysql.jdbc.Driver
druid: aop-patterns: com.zhao.admin.* filters: stat,wall
stat-view-servlet: enabled: true login-username: admin login-password: admin resetEnable: false
web-stat-filter: enabled: true urlPattern: /* exclusions: '*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*'
filter: stat: slow-sql-millis: 1000 logSlowSql: true enabled: true wall: enabled: true config: drop-table-allow: false
|
SpringBoot配置示例:https://github.com/alibaba/druid/tree/master/druid-spring-boot-starter
配置项列表:https://github.com/alibaba/druid/wiki/DruidDataSource%E9%85%8D%E7%BD%AE%E5%B1%9E%E6%80%A7%E5%88%97%E8%A1%A8
整合 MyBatis
MyBatis官方链接:https://github.com/mybatis
导入MyBatis的starter
场景依赖:
1 2 3 4 5
| <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.1.4</version> </dependency>
|
其导入了如下包:
其中,MyBatis的自动配置器MybatisAutoConfiguration会在Spring Boot启动时注册到容器中:
该类绑定了MybatisProperties,对应Spring Boot的配置文件中以"mybatis"
为前缀的属性:
- MybatisAutoConfiguration向容器中注册了sqlSessionFactory,其使用容器中存在的数据源,并且从配置资源类MybatisProperties中获取MyBatis的配置属性值:
- MybatisAutoConfiguration向容器中注册了SqlSessionTemplate,其可以执行批量的SqlSession:
- MybatisAutoConfiguration向容器中注册了AutoConfiguredMapperScannerRegistrar,其用于扫描容器中带有 @Mapper 注解的组件:
使用 MyBatis
开启MyBatis流程:
- 导入MyBatis官方starter场景:
mybatis-spring-boot-starter
- 编写
xxxMapper
接口,并在其上使用 @Mapper 注解(也可以使用 @MapperScan() 简化)
- 编写sql映射文件
xxxMapper.xml
(放置在classpath:mapper/*.xml
下)并绑定xxxMapper
接口
- 在
application.yaml
中指定mapper配置文件的位置mapper-locations
,以及指定全局配置文件的信息
具体步骤如下:
- 导入MyBatis的starter场景:
mybatis-spring-boot-starter
1 2 3 4 5
| <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.1.4</version> </dependency>
|
- 编写
UserMapper
接口,并在其上使用 @Mapper 注解(也可以使用 @MapperScan(“com.zhao.mapper”) 简化)
1 2 3 4 5 6 7 8 9
| @Mapper public interface UserMapper {
@Select("select * from user where id = #{id}") User selectUser(Long id);
void deleteUser(Long id); }
|
- 编写sql映射文件
userMapper.xml
(放置在classpath:mapper/*.xml
下)
1 2 3 4 5 6 7 8 9 10 11 12 13
| <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.zhao.admin.mapper.UserMapper"> <select id="selectUser" resultType="com.zhao.admin.bean.User"> select * from user where id = #{id} </select>
<delete id="deleteUser" parameterType="long"> delete from user where id = #{id} </delete> </mapper>
|
- 在
application.yaml
中配置MyBatis:
1 2 3 4 5 6 7
| mybatis: mapper-locations: classpath:mapper/*.xml configuration: map-underscore-to-camel-case: true
|
项目结构:
整合 MyBatis Plus
导入MyBatis-Plus的starter
场景:mybatis-plus-boot-starter
1 2 3 4 5
| <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.4.1</version> </dependency>
|
其会向容器中导入MybatisPlusAutoConfiguration:
其对应的配置前缀为"mybatis-plus"
,其会默认扫描"classpath*:/mapper/**/*.xml"
,即类路径下mapper目录下的所有.xml
文件都会被作为MyBatis的xml进行扫描(开发人员将sql映射文件放置在该目录下即可):
使用时,自定义的Mapper接口继承 BaseMapper<User>
接口即可自动实现简单功能的CRUD:
1 2 3 4
| @Mapper public interface UserMapper extends BaseMapper<User> {
}
|
BaseMapper<User>
接口中默认实现了简单CRUD的方法:
使用MyBatis Plus提供的IService
,ServiceImpl
,减轻Service层开发工作。
1 2 3 4 5 6 7 8 9 10 11
| import com.zhao.hellomybatisplus.model.User; import com.baomidou.mybatisplus.extension.service.IService;
import java.util.List;
public interface UserService extends IService<User> { }
|
1 2 3 4 5 6 7 8 9 10 11 12 13
| import com.zhao.hellomybatisplus.model.User; import com.zhao.hellomybatisplus.mapper.UserMapper; import com.zhao.hellomybatisplus.service.UserService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service;
import java.util.List;
@Service public class UserServiceImpl extends ServiceImpl<UserMapper,User> implements UserService { }
|