芋道 Spring Boot MyBatis 入门(三)之 MyBatis-Plus
1. 概述
2. MyBatis + XML
2.1 引入依赖
2.2 Application
2.3 应用配置文件
2.4 MyBatis 配置文件
2.5 UserDO
2.6 UserMapper
2.7 简单测试
3. MyBatis + 注解
3.1 差异部分
3.2 UserMapper
3.3 简单测试
4. MyBatis-Plus
4.1 引入依赖
4.2 Application
4.3 应用配置文件
4.4 UserDO
4.5 UserMapper
4.6 简单测试
5. tkmybatis
5.1 引入依赖
5.2 Application
5.3 应用配置文件
5.4 MyBatis 配置文件
5.5 UserDO
5.6 UserMapper
5.7 简单测试
666. 彩蛋
4. MyBatis-Plus
关于 MyBatis-Plus 的介绍,直接到 https://mybatis.plus/ 官网,艿艿就不多哔哔,嘿嘿。
示例代码对应仓库:mybatis-plus 。
本小节,我们会使用 mybatis-plus-boot-starter
自动化配置 MyBatis-Plus 的配置。同时,演示如何使用 MyBatis-Plus 实现我们在 「2. MyBatis + XML」 演示的各种 CRUD 的操作。
4.1 引入依赖
在 pom.xml
文件中,引入相关依赖。
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.3.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>lab-12-mybatis-plus</artifactId>
<dependencies>
<!-- 实现对数据库连接池的自动化配置 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency> <!-- 本示例,我们使用 MySQL -->
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.48</version>
</dependency>
<!-- 实现对 MyBatis Plus 的自动化配置 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.2.0</version>
</dependency>
<!-- 方便等会写单元测试 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
</project>
相比来说,将
mybatis-spring-boot-starter
替换成mybatis-plus-boot-starter
。
4.2 Application
创建 Application.java
类,配置 @MapperScan
注解,扫描对应 Mapper 接口所在的包路径。代码如下:
// Application.java
@SpringBootApplication
@MapperScan(basePackages = "cn.iocoder.springboot.lab12.mybatis.mapper")
public class Application {
}
和 「2.2 Application」 一致。
4.3 应用配置文件
在 resources
目录下,创建 application.yaml
配置文件。配置如下:
spring:
# datasource 数据源配置内容
datasource:
url: jdbc:mysql://47.112.193.81:3306/testb5f4?useSSL=false&useUnicode=true&characterEncoding=UTF-8
driver-class-name: com.mysql.jdbc.Driver
username: testb5f4
password: F4df4db0ed86@11
# mybatis-plus 配置内容
mybatis-plus:
configuration:
map-underscore-to-camel-case: true # 虽然默认为 true ,但是还是显示去指定下。
global-config:
db-config:
id-type: auto # ID 主键自增
logic-delete-value: 1 # 逻辑已删除值(默认为 1)
logic-not-delete-value: 0 # 逻辑未删除值(默认为 0)
mapper-locations: classpath*:mapper/*.xml
type-aliases-package: cn.iocoder.springboot.lab12.mybatis.dataobject
# logging
logging:
level:
# dao 开启 debug 模式 mybatis 输入 sql
cn:
iocoder:
springboot:
lab12:
mybatis:
mapper: debug
将
mybatis
替换成mybatis-plus
配置项目。实际上,如果老项目在用mybatis-spring-boot-starter
的话,直接将mybatis
修改成mybatis-plus
即可。相比
mybatis
配置项来说,mybatis-plus
增加了更多配置项,也因此我们无需在配置 `mybatis-config.xml` 配置文件。更多的 MyBatis-Plus 配置项,可以看看 MyBatis-Plus 使用配置 。
配置
logging
的原因是,方便我们看到 MyBatis-Plus 自动生成的 SQL 。生产环境下,记得关闭噢。
4.4 UserDO
在 cn.iocoder.springboot.lab12.mybatis.dataobject
包路径下,创建 UserDO.java 类,用户 DO 。代码如下:
// UserDO.java
@TableName(value = "users")
public class UserDO {
/**
* 用户编号
*/
private Integer id;
/**
* 账号
*/
private String username;
/**
* 密码(明文)
*
* ps:生产环境下,千万不要明文噢
*/
private String password;
/**
* 创建时间
*/
private Date createTime;
/**
* 是否删除
*/
@TableLogic
private Integer deleted;
// ... 省略 setting/getting 方法
}
相比 「2.5 UserDO」 来说,主要有两点差别。
增加了 `@TableName` 注解,设置了 UserDO 对应的表名是
users
。毕竟,我们要使用 MyBatis-Plus 给咱自动生成 CRUD 操作。增加了
deleted
字段,并添加了 `@TableLogic` 注解,设置该字段为逻辑删除的标记。在 `application.yaml` 配置文件中,我们配置了删除(`logic-delete-value = 1`)和未删除(`logic-not-delete-value = 0`)。当然,也可以通过注解的 `value` 和 `delval` 来定义未删除和删除。
具体关于 MyBatis-Plus 的逻辑删除功能,看下 逻辑删除 部分的文档。
对应的创建表的 SQL 如下:
CREATE TABLE `users` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '用户编号',
`username` varchar(64) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '账号',
`password` varchar(32) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '密码',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
`deleted` bit(1) DEFAULT NULL COMMENT '是否删除。0-未删除;1-删除',
PRIMARY KEY (`id`),
UNIQUE KEY `idx_username` (`username`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
4.5 UserMapper
在 cn.iocoder.springboot.lab12.mybatis.mapper
包路径下,创建 UserMapper 接口。代码如下:
// UserMapper.java
@Repository
public interface UserMapper extends BaseMapper<UserDO> {
default UserDO selectByUsername(@Param("username") String username) {
return selectOne(new QueryWrapper<UserDO>().eq("username", username));
}
List<UserDO> selectByIds(@Param("ids") Collection<Integer> ids);
default IPage<UserDO> selectPageByCreateTime(IPage<UserDO> page, @Param("createTime") Date createTime) {
return selectPage(page,
new QueryWrapper<UserDO>().gt("create_time", createTime));
}
}
还是老样子,我们来比较下 「2.6 UserMapper」 接口。
继承了
com.baomidou.mybatisplus.core.mapper.BaseMapper
接口,这样常规的 CRUD 操作,MyBatis-Plus 就可以替我们自动生成。一般来说,开发 CRUD 业务的时候,最枯燥的就是要写 CRUD 的常用 SQL ,完全跟不上艿艿的思绪哈。因为继承了 BaseMapper 接口,所以我们删除了 `#insert(UserDO user)`、`#updateById(UserDO user)`、`#deleteById(@Param("id") Integer id)`、`#selectById(@Param("id") Integer id)` 四个 CRUD 方法。
更多 BaseMapper 已经提供好的接口方法,可以看看 《MyBatis-Plus 文档 —— CRUD 接口》 。
对于
#selectByUsername(@Param("username") String username)
方法,我们使用了com.baomidou.mybatisplus.core.conditions.query.QueryWrapper
构造相对灵活的条件,这样一些动态 SQL 我们就无需在 XML 中编写。更多 QueryWrapper 已经提供好的拼接方法,可以看看 《MyBatis-Plus 文档 —— 条件构造器》 。
建议 1 :不要在 Service 中,使用 QueryWrapper 拼接动态条件。因为 BaseMapper 提供了 `#selectList(Wrapper
queryWrapper)` 等方法,促使我们能够在 Service 层的逻辑中,使用 QueryWrapper 拼接动态条件,这样会导致逻辑里遍布了各种查询,使我们无法对实际有哪些查询条件做统一的管理。碰到这种情况,建议封装到对应的 Mapper 中,这样会更加简洁干净可管理。建议 2 :因为 QueryWrapper 暂时不支持一些类似 `
` 等 MyBatis 的 OGNL 表达式,所以艿艿在 onemall 中,通过继承 QueryWrapper 类,封装了 QueryWrapperX 类。
对于
#selectByIds(@Param("ids")
方法,实际也可以使用 MyBatis-Plus 的 QueryWrapper 很方便的实现,这里仅仅是为了演示在 MyBatis-Plus 混合使用 XML 。对于
#selectPageByCreateTime(IPage page, @Param("createTime") Date createTime)
方法,是我们额外添加的,用于演示 MyBatis-Plus 提供的分页插件。更多 IPage 的内容,可以看看 《MyBatis-Plus 文档 —— 分页插件》 。
在 resources/mapper
路径下,创建 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="cn.iocoder.springboot.lab12.mybatis.mapper.UserMapper">
<sql id="FIELDS">
id, username, password, create_time
</sql>
<select id="selectByIds" resultType="UserDO">
SELECT
<include refid="FIELDS" />
FROM users
WHERE id IN
<foreach item="id" collection="ids" separator="," open="(" close=")" index="">
#{id}
</foreach>
</select>
</mapper>
是不是一下子,瘦了!
4.6 简单测试
创建 UserMapperTest 测试类,我们来测试一下简单的 UserMapper 的每个操作。代码如下:
// UserMapperTest.java
@RunWith(SpringRunner.class)
@SpringBootTest(classes = Application.class)
public class UserMapperTest {
@Autowired
private UserMapper userMapper;
@Test
public void testInsert() {
UserDO user = new UserDO().setUsername(UUID.randomUUID().toString())
.setPassword("nicai").setCreateTime(new Date())
.setDeleted(0); // 一般情况下,是否删除,可以全局枚举下。
userMapper.insert(user);
}
@Test
public void testUpdateById() {
UserDO updateUser = new UserDO().setId(1)
.setPassword("wobucai");
userMapper.updateById(updateUser);
}
@Test
public void testDeleteById() {
userMapper.deleteById(2);
}
@Test
public void testSelectById() {
userMapper.selectById(1);
}
@Test
public void testSelectByUsername() {
userMapper.selectByUsername("yunai");
}
@Test
public void testSelectByIds() {
List<UserDO> users = userMapper.selectByIds(Arrays.asList(1, 3));
System.out.println("users:" + users.size());
}
@Test
public void testSelectPageByCreateTime() {
IPage<UserDO> page = new Page<>(1, 10);
Date createTime = new Date(2018 - 1990, Calendar.FEBRUARY, 24); // 临时 Demo ,实际不建议这么写
page = userMapper.selectPageByCreateTime(page, createTime);
System.out.println("users:" + page.getRecords().size());
}
}
和 「2.7 简单测试」 差不多,只是多了一个分页的单元测试方法。
总的来说,MyBatis-Plus 给我们日常开发,还是提供了蛮多便利性的,胖友不烦尝试下。
更多相关文章
- 芋道 Spring Boot MyBatis 入门(二)之 MyBatis + 注解
- SpringBoot 中 @SpringBootApplication注解背后的三体结构探秘
- DoDAF2.0方法论探究
- http协议请求方法都有哪些?网络安全学习提升
- 【前端词典】8 个提高 JS 性能的方法
- AngularJS 日期时间选择组件(附详细使用方法)
- 5 种方法教你用Python玩转histogram直方图
- Spring 注解编程之模式注解
- IDEA Debug 无法进入断点的解决方法