基础概念
MyBatis-Plus 使用教程、特性与介绍
MyBatis-Plus(简称 MP)是 MyBatis 的增强工具库,在保留 MyBatis 原生功能的基础上,提供了更简洁高效的 CRUD 操作、代码生成、条件构造器等特性,大幅减少 SQL 编写量。以下是核心内容:
一、核心特性
-
无侵入设计
仅扩展 MyBatis 功能,不改变原生结构,兼容所有 MyBatis 配置。 -
强大的 CRUD 封装
- 通过继承
BaseMapper<T>接口,自动实现单表增删改查,无需手动写 SQL。public interface UserMapper extends BaseMapper<User> { } // 自动获得 17 个基础方法 - 内置通用 Service 层封装(
IService+ServiceImpl):public interface UserService extends IService<User> { } @Service public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService { }
- 通过继承
-
智能条件构造器
使用QueryWrapper或LambdaQueryWrapper动态构建 SQL 条件:QueryWrapper<User> wrapper = new QueryWrapper<>(); wrapper.like("name", "Tom").lt("age", 30); // WHERE name LIKE '%Tom%' AND age < 30 List<User> users = userMapper.selectList(wrapper); -
主键策略支持
支持自增、UUID、雪花算法等分布式 ID 生成(通过@TableId注解配置)。 -
插件扩展
- 分页插件:无需手动处理分页逻辑。
- 性能分析插件:输出 SQL 执行时间,优化慢查询。
- 乐观锁插件:通过
@Version注解实现并发控制。
二、快速使用教程(Spring Boot)
-
添加依赖
<dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.5.0</version> </dependency> -
配置数据源与 MP(application.yml)
spring: datasource: url: jdbc:mysql://localhost:3306/db username: root password: 123456 mybatis-plus: configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 打印SQL日志 -
实体类注解
@Data @TableName("sys_user") // 指定表名 public class User { @TableId(type = IdType.AUTO) // 自增主键 private Long id; private String name; private Integer age; @TableField("user_email") // 映射字段名 private String email; } -
基础 CRUD 示例
// 插入 User user = new User(); user.setName("John"); userMapper.insert(user); // SQL自动生成 // 批量插入(Service层) List<User> userList = ...; userService.saveBatch(userList); // 查询记录数 long count = userService.count(); // 条件查询 LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>(); wrapper.eq(User::getName, "John"); List<User> users = userService.list(wrapper);
三、进阶功能
-
代码生成器
自动生成 Entity、Mapper、Service、Controller 代码:AutoGenerator generator = new AutoGenerator(); generator.setGlobalConfig(...); // 配置包路径、作者等 generator.setDataSource(...); // 数据库配置 generator.setStrategy(...); // 生成策略 generator.execute(); // 执行生成 -
逻辑删除
添加注解实现软删除:@TableField("is_deleted") @TableLogic // 逻辑删除字段 private Integer deleted;执行
deleteById(id)实际触发 UPDATE 操作。 -
字段自动填充
配合@TableField(fill = FieldFill.INSERT)自动填充创建时间/更新时间。
四、适用场景
- 快速开发后台管理系统(如权限管理、数据报表)。
- 需要减少重复 SQL 编写的单表操作场景。
- 微服务架构中基础数据模块开发。
- 需要动态条件查询但不想用 JPA 的项目。
提示:复杂多表关联查询仍建议使用 MyBatis 原生 XML 编写 SQL。
思维导图

进阶内容
MyBatis-Plus 核心功能详解
一、多表联合查询实现方法
MyBatis-Plus 主要专注于单表操作,多表查询需结合原生 MyBatis 实现:
- XML 映射文件实现
<select id="selectUserWithOrders" resultMap="userOrderMap">
SELECT u.*, o.order_id, o.order_amount
FROM user u
LEFT JOIN orders o ON u.id = o.user_id
WHERE u.id = #{userId}
</select>
- 注解方式实现
@Select("SELECT u.name, o.order_no FROM user u INNER JOIN orders o ON u.id = o.user_id")
@Results({
@Result(property = "name", column = "name"),
@Result(property = "orders", column = "order_no")
})
List<UserOrderDTO> selectUserOrders();
注意:对比 MyBatis-Flex/Fluent-MyBatis 的联表支持(引用[1]),MP 在多表查询方面较弱,复杂场景建议结合原生 MyBatis
二、分页功能配置与使用
- 配置分页插件
@Configuration
public class MybatisPlusConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
return interceptor;
}
}
- 分页查询实践
// 构造分页参数(当前页, 每页数量)
Page<User> page = new Page<>(1, 10);
// 单表分页
Page<User> userPage = userMapper.selectPage(page, null);
// 自定义SQL分页
Page<UserOrderDTO> resultPage = userMapper.selectUserOrders(page, params);
List<UserOrderDTO> records = resultPage.getRecords(); // 当前页数据
long total = resultPage.getTotal(); // 总记录数
分页总量缓存设计可优化性能(引用[1])
三、数据库字段加密存储
通过 @TableField 注解和自定义 TypeHandler 实现:
- 实体类配置
public class User {
@TableField(typeHandler = AESEncryptHandler.class)
private String mobile; // 手机号加密存储
}
- 自定义加密处理器
public class AESEncryptHandler extends BaseTypeHandler<String> {
@Override
public void setNonNullParameter(...) {
// 加密逻辑
String encrypted = AESUtil.encrypt(parameter);
ps.setString(i, encrypted);
}
@Override
public String getNullableResult(ResultSet rs, String columnName) {
// 解密逻辑
return AESUtil.decrypt(rs.getString(columnName));
}
}
支持在数据存储层自动加解密(引用[3])
四、乐观锁机制
通过 @Version 注解实现并发控制:
- 实体类配置
public class Product {
@Version
private Integer version; // 乐观锁字段
}
- 更新操作流程
-- 更新时自动附加版本条件
UPDATE product SET stock=10, version=version+1
WHERE id=100 AND version=2
- 更新冲突处理
Product product = productMapper.selectById(100);
product.setStock(product.getStock() - 1);
int attempts = 0;
while (attempts++ < 3) {
try {
productMapper.updateById(product);
break; // 更新成功
} catch (OptimisticLockingFailureException ex) {
// 重试:重新查询最新数据
product = productMapper.selectById(100);
}
}
五、MyBatis-Plus 与 MyBatis 核心区别
| 特性 | MyBatis | MyBatis-Plus |
|---|---|---|
| CRUD 操作 | 需手动编写SQL | 自动生成基础SQL(BaseMapper) |
| 条件构造器 | 无 | QueryWrapper/LambdaQueryWrapper |
| 分页支持 | 需手动实现 | 内置分页插件 |
| 代码生成 | 需第三方工具 | 内置代码生成器 |
| 性能分析 | 需手动配置 | 内置性能分析插件 |
| 多表联查 | 完整支持 | 需结合原生MyBatis实现 |
| 依赖复杂度 | 轻量 | 依赖更多(如注解处理) |
| 学习曲线 | 较陡峭 | 更平缓(开箱即用) |
核心定位:MP 是 MyBatis 的增强工具而非替代品,解决重复 CRUD 编码问题(引用[2])
思维导图


3599

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



