MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。


0. MyBatis-Plus 快速启动

基于 Spring Boot 的 MyBatis-Plus 基本使用。

0.1 引入依赖

引入 mybatis-plus 和 数据库 依赖。

支持数据库:mysql、mariadb、oracle、db2、h2、hsql、sqlite、postgresql、sqlserver。

<!-- mybatis-plus 依赖 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.3.0</version>
</dependency>
<!-- mysql 依赖 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.18</version>
</dependency>

0.2 配置数据库信息

在 application.yml 中配置数据库信息。

spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/mybatisplus?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT
username: root
password: root

0.3 配置 mapper 包

创建 mapper 包,将 xxxMapper.class 创建于此包下。在启动类加入 @MapperScan 注解用于扫描 Mapper 映射类。

@SpringBootApplication
@MapperScan("com.lxiao.mybatisplus.mapper") // mapper 包路径
public class Application {
public static void main(String[] args) {
SpringApplication.run(QuickStartApplication.class, args);
}
}

0.4 使用内置 CRUD 方法

在数据库中创建 User 表,创建对应的 User.class,UserMapper.class。

// User.class
@Data
public class User {
private String id;
private String name;
private Integer age;
private String email;
}

// UserMapper.class
public interface UserMapper extends BaseMapper<User> {

}

使用 Mapper CRUD 接口。

@RunWith(SpringRunner.class)
@SpringBootTest
public class SampleTest {
@Autowired
private UserMapper userMapper;

public void testSelect() {
// 查询所有 user
List<User> userList = userMapper.selectList(null);
// 打印到控制台
userList.forEach(System.out::println);
}
}

1. MyBatis-Plus 常用注解

Mybatis-Plus 注解类包:gitee源码 | mybatis-plus-annotation

MyBatis-Plus 注解详细说明:注解 | MyBatis-Plus

@TableName

描述:表名注解。

// 指定表名
@TableName(value="user")
@Data
public class User {
private String id;
private String name;
private Integer age;
private String email;
}

@TableId

描述:主键注解。

@TableName(value="user")
@Data
public class User {
// 指定主键名,主键策略
@TableId(value="id", type = IdType.ASSIGN_UUID)
private String id;

private String name;
private Integer age;
private String email;
}

@TableField

描述:字段注解(非主键)。

@TableName(value="user")
@Data
public class User {
@TableId(value="id", type = IdType.ASSIGN_UUID)
private String id;

// 指定字段名
@TableField(value="user_name")
private String name;
@TableField(value="user_age")
private Integer age;
@TableField(value="user_email")
private String email;
}

@TableLogic

描述:表字段逻辑处理注解(逻辑删除)。

@TableName(value="user")
@Data
public class User {
@TableId(value="id", type = IdType.ASSIGN_UUID)
private String id;

@TableField(value="user_name")
private String name;
@TableField(value="user_age")
private Integer age;
@TableField(value="user_email")
private String email;

// 指定此字段为逻辑删除字段
@TableLogic
private Integer deleted;
}

其他注解

@Version:乐观锁注解,将 @Version 标记在注解上。

@EnmnValue:枚举类注解,将 @EnmnValue 标记在注解上。

@SqlParser:租户注解,将 @SqlParser 标记在 Method(实体类) 或 Mapper(映射类) 上。

@KeySequence:序列主键策略。


2. MyBatis-Plus 条件构造器

2.1 比较条件

// 创建条件构造器实例
QueryWrapper wrapper = new QueryWrapper();

// 全部等于,->SQL: name='wang' AND age IS NULL;
wrapper.allEq({"name":"wang", "age":null});

// 等于,->SQL: name='wang';
wrapper.eq("name", "wang");

// 不等于,->SQL: name <> 'wang';
wrapper.ne("name", "wang");

// 大于,->SQL: age > 18;
wrapper.gt("age", 18);

// 大于等于,->SQL: age >= 18;
wrapper.ge("age", 18);

// 小于,->SQL: age < 18;
wrapper.lt("age", 18);

// 小于等于,->SQL: age <= 18;
wrapper.le("age", 18);

// 在...之间,->SQL: age BETWEEN 18 AND 30;
wrapper.between("age", 18, 30);

// 不在...之间,->SQL: age NOT BETWEEN 18 AND 30;
wrapper.notBetween("age", 18, 30);

// 为空,->SQL: age IS NULL;
wrapper.isNull("age");

// 不为空,->SQL: age IS NOT NULL;
wrapper.isNotNull("age");

// 属于某个值,->SQL: id IN (1, 2, 3);
wrapper.in("id", {1, 2, 3});

