点击上方“芋道源码
做积极的人,而不是积极废人!
源码精品专栏
摘要: 原创出处 http://www.iocoder.cn/Spring-Boot/MyBatis/ 「芋道源码」欢迎转载,保留摘要,谢谢!
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 给我们日常开发,还是提供了蛮多便利性的,胖友不烦尝试下。
欢迎加入我的知识星球,一起探讨架构,交流源码。加入方式,长按下方二维码噢:

已在知识星球更新源码解析如下:
如果你喜欢这篇文章,喜欢,转发。
生活很美好,明天见(。・ω・。)ノ♡
本文详细介绍MyBatis-Plus的使用,包括依赖引入、配置、实体类定义、Mapper接口扩展及测试,展示其简化CRUD操作的强大功能。
2035

被折叠的 条评论
为什么被折叠?



