m y batis-plus高级用法
时间: 2025-06-10 13:02:17 浏览: 35
<think>嗯,用户想了解MyBatis-Plus的高级用法,我需要整理一下相关的内容。首先,我应该回顾一下MyBatis-Plus的基础知识,确保自己理解正确。MyBatis-Plus是在MyBatis的基础上进行增强的工具,提供了很多便捷的功能,比如通用的CRUD操作、分页插件、代码生成器等。但用户问的是高级用法,所以需要深入一些。
首先想到的是条件构造器QueryWrapper和LambdaQueryWrapper,这是MyBatis-Plus中用于构建复杂查询条件的工具。特别是LambdaQueryWrapper,它通过Lambda表达式引用实体类的属性,避免了硬编码字段名,提高了代码的可维护性。这部分应该作为高级用法之一来介绍。
接下来是ActiveRecord模式,允许实体类继承Model类,从而可以直接通过实体类进行CRUD操作,无需通过Mapper接口。这种模式简化了代码结构,适合简单的数据操作场景,但可能不适合复杂的业务逻辑,需要权衡使用。
然后,分页和排序功能。MyBatis-Plus的分页插件非常方便,支持物理分页,并且可以结合条件构造器进行动态排序。这里需要说明如何配置分页插件,以及如何在Service层使用分页方法。
逻辑删除也是常见的高级功能,通过在表中添加一个状态字段(如is_deleted),配置逻辑删除的标识值,MyBatis-Plus会自动在删除操作时更新该字段,而不是物理删除数据。同时查询时会自动过滤已标记删除的数据。需要提到配置方式以及使用时的注意事项。
自动填充字段功能,比如创建时间和更新时间。可以通过实现MetaObjectHandler接口,在插入和更新操作时自动填充指定字段的值。这里需要说明如何定义处理类,并在实体类中使用注解标记需要填充的字段。
枚举类型处理,MyBatis-Plus支持将Java枚举类型与数据库字段进行映射,可以通过注解配置枚举的存储方式,比如按名称或按序号存储,或者自定义转换器。这有助于保持代码的枚举类型与数据库的一致性。
多租户数据隔离是一个企业级应用中常见的需求,MyBatis-Plus提供了多租户插件,通过配置租户ID的字段和值,自动在SQL中添加租户条件。需要说明如何配置多租户拦截器,并处理相关的业务逻辑。
SQL注入器用于扩展自定义的全局方法,比如实现批量插入、更新等操作。用户可以编写自己的SQL方法,并注入到MyBatis-Plus中,增强框架的功能。这部分需要简要介绍如何实现自定义的SQL注入器。
性能分析插件可以输出SQL语句及其执行时间,帮助开发阶段进行性能优化。但要注意在生产环境中禁用,以避免性能开销和安全问题。
乐观锁插件通过版本号机制实现并发控制,防止数据更新冲突。需要说明如何在实体类中添加版本字段,并配置乐观锁插件,以及在更新操作时的使用方式。
动态表名支持,适用于分表场景,根据请求参数动态替换SQL中的表名。可以通过实现TableNameHandler接口来自定义表名解析逻辑。
还有代码生成器,虽然可能不算高级用法,但能快速生成Entity、Mapper、Service等代码,提升开发效率。可以简要提到如何使用代码生成器进行配置和生成。
需要组织这些内容,按照逻辑顺序排列,确保每个功能点都有简要说明、使用方法和示例代码。同时要注意使用中文,避免术语错误,并且代码示例要正确。可能需要检查是否有遗漏的重要高级功能,比如事务管理、多数据源支持等,但根据MyBatis-Plus的文档,上述内容已经覆盖了大部分高级用法。
最后,总结部分需要强调MyBatis-Plus在简化开发、提升效率方面的优势,同时提醒用户根据实际项目需求选择合适的功能,避免过度设计。确保回答结构清晰,层次分明,帮助用户理解和应用这些高级功能。</think>MyBatis-Plus 是基于 MyBatis 的增强工具,在简化开发的同时提供了许多高级特性。以下是一些核心高级用法的详细介绍:
---
### 一、条件构造器(Wrapper)
**作用**:动态构建复杂 SQL 查询条件
#### 1. QueryWrapper
```java
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.select("id", "name", "age")
.like("name", "张")
.between("age", 20, 30)
.orderByDesc("create_time");
List<User> users = userMapper.selectList(wrapper);
```
#### 2. LambdaQueryWrapper(推荐)
```java
LambdaQueryWrapper<User> lambdaWrapper = new LambdaQueryWrapper<>();
lambdaWrapper.select(User::getId, User::getName)
.like(User::getName, "王")
.gt(User::getAge, 25);
List<User> users = userMapper.selectList(lambdaWrapper);
```
---
### 二、ActiveRecord 模式
**特点**:实体类直接操作数据库,无需 Mapper
```java
// 实体类需继承 Model<User>
User user = new User();
user.setName("李四");
user.insert(); // 直接插入
User result = user.selectById(1L); // 直接查询
```
---
### 三、分页与排序
#### 1. 配置分页插件
```java
@Configuration
public class MybatisPlusConfig {
@Bean
public MybatisPlusInterceptor paginationInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
return interceptor;
}
}
```
#### 2. 使用分页
```java
Page<User> page = new Page<>(1, 10); // 当前页,每页数量
LambdaQueryWrapper<User> wrapper = ... // 条件构造
Page<User> result = userMapper.selectPage(page, wrapper);
List<User> records = result.getRecords(); // 获取数据
```
---
### 四、逻辑删除
#### 1. 配置(application.yml)
```yaml
mybatis-plus:
global-config:
db-config:
logic-delete-field: isDeleted # 实体字段名
logic-delete-value: 1 # 删除标识值
logic-not-delete-value: 0 # 未删除标识值
```
#### 2. 自动过滤已删除数据
所有查询操作会自动添加 `WHERE is_deleted = 0`
---
### 五、字段自动填充
#### 1. 定义填充处理器
```java
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, LocalDateTime.now());
}
@Override
public void updateFill(MetaObject metaObject) {
this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now());
}
}
```
#### 2. 实体类注解
```java
public class User {
@TableField(fill = FieldFill.INSERT)
private LocalDateTime createTime;
@TableField(fill = FieldFill.UPDATE)
private LocalDateTime updateTime;
}
```
---
### 六、枚举类型处理
```java
public enum Gender {
MALE(1), FEMALE(2);
@EnumValue // 标记存储到数据库的值
private final int code;
}
// 实体类字段
private Gender gender;
```
---
### 七、多租户支持
#### 1. 配置拦截器
```java
@Bean
public MybatisPlusInterceptor tenantInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new TenantLineInnerInterceptor(new TenantLineHandler() {
@Override
public String getTenantIdColumn() {
return "tenant_id"; // 租户字段名
}
@Override
public Expression getTenantId() {
return new StringValue("当前租户ID"); // 动态获取租户ID
}
}));
return interceptor;
}
```
---
### 八、SQL 注入器(扩展全局方法)
```java
public class BatchInsertInjector extends DefaultSqlInjector {
@Override
public List<AbstractMethod> getMethodList(Class<?> mapperClass) {
List<AbstractMethod> methods = super.getMethodList(mapperClass);
methods.add(new BatchInsert()); // 自定义批量插入方法
return methods;
}
}
```
---
### 九、性能分析插件(开发环境使用)
```java
@Bean
public PerformanceInterceptor performanceInterceptor() {
PerformanceInterceptor interceptor = new PerformanceInterceptor();
interceptor.setMaxTime(1000); // SQL执行最大时长(ms)
interceptor.setFormat(true); // 格式化SQL输出
return interceptor;
}
```
---
### 十、乐观锁插件
#### 1. 配置
```java
@Bean
public MybatisPlusInterceptor optimisticLockerInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
return interceptor;
}
```
#### 2. 实体类
```java
@Version
private Integer version; // 必须使用包装类型
```
---
### 总结
MyBatis-Plus 的高级功能可显著提升开发效率,但需注意:
- 根据实际场景选择合适功能
- 复杂SQL建议使用XML方式
- 生产环境关闭性能分析插件
- 合理设计逻辑删除与多租户方案
官方文档地址:https://baomidou.com/ (建议作为主要参考)
阅读全文
相关推荐


















