文章目录
1 mybatis 简介
MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJO(普通的 Java对象)映射成数据库中的记录。2 mybatis 功能架构
我们把Mybatis的功能架构分为三层:
(1) API接口层:提供给外部使用的接口API,开发人员通过这些本地API来操纵数据库。接口层一接收到调用请求就会调用数据处理层来完成具体的数据处理。
(2) 数据处理层:负责具体的SQL查找、SQL解析、SQL执行和执行结果映射处理等。它主要的目的是根据调用的请求完成一次数据库操作。
(3) 基础支撑层:负责最基础的功能支撑,包括连接管理、事务管理、配置加载和缓存处理,这些都是共用的东西,将他们抽取出来作为最基础的组件。为上层的数据处理层提供最基础的支撑。
3 spring boot整合mybatis
项目整体结构图如下:
3.1 项目搭建
(1) User表结构
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '用户编号',
`user_name` varchar(64) DEFAULT NULL COMMENT '用户名',
`age` tinyint(32) DEFAULT NULL COMMENT '年龄',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;
(2) pom文件添加mybatis依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.1</version>
<relativePath/>
</parent>
<groupId>com.example</groupId>
<artifactId>mybatis-demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>mybatis-demo</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<!--mybatis的自动化配置-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.4</version>
</dependency>
<!--mysql数据库驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.22</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<finalName>mybatis-demo</finalName>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>com/**/dao/*.xml</include>
</includes>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.yml</include>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<mainClass>com.example.mybatisdemo.MybatisDemoApplication</mainClass>
</configuration>
<!--解决SpringBoot打包成jar后运行提示没有主清单属性-->
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
</project>
- 在 mybatis-spring-boot-starter 里面已经自动包含了 spring-boot-starter-jdbc
- build节点的配置很重要,定义了项目编译jar包时要包含的各类文件
(3) Application项目启动类增加@MapperScan注解,用于扫描mybatis mapper接口
@SpringBootApplication
@MapperScan(basePackages = "com.example.mybatisdemo.dao")
public class MybatisDemoApplication {
public static void main(String[] args) {
SpringApplication.run(MybatisDemoApplication.class, args);
}
}
(4) application.properties配置文件
spring.application.name=mybatis-demo
server.port=1020
# 连接数据库
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/testdb?serverTimezone=UTC&useSSL=false&useUnicode=true&characterEncoding=UTF-8
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
# 连接池名称
spring.datasource.hikari.pool-name=mybatis_demo_hikari_pool
# 最小空闲连接数
spring.datasource.hikari.minimum-idle=5
# 空闲连接存活最大时间,默认600000(10分钟)
spring.datasource.hikari.idle-timeout=180000
# 连接池中的最大连接数
spring.datasource.hikari.maximum-pool-size=20
# 客户端获取连接池连接的超时时长,默认30秒
spring.datasource.hikari.connection-timeout=30000
# 设置要执行的SQL查询,测试连接的有效性
spring.datasource.hikari.connection-test-query=SELECT 1
# 加载mybatis的xml文件
mybatis.mapper-locations=classpath*:com/example/mybatisdemo/dao/*.xml
# 下划线的数据库字段映射成驼峰风格的实体对象字段
mybatis.configuration.map-underscore-to-camel-case=true
# 打印数据库日志
logging.level.com.example.mybatisdemo.dao=debug
- 主要包含数据库连接、hikari连接池、mybatis加载和映射规则、打印数据库等相关的配置
- spring-boot-jdbc默认的数据库连接池就是HikariCP,号称性能最好的数据库连接池
(5) controller控制器
@RestController
public class UserController {
@Autowired
private UserService userService;
private Logger logger = LoggerFactory.getLogger(UserController.class);
@PostMapping("/saveUser")
public Boolean saveUser(@RequestBody User user) {
logger.info("新增用户信息:{}", user);
int ret = userService.insertUser(user);
return ret == 1 ? Boolean.TRUE : Boolean.FALSE;
}
@PostMapping("/deleteUser")
public Boolean deleteUser(int id) {
logger.info("根据用户id删除用户信息:{}", id);
int ret = userService.deleteUserById(id);
return ret == 1 ? Boolean.TRUE : Boolean.FALSE;
}
@PostMapping("/updateUser")
public Boolean updateUser(@RequestBody User user) {
logger.info("更新用户信息:{}" + user);
int ret = userService.updateUser(user);
return ret == 1 ? Boolean.TRUE : Boolean.FALSE;
}
@GetMapping("/getUser")
public User getUser(int id) {
logger.info("根据用户id查询用户信息:{}", id);
User user = userService.getUserById(id);
return user;
}
}
(6) UserService接口
public interface UserService {
/**
* 新增用户
*
* @param user 用户信息
* @return int
*/
int insertUser(User user);
/**
* 根据用户编号删除用户
*
* @param id 用户编号
* @return int
*/
int deleteUserById(int id);
/**
* 更新用户信息
*
* @param user 用户信息
* @return int
*/
int updateUser(User user);
/**
* 根据用户编号查询用户信息
*
* @param id 用户编号
* @return User
*/
User getUserById(int id);
}
(7) UserServiceImpl接口实现类
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserMapper userMapper;
@Override
@Transactional(rollbackFor = Exception.class)
public int insertUser(User user) {
int result = userMapper.insertUser(user);
return result;
}
@Override
public int deleteUserById(int id) {
return userMapper.deleteUserById(id);
}
@Override
public int updateUser(User user) {
return userMapper.updateUser(user);
}
@Override
public User getUserById(int id) {
return userMapper.getUserById(id);
}
}
(8) User实体类
public class User {
private int id;
private String userName;
private Integer age;
private LocalDateTime createTime;
// 省略geter、seter、toString方法
}
(9) UserMapper接口,必须添加注解@Mapper
@Mapper
public interface UserMapper {
/**
* 新增用户
*
* @param user 用户信息
* @return int
*/
int insertUser(User user);
/**
* 根据用户编号删除用户
*
* @param id 用户编号
* @return int
*/
int deleteUserById(int id);
/**
* 更新用户信息
*
* @param user 用户信息
* @return int
*/
int updateUser(User user);
/**
* 根据用户编号查询用户信息
*
* @param id 用户编号
* @return User
*/
User getUserById(Integer id);
}
(10) UserMapper.xml文件,定义具体的sql语句操作
<?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.example.mybatisdemo.dao.UserMapper">
<insert id="insertUser" parameterType="com.example.mybatisdemo.entity.User">
INSERT INTO user(user_name,age,create_time)
VALUES(#{userName},#{age},NOW())
</insert>
<delete id="deleteUserById" parameterType="Integer">
DELETE FROM user WHERE id=#{id}
</delete>
<update id="updateUser" parameterType="com.example.mybatisdemo.entity.User">
UPDATE user
SET user_name=#{userName},
age=#{age}
WHERE id=#{id}
</update>
<select id="getUserById" parameterType="Integer" resultType="com.example.mybatisdemo.entity.User">
SELECT u.id,u.user_name,u.age,u.create_time
FROM user u
WHERE u.id=#{id}
</select>
</mapper>
3.2 项目启动
启动mbatis-demo项目,然后通过postman新增一条数据
控制台打印出接口日志、mybatis执行的sql语句和具体的参数
2021-01-16 15:26:04.385 INFO 6996 --- [nio-1020-exec-1] c.e.m.controller.UserController : 新增用户信息:User{id=0, userName='张三', age=10, createTime=null}
2021-01-16 15:26:04.402 INFO 6996 --- [nio-1020-exec-1] com.zaxxer.hikari.HikariDataSource : mybatis_demo_hikari_pool - Starting...
2021-01-16 15:26:04.669 INFO 6996 --- [nio-1020-exec-1] com.zaxxer.hikari.HikariDataSource : mybatis_demo_hikari_pool - Start completed.
2021-01-16 15:26:12.460 DEBUG 6996 --- [nio-1020-exec-1] c.e.m.dao.UserMapper.insertUser : ==> Preparing: INSERT INTO user(user_name,age,create_time) VALUES(?,?,NOW())
2021-01-16 15:26:12.483 DEBUG 6996 --- [nio-1020-exec-1] c.e.m.dao.UserMapper.insertUser : ==> Parameters: 张三(String), 10(Integer)
2021-01-16 15:26:12.488 DEBUG 6996 --- [nio-1020-exec-1] c.e.m.dao.UserMapper.insertUser : <== Updates: 1
3.3 验证事务
在service的方法上添加注解@Transactional即可开启数据库事务,在insertUser方法里面添加整数除以0的代码,如下图所示:
重新启动mybatis-demo项目,通过postman发送请求,IDEA控制台会打印出异常日志,查询数据库发现数据没有保存成功,说明事务正常开启。
2021-01-16 15:36:53.056 INFO 15928 --- [nio-1020-exec-2] c.e.m.controller.UserController : 新增用户信息:User{id=0, userName='张三', age=10, createTime=null}
2021-01-16 15:36:53.063 INFO 15928 --- [nio-1020-exec-2] com.zaxxer.hikari.HikariDataSource : mybatis_demo_hikari_pool - Starting...
2021-01-16 15:36:53.241 INFO 15928 --- [nio-1020-exec-2] com.zaxxer.hikari.HikariDataSource : mybatis_demo_hikari_pool - Start completed.
2021-01-16 15:36:53.269 DEBUG 15928 --- [nio-1020-exec-2] c.e.m.dao.UserMapper.insertUser : ==> Preparing: INSERT INTO user(user_name,age,create_time) VALUES(?,?,NOW())
2021-01-16 15:36:53.289 DEBUG 15928 --- [nio-1020-exec-2] c.e.m.dao.UserMapper.insertUser : ==> Parameters: 张三(String), 10(Integer)
2021-01-16 15:36:53.290 DEBUG 15928 --- [nio-1020-exec-2] c.e.m.dao.UserMapper.insertUser : <== Updates: 1
2021-01-16 15:36:53.321 ERROR 15928 --- [nio-1020-exec-2] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.ArithmeticException: / by zero] with root cause
4 spring boot整合mybatis-plus
项目整体结构图如下:
4.1 mybatis-plus简介
MyBatis-Plus (opens new window)(简称 MP)是一个 MyBatis (opens new window)的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。
4.2 项目搭建
1、pom文件添加 mybatis-plus 依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.2</version>
<relativePath/>
</parent>
<groupId>com.example</groupId>
<artifactId>mybatis-plus-demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>mybatis-plus-demo</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<!--mybatis的自动化配置-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.4</version>
</dependency>
<!--mysql数据库驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.22</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!--mybatis-plus自动配置-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.2</version>
</dependency>
</dependencies>
<build>
<finalName>mybatis-plus-demo</finalName>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>com/**/dao/*.xml</include>
</includes>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.yml</include>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<mainClass>com.example.mybatisplusdemo.MybatisPlusDemoApplication</mainClass>
</configuration>
<!--解决SpringBoot打包成jar后运行提示没有主清单属性-->
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
</project>
2、Application启动类
@SpringBootApplication
public class MybatisPlusDemoApplication {
public static void main(String[] args) {
SpringApplication.run(MybatisPlusDemoApplication.class, args);
}
}
3、application.properties配置文件,设置mybatis-plus相关属性值
spring.application.name=mybatis-plus-demo
server.port=1020
# 连接数据库
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/testdb?serverTimezone=UTC&useSSL=false&useUnicode=true&characterEncoding=UTF-8
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
# 连接池名称
spring.datasource.hikari.pool-name=mybatis_demo_hikari_pool
# 最小空闲连接数
spring.datasource.hikari.minimum-idle=5
# 空闲连接存活最大时间,默认600000(10分钟)
spring.datasource.hikari.idle-timeout=180000
# 连接池中的最大连接数
spring.datasource.hikari.maximum-pool-size=20
# 客户端获取连接池连接的超时时长,默认30秒
spring.datasource.hikari.connection-timeout=30000
# 设置要执行的SQL查询,测试连接的有效性
spring.datasource.hikari.connection-test-query=SELECT 1
# 加载mybatis的xml文件
mybatis-plus.mapper-locations=classpath*:com/example/mybatisdemo/dao/*.xml
# id主键自增
mybatis-plus.global-config.db-config.id-type=auto
# 逻辑删除字段名称
mybatis-plus.global-config.db-config.logic-delete-field=flag
# 逻辑删除全局值(默认 1、表示已删除)
mybatis-plus.global-config.db-config.logic-delete-value=1
# 逻辑未删除全局值(默认 0、表示未删除)
mybatis-plus.global-config.db-config.logic-not-delete-value=0
# 下划线的数据库字段映射成驼峰风格的实体对象字段
mybatis-plus.configuration.map-underscore-to-camel-case=true
# 打印数据库日志
logging.level.com.example.mybatisplusdemo.dao=debug
4、新增配置类 MybatisPlusConfig
@Configuration
@MapperScan(basePackages = "com.example.mybatisplusdemo.dao")
public class MybatisPlusConfig {
/**
* 加载插件
*/
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
// 乐观锁插件
interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
// 分页插件
interceptor.addInnerInterceptor(new PaginationInnerInterceptor());
return interceptor;
}
}
- @MapperScan注解用于扫描Mapper接口
- 注入MybatisPlusInterceptor用于加载mybatis-plus的分页、乐观锁插件
5、User实体类,添加mybatis-plus的注解用于数据库表映射,方便使用mybatis-plus自带的CURD功能
@TableName(value = "user")
public class User {
@TableId
private Integer id;
@TableField(value = "user_name")
private String userName;
@TableField(value = "age")
private Integer age;
@TableField(value = "create_time")
private LocalDateTime createTime;
@TableLogic
private Integer flag;
@Version
private Integer version;
//省略getter、setter、toString方法
}
注解的作用描述:
mybatis-plus 注解官方文档
注解 | 描述 |
---|---|
@TableName | 表名注解 |
@TableId | 主键注解,在配置文件里面已经设置了主键的生成策略:id主键自增 |
@TableField | 字段注解(非主键),value值是数据库表字段名 |
@TableLogic | 表字段逻辑删除注解 |
@Version | 乐观锁注解,需要配合OptimisticLockerInnerInterceptor乐观锁插件 |
6、UserParams查询参数类
public class UserParams {
/**
* 用户名
*/
private String userName;
/**
* 当前页
*/
private Integer currentPage;
/**
* 每页数据条数
*/
private Integer pageSize;
//省略getter、setter、toString方法
}
7、UserController控制器类,主要包含增删改查的接口,其中分页使用了两种方式
@RestController
public class UserController {
@Autowired
private UserService userService;
private Logger logger = LoggerFactory.getLogger(UserController.class);
@PostMapping("/saveUser")
public Boolean saveUser(@RequestBody User user) {
logger.info("新增用户信息:{}", user);
int ret = userService.insertUser(user);
return ret == 1 ? Boolean.TRUE : Boolean.FALSE;
}
@PostMapping("/deleteUser")
public Boolean deleteUser(int id) {
logger.info("根据用户id删除用户信息:{}", id);
int ret = userService.deleteUserById(id);
return ret == 1 ? Boolean.TRUE : Boolean.FALSE;
}
@PostMapping("/updateUser")
public Boolean updateUser(@RequestBody User user) {
logger.info("更新用户信息:{}", user);
int ret = userService.updateUser(user);
return ret == 1 ? Boolean.TRUE : Boolean.FALSE;
}
@GetMapping("/getUser")
public User getUser(int id) {
logger.info("根据用户id查询用户信息:{}", id);
User user = userService.getUserById(id);
return user;
}
@GetMapping("/getUserPageList")
public IPage<User> getUserPageList(UserParams userParams) {
logger.info("用户信息分页查询,mybatis-plus自带查询函数:{}", userParams);
IPage<User> userPageList = userService.getUserPageList(userParams);
return userPageList;
}
@GetMapping("/getUserListPageSelf")
public IPage<User> getUserListPageSelf(UserParams userParams) {
logger.info("自定义用户信息分页查询:{}", userParams);
IPage<User> userPageListSelf = userService.getUserListPageSelf(userParams);
return userPageListSelf;
}
}
8、UserService接口
public interface UserService {
/**
* 新增用户
*
* @param user 用户信息
* @return int
*/
int insertUser(User user);
/**
* 根据用户编号删除用户
*
* @param id 用户编号
* @return int
*/
int deleteUserById(int id);
/**
* 更新用户信息
*
* @param user 用户信息
* @return int
*/
int updateUser(User user);
/**
* 根据用户编号查询用户信息
*
* @param id 用户编号
* @return User
*/
User getUserById(int id);
/**
* 分页查询用户信息
*
* @param userParams 参数
* @return IPage
*/
IPage<User> getUserPageList(UserParams userParams);
/**
* 自定义分页查询用户信息
*
* @param userParams 参数
* @return IPage
*/
IPage<User> getUserListPageSelf(UserParams userParams);
}
9、UserServiceImpl接口实现类
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserMapper userMapper;
@Override
@Transactional(rollbackFor = Exception.class)
public int insertUser(User user) {
user.setCreateTime(LocalDateTime.now());
int result = userMapper.insert(user);
return result;
}
@Override
public int deleteUserById(int id) {
return userMapper.deleteById(id);
}
@Override
public int updateUser(User user) {
// 先获取当前的version值
User oldUser = userMapper.selectById(user.getId());
user.setVersion(oldUser.getVersion());
return userMapper.updateById(user);
}
@Override
public User getUserById(int id) {
return userMapper.selectById(id);
}
@Override
public IPage<User> getUserPageList(UserParams userParams) {
Page<User> pageUser = new Page<>(userParams.getCurrentPage(), userParams.getPageSize());
// 条件构造器
QueryWrapper<User> userWrapper = new QueryWrapper<>();
if (userParams.getUserName() != null) {
userWrapper.like("user_name", userParams.getUserName());
}
// 设置排序字段
userWrapper.orderByAsc("age");
IPage<User> userPageList = userMapper.selectPage(pageUser, userWrapper);
return userPageList;
}
@Override
public IPage<User> getUserListPageSelf(UserParams userParams) {
Page<User> pageUser = new Page<>(userParams.getCurrentPage(), userParams.getPageSize());
IPage<User> userPageList = userMapper.findUserListPage(pageUser, userParams);
return userPageList;
}
}
- updateUser 使用了乐观锁的功能,得先获取当前的version,然后更新的时候会自动赋值:version=version+1
- getUserPageList 使用了查询条件构造器QueryWrapper:条件构造器官方文档
- getUserListPageSelf 使用了自定义的分页查询,需要在 mapper xml 文件里面写相关的sql语句
10、UserMapper 接口
@Mapper
public interface UserMapper extends BaseMapper<User> {
/**
* 自定义分页列表查询
*/
IPage<User> findUserListPage(Page<User> page, @Param("userParams") UserParams userParams);
}
继承了BaseMapper父类,自动包含了增删改查的方法,如下图所示:
Mapper CRUD 官方文档
11、UserMapper xml文件
<?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.example.mybatisplusdemo.dao.UserMapper">
<select id="findUserListPage" parameterType="com.example.mybatisplusdemo.entity.UserParams"
resultType="com.example.mybatisplusdemo.entity.User">
SELECT id,user_name,age,create_time,flag,version
FROM user
WHERE flag=0
<if test="userParams.userName!=null and userParams.userName!=''">
AND user_name like concat('%',#{userParams.userName},'%')
</if>
ORDER BY age ASC
</select>
</mapper>
12、新增User表,新增加了flag、version字段
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '用户编号',
`user_name` varchar(64) DEFAULT NULL COMMENT '用户名',
`age` tinyint(32) DEFAULT NULL COMMENT '年龄',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
`flag` tinyint(4) DEFAULT '0' COMMENT '逻辑删除 0:未删除,1:已删除',
`version` tinyint(4) DEFAULT '1' COMMENT '版本号',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=26 DEFAULT CHARSET=utf8;
启动mybatis-plus-demo项目,启动成功如下图所示:
4.3 验证乐观锁字段是否自动维护
使用postman请求updateUser方法
通过IDEA控制台打印的日志可以看出mybatis-plus框架可以正确维护version字段
4.4 验证逻辑删除
通过postman请求deleteUser方法
通过IDEA控制台打印的日志和数据库查询的结果可以看出逻辑删除成功
图一,控制台打印日志
图二,数据库查询结果
4.5 验证分页功能
通过postman请求getUserListPageSelf方法
查看IDEA控制台日志可以发现已实现分页、模糊查询的功能
2021-01-17 12:13:52.759 DEBUG 8720 --- [nio-1020-exec-8] c.e.m.d.U.findUserListPage_mpCount : ==> Preparing: SELECT COUNT(*) FROM user WHERE flag = 0 AND user_name LIKE concat('%', ?, '%')
2021-01-17 12:13:52.760 DEBUG 8720 --- [nio-1020-exec-8] c.e.m.d.U.findUserListPage_mpCount : ==> Parameters: 张(String)
2021-01-17 12:13:52.763 DEBUG 8720 --- [nio-1020-exec-8] c.e.m.d.U.findUserListPage_mpCount : <== Total: 1
2021-01-17 12:13:52.782 DEBUG 8720 --- [nio-1020-exec-8] c.e.m.dao.UserMapper.findUserListPage : ==> Preparing: SELECT id,user_name,age,create_time,flag,version FROM user WHERE flag=0 AND user_name like concat('%',?,'%') ORDER BY age ASC LIMIT ?
2021-01-17 12:13:52.782 DEBUG 8720 --- [nio-1020-exec-8] c.e.m.dao.UserMapper.findUserListPage : ==> Parameters: 张(String), 5(Long)
2021-01-17 12:13:52.785 DEBUG 8720 --- [nio-1020-exec-8] c.e.m.dao.UserMapper.findUserListPage : <== Total: 2
5 示例代码下载
至此,Spring boot 整合mybatis、mybatis-plus入门分享完毕