MyBatis-Plus 日常使用指南
MyBatis-Plus (简称 MP) 是在 MyBatis 基础上的增强工具,只做增强,不做改变,极大简化了 CRUD 开发,让数据访问层代码更简洁。
一、快速开始
1. 添加依赖
Maven
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.5</version>
</dependency>
建议锁定版本,避免升级导致的行为变更。
2. 基本配置(application.yml)
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # SQL日志输出
global-config:
db-config:
id-type: auto # 主键策略: 自增
logic-delete-field: deleted # 逻辑删除字段名
logic-delete-value: 1 # 删除时的值
logic-not-delete-value: 0 # 未删除时的值
二、核心功能
1. 基本 CRUD
@Autowired
private UserMapper userMapper;
// 插入
User user = new User();
user.setName("张三").setAge(20);
userMapper.insert(user);
// 查询
User u = userMapper.selectById(1L);
// 更新
u.setName("李四");
userMapper.updateById(u);
// 删除
userMapper.deleteById(1L);
// 查询所有
List<User> users = userMapper.selectList(null);
2. 条件构造器
QueryWrapper 写法
QueryWrapper<User> qw = new QueryWrapper<>();
qw.eq("name", "张三")
.gt("age", 18)
.orderByDesc("create_time");
List<User> users = userMapper.selectList(qw);
LambdaQueryWrapper(推荐)
LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<>();
lqw.eq(User::getName, "张三")
.gt(User::getAge, 18)
.orderByDesc(User::getCreateTime);
List<User> users = userMapper.selectList(lqw);
Lambda 写法避免手写列名,字段重构更安全。
3. 分页插件
@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);
LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<User>()
.gt(User::getAge, 20);
IPage<User> result = userMapper.selectPage(page, lqw);
System.out.println("总页数: " + result.getPages());
System.out.println("总记录数: " + result.getTotal());
三、高级功能
1. 自动填充
@Data
public class User {
@TableField(fill = FieldFill.INSERT)
private Date createTime;
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date updateTime;
}
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
this.strictInsertFill(metaObject, "createTime", Date.class, new Date());
this.strictInsertFill(metaObject, "updateTime", Date.class, new Date());
}
@Override
public void updateFill(MetaObject metaObject) {
this.strictUpdateFill(metaObject, "updateTime", Date.class, new Date());
}
}
2. 逻辑删除
@TableLogic
private Integer deleted;
3. 乐观锁
@Version
private Integer version;
@Bean
public MybatisPlusInterceptor mpInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
return interceptor;
}
4. 代码生成器
FastAutoGenerator.create("jdbc:mysql://localhost:3306/db", "root", "password")
.globalConfig(builder -> builder.author("ring")
.outputDir(System.getProperty("user.dir") + "/src/main/java")
.enableSwagger()
.fileOverride())
.packageConfig(builder -> builder.parent("com.example.mp")
.moduleName("system")
.pathInfo(Collections.singletonMap(OutputFile.xml,
System.getProperty("user.dir") + "/src/main/resources/mapper")))
.strategyConfig(builder -> builder.addInclude("user")
.addTablePrefix("t_"))
.execute();
四、常见问题
- 字段名与数据库不一致
@TableField("db_column_name")
private String entityField;
- 排除非数据库字段
@TableField(exist = false)
private String tempData;
- 复杂 SQL
- 使用 XML Mapper
- 或注解 @Select、@Update 等
- 多表 JOIN 建议写在 XML 中
- 自定义sql
// Mapper接口中定义方法
@Select("SELECT * FROM user WHERE age > #{age}")
List<User> selectUsersOlderThan(@Param("age") Integer age);
// XML方式
// 在resources/mapper/UserMapper.xml中编写SQL
五、最佳实践建议
- 简单 CRUD 用 MP 自带方法
- 复杂查询 用 Wrapper + 自定义 SQL
- 字段安全 用 Lambda 表达式
- 插件优先 使用 MP 官方提供(分页、乐观锁、逻辑删除)
- 定期升级版本,关注 release notes