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。
<dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.3.0</version> </dependency>
<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") public class Application { public static void main(String[] args) { SpringApplication.run(QuickStartApplication.class, args); } }
|
0.4 使用内置 CRUD 方法
在数据库中创建 User 表,创建对应的 User.class,UserMapper.class。
@Data public class User { private String id; private String name; private Integer age; private String email; }
public interface UserMapper extends BaseMapper<User> {
}
|
使用 Mapper CRUD 接口。
@RunWith(SpringRunner.class) @SpringBootTest public class SampleTest { @Autowired private UserMapper userMapper; public void testSelect() { 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();
wrapper.allEq({"name":"wang", "age":null});
wrapper.eq("name", "wang");
wrapper.ne("name", "wang");
wrapper.gt("age", 18);
wrapper.ge("age", 18);
wrapper.lt("age", 18);
wrapper.le("age", 18);
wrapper.between("age", 18, 30);
wrapper.notBetween("age", 18, 30);
wrapper.isNull("age");
wrapper.isNotNull("age");
wrapper.in("id", {1, 2, 3});
wrapper.notIn("id", {1, 2, 3});
|
2.2 模糊查询
QueryWrapper wrapper = new QueryWrapper();
wrapper.like("name", "wang");
wrapper.notLike("name", "wang");
wrapper.likeLeft("name", "wang");
wrapper.likeRight("name", "wang");
|
2.3 分组、排序
QueryWrapper wrapper = new QueryWrapper();
wrapper.groupBy("id", "name");
wrapper.orderByAsc("id");
wrapper.orderByDesc("id");
|
2.4 SQL 连接
QueryWrapper wrapper = new QueryWrapper();
wrapper.eq("id", 1).or().eq("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 分页对象
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;
UserServiceImpl.saveBatch(userList);
UserServiceImpl.updateBatchById(userList);
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 前置配置
@Data public class User extends Model<User>{ private String id; private String name; private Integer age; private String email; }
public interface UserMapper extends BaseMapper<User> {
}
|
5.2 使用 AR 模式
演示常用的增删改查操作,还有很多其他方法可以查看源码。
插入
public void insert() { User user = new User(); user.setName("wang"); user.setAge(18); boolean result = user.insert(); }
|
查询
public void select1() { User user = new User(); User result = user.selectById(1); }
public void select2() { User user = new User(); user.setId(1); User result = user.selectById(); }
|
更新
public void update() { User user = new User(); user.setId("wang"); user.setAge(18); boolean result = user.updateById(); }
|
删除
public void select1() { User user = new User(); User result = user.deleteById(1); }
public void select2() { User user = new User(); user.setId(1); User result = user.deleteById(); }
|
参考文献:Mybatis-Plus 官方文档