【MyBatis】Spring Boot 整合 MyBatis

img

整合 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和事务等依赖:

image-20210804152401123

导入数据库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>

若想要修改版本,可以:

  1. 直接依赖引入具体版本(maven的就近依赖原则)
  2. 重新声明版本(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

image-20210804153524354

修改数据源的配置项:

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

image-20210804202513107

  • 该配置器在Spring Boot自带的数据源自动配置器DataSourceAutoConfiguration之前配置,因此不再注册Spring Boot默认的数据源HikariDataSource
  • 该配置器绑定了DataSourcePropertiesDruidStatProperties资源配置类,分别对应资源路径"spring.datasource""spring.datasource.druid"
  • 该配置器导入了其他相关的配置类,用于开启配置页、防火墙、Web监控等功能

导入的其他相关配置类如下:

  • DruidSpringAopConfiguration.classspring.datasource.druid.aop-patterns):监控Spring Bean
  • DruidStatViewServletConfiguration.classspring.datasource.druid.stat-view-servlet):配置监控页:
  • DruidWebStatFilterConfiguration.classspring.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.* # 监控SpringBean
filters: stat,wall # 底层开启功能,stat(sql监控),wall(防火墙)

stat-view-servlet: # 配置监控页功能
enabled: true
login-username: admin
login-password: admin
resetEnable: false

web-stat-filter: # 监控web
enabled: true
urlPattern: /*
exclusions: '*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*'

filter:
stat: # 对上面filters里面的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>

其导入了如下包:

image-20210805142616006

其中,MyBatis的自动配置器MybatisAutoConfiguration会在Spring Boot启动时注册到容器中:

image-20210805143359047

该类绑定了MybatisProperties,对应Spring Boot的配置文件中以"mybatis"为前缀的属性:

image-20210805144216362

  1. MybatisAutoConfiguration向容器中注册了sqlSessionFactory,其使用容器中存在的数据源,并且从配置资源类MybatisProperties中获取MyBatis的配置属性值:

image-20210805143832167

  1. MybatisAutoConfiguration向容器中注册了SqlSessionTemplate,其可以执行批量的SqlSession

image-20210805144629709

image-20210805144721508

  1. MybatisAutoConfiguration向容器中注册了AutoConfiguredMapperScannerRegistrar,其用于扫描容器中带有 @Mapper 注解的组件:

image-20210805151107546

使用 MyBatis

开启MyBatis流程:

  • 导入MyBatis官方starter场景: mybatis-spring-boot-starter
  • 编写xxxMapper接口,并在其上使用 @Mapper 注解(也可以使用 @MapperScan() 简化)
  • 编写sql映射文件xxxMapper.xml(放置在classpath:mapper/*.xml下)并绑定xxxMapper接口
  • application.yaml中指定mapper配置文件的位置mapper-locations,以及指定全局配置文件的信息

具体步骤如下:

  1. 导入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>
  1. 编写UserMapper接口,并在其上使用 @Mapper 注解(也可以使用 @MapperScan(“com.zhao.mapper”) 简化)
1
2
3
4
5
6
7
8
9
@Mapper
public interface UserMapper {

// 可以使用注解代替xml里的sql语句
@Select("select * from user where id = #{id}")
User selectUser(Long id);

void deleteUser(Long id);
}
  1. 编写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>
  1. application.yaml中配置MyBatis:
1
2
3
4
5
6
7
mybatis:
# config-location: classpath:mybatis/mybatis-config.xml
mapper-locations: classpath:mapper/*.xml

# 可以不写mybatis-config.xml,所有全局配置文件的配置都放在configuration配置项中即可
configuration:
map-underscore-to-camel-case: true

项目结构:

image-20210805212017625

整合 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

image-20210805194210051

其对应的配置前缀为"mybatis-plus",其会默认扫描"classpath*:/mapper/**/*.xml",即类路径下mapper目录下的所有.xml文件都会被作为MyBatis的xml进行扫描(开发人员将sql映射文件放置在该目录下即可):

image-20210805193856503

使用时,自定义的Mapper接口继承 BaseMapper<User> 接口即可自动实现简单功能的CRUD:

1
2
3
4
@Mapper
public interface UserMapper extends BaseMapper<User> {

}

BaseMapper<User> 接口中默认实现了简单CRUD的方法:

image-20210805213009214

使用MyBatis Plus提供的IServiceServiceImpl,减轻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;

/**
* Service 的CRUD也不用写了
*/
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 {
//此处故意为空
}