MyBatis-Plus实用指南:玩转自动化与高效CRUD
MyBatis-Plus(简称 MP)是 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。它提供了丰富的功能,如代码生成器、通用 CRUD、分页、乐观锁、逻辑删除等,极大地提升了开发体验。
目录
- 快速开始
- 常用注解
- @TableName
- @TableId
- @TableField
- @TableLogic
- @Version
- 分页查询
- 条件查询
- 代码生成器
- 参考资料
快速开始
1. 添加依赖
在 pom.xml
中引入 MyBatis-Plus 依赖:
<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.2</version>
</dependency>
2. 配置数据库连接
在 application.yml
中配置数据库信息:
spring:datasource:username: rootpassword: 123456url: jdbc:mysql://localhost:3306/test
3. 创建 Mapper
@Mapper
public interface UserMapper extends BaseMapper<User> {
}
4. 使用示例
@SpringBootTest
public class UserMapperTest {@Autowiredprivate UserMapper userMapper;@Testpublic void selectTest(){User user = userMapper.selectById(3);System.out.println(user);}
}
常用注解
@TableName
用于指定实体类对应的数据库表名。
@TableName("user")
public class User { ... }
@TableId
用于指定主键字段及主键策略。
可选值 | 描述 |
---|---|
AUTO | 数据库主键自增 |
NONE | 未显式设置主键类型(跟随全局,全局默认≈INPUT) |
INPUT | 插入前需手动调用 setId() 赋值 |
ASSIGN_ID | 由 MyBatis-Plus 分配雪花 ID(Long/Integer/String) |
ASSIGN_UUID | 由 MyBatis-Plus 分配 UUID(String) |
@TableId(type = IdType.AUTO)
private Long id;
@TableField
用于指定字段与数据库列的映射关系。
属性名 | 默认值 | 描述 |
---|---|---|
value | “” | 指定数据库列名(与实体字段名不一致时使用) |
exist | true | 是否为数据库表字段(false 表示实体字段不对应列) |
select | true | 查询时是否包含该字段(false 表示排除在 select 外) |
@TableField(value = "user_name")
private String name;
@TableLogic
用于实现逻辑删除,即数据不会被物理删除,而是通过标记字段(如 deleted
)来表示删除状态。
配置方式一:注解 + 配置
-
配置全局逻辑删除值
mybatis-plus:global-config:db-config:logic-delete-value: 1 # 已删除logic-not-delete-value: 0 # 未删除
-
实体类字段加注解
@TableLogic private String deleted;
配置方式二:全局字段配置(3.4.0+)
只需在配置文件中指定逻辑删除字段名,无需在实体类加注解:
mybatis-plus:global-config:db-config:logic-delete-field: deleted # 全局逻辑删除字段名logic-delete-value: 1logic-not-delete-value: 0
注意: 需 MyBatis-Plus 3.4.0 及以上版本。
工作原理
- 删除操作:
deleteById
等方法会将deleted
字段设为 1,而不是物理删除。 - 查询操作:自动加上
deleted = 0
条件,只查未删除数据。
@Version
用于实现乐观锁,防止并发更新时数据被“脏覆盖”。
使用方法
-
数据库表需有
version
字段,初始值为 1。 -
实体类字段加
@Version
注解:@Version private Integer version;
-
更新时,MyBatis-Plus 会自动在 SQL 中带上
version
条件,并在更新成功后将version
+1。
工作原理
-
更新 SQL 示例:
UPDATE user SET name=?, version=version+1 WHERE id=? AND version=?
-
如果
version
不一致,更新条数为 0,表示更新失败。
分页查询
1. 配置分页插件
@Configuration
public class MpConfig {@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));return interceptor;}
}
2. 使用分页
void getPage(){Page<User> page = new Page<>(1,5); // 第1页,展示5行userMapper.selectPage(page, null);List<User> records = page.getRecords();
}
条件查询
1. QueryWrapper 用法
// 查询年龄<25,姓赵,按id降序
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.lt("age",25).likeRight("name","赵").orderByDesc("id");
List<User> users = userMapper.selectList(wrapper);
2. LambdaQueryWrapper 推荐用法
LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
wrapper.lt(User::getAge,25).likeRight(User::getName,"赵").orderByDesc(User::getId);
List<User> users = userMapper.selectList(wrapper);
推荐使用 Lambda 表达式,避免字段名硬编码,重构更安全。
代码生成器
MyBatis-Plus 提供了代码生成器,可以根据数据库表结构自动生成实体类、Mapper、Service、Controller 等代码,大大提升开发效率。
1. 添加依赖
<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-generator</artifactId><version>3.5.5</version>
</dependency>
<dependency><groupId>org.apache.velocity</groupId><artifactId>velocity-engine-core</artifactId><version>2.3</version>
</dependency>
2. 编写生成器代码
AutoGenerator mpg = new AutoGenerator();
// 配置数据源、包名、策略等
// mpg.setDataSource(...);
// mpg.setPackageInfo(...);
// mpg.setStrategy(...);
// mpg.setTemplateEngine(new VelocityTemplateEngine());
mpg.execute();
详细用法见 官方文档
参考资料
- MyBatis-Plus 官方文档
MyBatis-Plus 让 MyBatis 更加易用和高效,掌握其常用注解和功能,可以大幅提升开发效率。建议结合官方文档和视频教程深入学习与实践!