1. MyBatis-Plus 核心功能全景解析
作为国内Java开发者最常用的ORM框架之一,MyBatis-Plus在原生MyBatis基础上进行了全方位增强。我在多个企业级项目中深度使用该框架后,发现其核心价值主要体现在六个方面:代码生成、条件构造、分页插件、性能分析、全局拦截和枚举处理。这些功能并非孤立存在,而是形成了完整的开发闭环。
重要提示:MyBatis-Plus 3.5.0+版本对Lambda表达式查询进行了重大优化,建议新项目直接采用3.5.3以上版本
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 代码生成器:自动化CRUD实践
2.1 标准代码生成配置
通过AutoGenerator类可实现DAO层全自动生成。典型配置如下:
java复制// 数据源配置
DataSourceConfig dataSourceConfig = new DataSourceConfig.Builder(
"jdbc:mysql://localhost:3306/demo",
"root",
"123456")
.build();
// 全局配置
GlobalConfig globalConfig = new GlobalConfig.Builder()
.outputDir(System.getProperty("user.dir") + "/src/main/java")
.author("dev")
.openDir(false)
.build();
// 包配置
PackageConfig packageConfig = new PackageConfig.Builder()
.parent("com.example")
.moduleName("system")
.entity("model")
.mapper("dao")
.build();
// 策略配置
StrategyConfig strategyConfig = new StrategyConfig.Builder()
.addInclude("user", "role") // 指定生成表
.entityBuilder()
.enableLombok()
.enableChainModel()
.build();
new AutoGenerator(dataSourceConfig)
.global(globalConfig)
.packageInfo(packageConfig)
.strategy(strategyConfig)
.execute();
2.2 生成策略深度定制
通过StrategyConfig可进行精细控制:
- 字段命名策略:
columnNaming(NamingStrategy.underline_to_camel) - 逻辑删除字段:
logicDeleteColumnName("deleted") - 版本控制字段:
versionColumnName("version") - 表前缀处理:
addTablePrefix("t_")
踩坑记录:当数据库字段使用SQL关键字时(如order、desc),务必使用
addFieldPrefix("")`添加转义符
3. 条件构造器:动态SQL新范式
3.1 QueryWrapper基础用法
java复制QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.select("id", "name", "age")
.gt("age", 18)
.likeRight("name", "张")
.orderByDesc("create_time");
3.2 Lambda表达式进阶
3.x版本推荐使用LambdaQueryWrapper:
java复制LambdaQueryWrapper<User> lambdaWrapper = Wrappers.lambdaQuery();
lambdaWrapper.select(User::getId, User::getName)
.ge(User::getAge, 18)
.nested(w -> w.lt(User::getScore, 60).or().gt(User::getScore, 90)));
3.3 复杂条件构建技巧
- 嵌套查询:
.nested(w -> w.eq(...)) - 条件分组:
.and(w -> w.between(...)) - 动态条件:
java复制wrapper.apply(params.containsKey("startTime"),
"date_format(create_time,'%Y-%m-%d') >= {0}",
params.get("startTime"));
4. 分页插件:高性能分页方案
4.1 基础配置
java复制@Configuration
public class MybatisPlusConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
return interceptor;
}
}
4.2 分页查询实践
java复制Page<User> page = new Page<>(1, 10);
page.setSearchCount(false); // 禁用count查询
LambdaQueryWrapper<User> wrapper = ...;
userMapper.selectPage(page, wrapper);
// 自定义SQL分页
@Select("select * from user ${ew.customSqlSegment}")
IPage<User> selectUserPage(IPage<User> page, @Param(Constants.WRAPPER) Wrapper<User> wrapper);
4.3 性能优化要点
- 大数据量表禁用
searchCount - 使用
optimizeJoin优化联表查询 - 对
order by字段建立索引 - 分页参数合理化处理(maxLimit配置)
5. 全局拦截与性能分析
5.1 乐观锁实现
java复制@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
return interceptor;
}
// 实体类字段添加@Version
public class User {
@Version
private Integer version;
}
5.2 SQL执行分析
java复制@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new BlockAttackInnerInterceptor()); // 防全表更新
interceptor.addInnerInterceptor(new IllegalSQLInnerInterceptor()); // SQL性能分析
return interceptor;
}
6. 枚举处理器与类型转换
6.1 枚举映射方案
java复制@Getter
public enum GenderEnum {
MALE(1, "男"),
FEMALE(2, "女");
@EnumValue // 标记数据库存储值
private final int code;
private final String desc;
// 构造方法...
}
// 配置扫描
@Bean
public MybatisPlusPropertiesCustomizer mybatisPlusPropertiesCustomizer() {
return properties -> properties.getConfiguration()
.setDefaultEnumTypeHandler(MybatisEnumTypeHandler.class);
}
6.2 JSON字段处理
java复制@TableField(typeHandler = FastjsonTypeHandler.class)
private List<String> tags;
7. 扩展功能实战技巧
7.1 多租户实现
java复制public class TenantInterceptor implements InnerInterceptor {
@Override
public void beforeQuery(Executor executor, MappedStatement ms,
Object parameter, RowBounds rowBounds, ResultHandler resultHandler,
BoundSql boundSql) {
// 添加租户条件
}
}
7.2 数据权限控制
通过重写AbstractSqlParserHandler实现:
java复制@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new DataPermissionInterceptor(dataPermissionHandler));
return interceptor;
}
7.3 逻辑删除全局配置
yaml复制mybatis-plus:
global-config:
db-config:
logic-delete-field: deleted # 全局逻辑删除字段
logic-not-delete-value: 0 # 未删除值
logic-delete-value: 1 # 删除值
在复杂查询场景中,我发现合理组合这些功能可以显著提升开发效率。比如使用Lambda表达式构建动态查询条件,配合分页插件实现安全分页,再通过性能分析插件监控SQL执行效率,最终形成完整的数据访问层最佳实践。