// 不属于某个值,->SQL: id NOT IN (1, 2, 3);
wrapper.notIn("id", {1, 2, 3});

2.2 模糊查询

// 创建条件构造器实例
QueryWrapper wrapper = new QueryWrapper();

// LIKE '%value%',->SQL: name LIKE '%wang%'
wrapper.like("name", "wang");

// NOT LIKE '%value%',->SQL: name NOT LIKE '%wang%'
wrapper.notLike("name", "wang");

// LIKE '%value',->SQL: name LIKE '%wang'
wrapper.likeLeft("name", "wang");

// LIKE 'value%',->SQL: name LIKE 'wang%'
wrapper.likeRight("name", "wang");

2.3 分组、排序

// 创建条件构造器实例
QueryWrapper wrapper = new QueryWrapper();

// 分组,->SQL: GROUP BY id, name;
wrapper.groupBy("id", "name");

// 升序排序,->SQL: ORDER BY id ASC;
wrapper.orderByAsc("id");

// 降序排序,->SQL: ORDER BY id DESC;
wrapper.orderByDesc("id");

2.4 SQL 连接

// 创建条件构造器实例
QueryWrapper wrapper = new QueryWrapper();

// 或,->SQL: id=1 OR name='wang';
wrapper.eq("id", 1).or().eq("name", "wang");

// 且,->SQL: id=1 AND name='wang';
wrapper.eq("id", 1).and().eq("name", "wang");

2.5 其他条件构造器方法

MyBatis-Plus 条件构造器详细说明:条件构造器 | MyBatis-Plus


3. MyBatis-Plus 分页插件

3.1 配置分页插件

@Configuration
public class MybatisPlusConfig {
// 分页插件
@Bean
public PaginationInterceptor paginationInterceptor() {
return new PaginationInterceptor();
}
}

3.2 分页对象

// Mybatis-Plus 分页对象部分源码
public class Page<T> implements IPage<T> {
// 查询结果
private List<T> records;
// 查询结果总数
private long total;
// 每页数量
private long size;
// 当前页数
private long current;

// ... ...
}

3.3 使用分页

public void test() {
QueryWrapper queryWrapper = new QueryWrapper();
queryWrapper.eq("age", 18);
// 分页查询会返回一个分页对象
IPage page = userMapper.selectPage(new Page(1, size), queryWrapper);
// 获取查询结果
List<User> listUser = page.getRecords();
// 获取总数
long total = page.getTotal();
}

4. MyBatis-Plus 通用 Service

除了 BaseMapper 接口,MyBatis-Plus 还提供了 IService 接口。IService 接口与 BaseMapper 接口功能大同小异,但是 IService 接口还支持批量操作和链式操作。

4.1 批量操作

List<User> userList;

// 对 List 中的 User 对象进行批量插入
UserServiceImpl.saveBatch(userList);

// 对 List 中的 User 对象进行批量更新
UserServiceImpl.updateBatchById(userList);

// 对 List 中的 User 对象进行尝试更新或插入
UserServiceImpl.saveOrUpdateBatch(userList);

4.2 链式操作

// 链式查询
QueryChainWrapper<T> query();
query().eq("name", "wang").one();

// 链式更新
UpdateChainWrapper<T> update();
update().eq("name", "wang").remove();

5. MyBatis-Plus AR 模式

ActiveRecord 模式:直接通过实体类的对象进行表的增删改查操作。

5.1 前置配置

// User.class 需要继承 Model<T>
@Data
public class User extends Model<User>{
private String id;
private String name;
private Integer age;
private String email;
}

// UserMapper.class 需要继承 BaseMapper<T>
public interface UserMapper extends BaseMapper<User> {

}

5.2 使用 AR 模式

演示常用的增删改查操作,还有很多其他方法可以查看源码。

插入
public void insert() {
User user = new User();
user.setName("wang");
user.setAge(18);

// 插入成功返回 true。
boolean result = user.insert();
}
查询
// 设置参数查询
public void select1() {
User user = new User();

// 查询成功返回 User 对象。
User result = user.selectById(1);
}

// 设置实例查询
public void select2() {
User user = new User();
user.setId(1);

// 查询成功返回 User 对象。
User result = user.selectById();
}
更新
public void update() {
User user = new User();
user.setId("wang");
user.setAge(18);

// 根据 id 更新。
boolean result = user.updateById();
}
删除
// 设置参数删除
public void select1() {
User user = new User();

// 删除成功返回 User 对象。
User result = user.deleteById(1);
}

// 设置实例删除
public void select2() {
User user = new User();
user.setId(1);

// 删除成功返回 User 对象。
User result = user.deleteById();
}

参考文献:Mybatis-Plus 官方文档

评论