MyBatis-Plus 集成
MyBatis-Plus(简称 MP)是 MyBatis 的增强工具,在保留 MyBatis 灵活性的基础上,提供了大量开箱即用的增强功能:内置通用 CRUD、条件构造器、代码生成器、分页插件等,可显著提升开发效率。
核心特性
| 特性 | 说明 |
|---|---|
| 无侵入 | 仅做增强,不影响原生 MyBatis 功能 |
| 通用 CRUD | 内置 BaseMapper,单表操作无需写 SQL |
| 条件构造器 | LambdaQueryWrapper 链式构建查询条件 |
| 代码生成器 | 一键生成 Entity、Mapper、Service、Controller |
| 分页插件 | 物理分页,支持多数据库方言 |
| 自动填充 | 自动填充创建时间、更新时间等字段 |
依赖引入
XML
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.5</version>
</dependency>
注意:引入
mybatis-plus-boot-starter后无需再引入mybatis-spring-boot-starter,两者冲突。
BaseMapper 通用 CRUD
Entity 定义
Java
@Data
@TableName("user")
public class User {
@TableId(type = IdType.AUTO)
private Long id;
private String username;
private String email;
@TableField(fill = FieldFill.INSERT)
private LocalDateTime createTime;
@TableField(fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updateTime;
@TableLogic
private Integer deleted;
}
Mapper 接口
Java
@Mapper
public interface UserMapper extends BaseMapper<User> {
// 继承 BaseMapper 后自动拥有以下方法:
// insert(T entity)
// deleteById(Serializable id)
// updateById(T entity)
// selectById(Serializable id)
// selectList(Wrapper<T> wrapper)
// ... 等 17 个基础 CRUD 方法
}
CRUD 操作示例
Java
@Service
public class UserService {
@Autowired
private UserMapper userMapper;
// 插入
public void insert(User user) {
userMapper.insert(user);
}
// 根据 ID 查询
public User getById(Long id) {
return userMapper.selectById(id);
}
// 根据 ID 更新
public void update(User user) {
userMapper.updateById(user);
}
// 根据 ID 删除(逻辑删除)
public void deleteById(Long id) {
userMapper.deleteById(id);
}
// 批量查询
public List<User> listByIds(List<Long> ids) {
return userMapper.selectBatchIds(ids);
}
}
条件构造器
LambdaQueryWrapper 链式查询
Java
// 查询 status=1 且 username 包含 "admin" 的用户,按创建时间倒序
List<User> users = userMapper.selectList(
new LambdaQueryWrapper<User>()
.eq(User::getStatus, 1)
.like(User::getUsername, "admin")
.orderByDesc(User::getCreateTime)
);
LambdaQueryWrapper 与 LambdaUpdateWrapper
Java
// 条件更新:将 status=0 的用户状态改为 1
userMapper.update(null,
new LambdaUpdateWrapper<User>()
.set(User::getStatus, 1)
.eq(User::getStatus, 0)
);
// 条件删除
userMapper.delete(
new LambdaQueryWrapper<User>()
.lt(User::getCreateTime, LocalDateTime.now().minusDays(30))
);
复杂条件组合
Java
// (status=1 OR status=2) AND (username LIKE '%admin%' OR email LIKE '%admin%')
List<User> users = userMapper.selectList(
new LambdaQueryWrapper<User>()
.and(w -> w.eq(User::getStatus, 1).or().eq(User::getStatus, 2))
.and(w -> w.like(User::getUsername, "admin").or().like(User::getEmail, "admin"))
);
IService 服务层封装
MP 提供了 IService 接口,进一步封装了 Service 层通用方法。
Java
public interface IUserService extends IService<User> {
// 继承 IService 后自动拥有:
// save(T entity), saveBatch(Collection<T> list)
// removeById(Serializable id), updateById(T entity)
// getById(Serializable id), list(Wrapper<T> queryWrapper)
// page(IPage<T> page, Wrapper<T> queryWrapper)
// ... 等更多批量与分页方法
}
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User>
implements IUserService {
// 通用方法已由 ServiceImpl 实现,可直接使用
}
批量操作
Java
@Autowired
private IUserService userService;
// 批量插入(默认每批 1000 条)
List<User> users = Arrays.asList(user1, user2, user3);
userService.saveBatch(users);
// 自定义批次大小
userService.saveBatch(users, 500);
// 批量更新
userService.updateBatchById(users);
自动填充配置
Java
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
this.strictInsertFill(metaObject, "createTime", LocalDateTime::now, LocalDateTime.class);
this.strictInsertFill(metaObject, "updateTime", LocalDateTime::now, LocalDateTime.class);
}
@Override
public void updateFill(MetaObject metaObject) {
this.strictUpdateFill(metaObject, "updateTime", LocalDateTime::now, LocalDateTime.class);
}
}
分页插件配置
Java
@Configuration
public class MyBatisPlusConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
// 添加分页插件
PaginationInnerInterceptor paginationInterceptor = new PaginationInnerInterceptor(DbType.MYSQL);
paginationInterceptor.setMaxLimit(500L); // 单页最大 500 条
interceptor.addInnerInterceptor(paginationInterceptor);
return interceptor;
}
}
分页查询使用
Java
// 分页查询:第 1 页,每页 10 条
IPage<User> page = new Page<>(1, 10);
IPage<User> result = userMapper.selectPage(page,
new LambdaQueryWrapper<User>()
.eq(User::getStatus, 1)
.orderByDesc(User::getCreateTime)
);
System.out.println("总记录数:" + result.getTotal());
System.out.println("当前页数据:" + result.getRecords());
代码生成器
XML
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.5.5</version>
</dependency>
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.32</version>
</dependency>
Java
public class CodeGenerator {
public static void main(String[] args) {
FastAutoGenerator.create(
"jdbc:mysql://localhost:3306/mydb?useSSL=false&serverTimezone=Asia/Shanghai",
"root", "123456")
.globalConfig(builder -> builder
.author("小智")
.outputDir("src/main/java")
.disableOpenDir())
.packageConfig(builder -> builder
.parent("com.example")
.entity("entity")
.mapper("mapper")
.service("service")
.serviceImpl("service.impl")
.controller("controller"))
.strategyConfig(builder -> builder
.addInclude("user", "order", "product")
.entityBuilder()
.enableLombok()
.enableTableFieldAnnotation()
.logicDeleteColumnName("deleted")
.mapperBuilder()
.enableMapperAnnotation()
.enableBaseResultMap())
.templateEngine(new FreemarkerTemplateEngine())
.execute();
}
}
MyBatis 原生与 MP 对比
| 操作 | 原生 MyBatis | MyBatis-Plus |
|---|---|---|
| 根据 ID 查询 | 手写 SQL + Mapper XML | mapper.selectById(id) |
| 条件查询 | 动态 SQL + <if> | new LambdaQueryWrapper<User>().eq(...) |
| 分页查询 | 手写分页插件或 PageHelper | mapper.selectPage(page, wrapper) |
| 批量插入 | ExecutorType.BATCH 或 foreach | service.saveBatch(list) |
| 逻辑删除 | 手写 UPDATE ... SET deleted=1 | @TableLogic 注解 + mapper.deleteById(id) |
| 自动填充 | 手动 set 或拦截器 | @TableField(fill=...) + MetaObjectHandler |
注意事项
- 版本兼容:MP 3.5.x 要求 MyBatis 3.5+,Spring Boot 2.x/3.x 需选择对应 starter
- 冲突排查:勿同时引入
mybatis-spring-boot-starter和mybatis-plus-boot-starter- 多表查询:MP 仅增强单表 CRUD,复杂多表查询仍需手写 XML 或使用
@Select注解- 性能考量:条件构造器生成 SQL 可能不够优,复杂场景建议手写 SQL
- 逻辑删除:需在配置中指定逻辑删除字段与默认值,否则不生效
要点总结
- MyBatis-Plus 在保留原生 MyBatis 基础上,提供了 BaseMapper、IService 等增强接口
- BaseMapper 内置 17 个基础 CRUD 方法,单表操作无需写 SQL
- LambdaQueryWrapper 支持类型安全的链式条件构造,避免字符串硬编码
- IService + ServiceImpl 进一步封装 Service 层,支持批量操作与分页
- 代码生成器可一键生成 Entity、Mapper、Service、Controller 全套代码
- MP 增强的是单表 CRUD,复杂多表查询仍需依赖原生 MyBatis 的 XML 映射
存放路径:D:\git2\jwdev\articles\MYBATIS\专家\生态工具与扩展\MyBatis-Plus 集成.md
📝 发现内容有误?点击此处直接编辑