1. MyBatis-Plus代码生成器核心价值解析
从事Java后端开发这些年,我深刻体会到重复编写基础CRUD代码的时间消耗有多大。直到遇见MyBatis-Plus的代码生成器,开发效率直接提升300%。这个工具能根据数据库表结构,自动生成Entity、Mapper、Service、Controller等全套基础代码,把我们从重复劳动中彻底解放出来。
以用户管理系统为例,手动编写20张表的增删改查代码至少需要3天,而使用代码生成器只需配置好数据源,5分钟就能完成所有基础代码生成。更重要的是,生成的代码完全遵循MyBatis-Plus的最佳实践,包含分页查询、逻辑删除、乐观锁等企业级功能实现。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环境准备与基础配置
2.1 依赖引入关键点
在Spring Boot项目中引入生成器依赖时,需要特别注意版本兼容性。最新稳定版组合是:
xml复制<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.5.3.1</version>
</dependency>
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.31</version>
</dependency>
警告:不要直接使用3.5.4版本,该版本存在模板加载异常问题。我曾在生产环境踩过这个坑,导致生成代码时抛出FileNotFoundException。
2.2 数据库连接配置实战
配置数据源时推荐使用HikariCP连接池,这是经过千万级并发验证的方案:
java复制DataSourceConfig.Builder dsBuilder = new DataSourceConfig.Builder(
"jdbc:mysql://localhost:3306/your_db?useSSL=false&serverTimezone=Asia/Shanghai",
"root",
"password"
).typeConvert(new MySqlTypeConvert());
这里有个隐藏技巧:添加typeConvert配置后,生成器会自动将数据库的datetime类型转为LocalDateTime,而不是过时的Date类型。
3. 深度定制化生成策略
3.1 表字段映射高级配置
通过策略配置可以精细控制每个字段的生成规则:
java复制StrategyConfig strategy = new StrategyConfig.Builder()
.addInclude("sys_user","sys_role") // 只生成指定表
.entityBuilder()
.naming(NamingStrategy.underline_to_camel)
.columnNaming(NamingStrategy.underline_to_camel)
.enableLombok()
.logicDeleteColumnName("is_deleted") // 逻辑删除字段
.versionColumnName("version") // 乐观锁字段
.controllerBuilder()
.enableRestStyle() // 生成@RestController
.build();
特别说明:enableLombok()会让实体类使用@Data注解,这意味着你需要在IDE安装Lombok插件,否则编译会报错。
3.2 自定义模板引擎实战
默认的Velocity模板可能不满足需求,改用Freemarker更灵活:
java复制TemplateConfig templateConfig = new TemplateConfig.Builder()
.entity("/templates/entity.java")
.service("/templates/service.java")
.serviceImpl("/templates/serviceImpl.java")
.mapper("/templates/mapper.java")
.xml("/templates/mapper.xml")
.controller("/templates/controller.java")
.build();
在resources目录创建templates文件夹,放入自定义模板。我曾用这个方法为所有Service添加了审计日志注解,团队效率提升明显。
4. 企业级应用场景解析
4.1 多租户系统代码生成
对于SaaS系统,需要处理tenant_id字段:
java复制strategy.entityBuilder()
.addSuperEntityColumns("tenant_id") // 基础字段
.addIgnoreColumns("tenant_id"); // 不生成到实体类
// 在自定义模板中处理SQL过滤
<#if table.fieldNames?contains("tenant_id")>
AND tenant_id = ${tenantId}
</#if>
4.2 字段加密特殊处理
遇到手机号等敏感字段时,可以自动添加加密注解:
java复制public class EncryptionTypeConvert implements ITypeConvert {
@Override
public ColumnType processTypeConvert(...){
if("mobile".equals(fieldName)){
return ColumnType.OBJECT;
}
// 其他类型转换
}
}
然后在实体类模板中添加:
java复制<#if field.propertyName?ends_with("Mobile")>
@FieldEncrypt(algorithm = "AES")
</#if>
5. 生成代码优化技巧
5.1 避免NPE的Wrapper用法
生成的QueryWrapper可以直接链式调用:
java复制// 传统写法需要判空
if(StringUtils.isNotBlank(username)){
query.eq("username", username);
}
// 优化后写法
query.eq(StringUtils.isNotBlank(username), "username", username)
.ge(createTime != null, "create_time", createTime);
5.2 批量操作性能优化
生成的ServiceImpl默认带有批量方法:
java复制// 批量插入优化
userService.saveBatch(users, 1000); // 每1000条提交一次
// 批量更新陷阱
users.forEach(user -> {
userService.updateById(user); // 反例:产生N条SQL
});
// 正解
userService.updateBatchById(users);
6. 常见问题排查指南
6.1 字段为null更新失败
这是被问最多的问题,解决方案:
java复制// 全局配置
mybatis-plus:
global-config:
db-config:
logic-not-delete-value: 0
logic-delete-value: 1
insert-strategy: not_empty
update-strategy: ignored // 关键配置
或者在字段上单独设置:
java复制@TableField(updateStrategy = FieldStrategy.IGNORED)
private String address;
6.2 分页查询失效分析
确保以下配置齐全:
java复制@Configuration
public class MybatisPlusConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
return interceptor;
}
}
Controller层必须使用Page对象接收:
java复制@GetMapping("/list")
public R<Page<UserVO>> list(Page<User> page, UserQuery query){
return R.success(userService.pageList(page, query));
}
7. 高级扩展方案
7.1 自定义注释生成
通过重写INameConvert接口实现:
java复制public class CustomCommentGenerator implements ICommentGenerator {
@Override
public void addEntityComment(TableInfo tableInfo) {
tableInfo.getImportPackages().add("io.swagger.annotations.ApiModel");
tableInfo.getEntityComment().append("@ApiModel(\""+tableInfo.getComment()+"\")");
}
}
7.2 多数据源生成方案
动态切换数据源生成不同库的代码:
java复制DynamicDataSourceProvider provider = new DynamicDataSourceProvider();
AutoGenerator generator = new AutoGenerator();
// 切换数据源
provider.setDataSource("master", masterConfig);
generator.execute();
provider.setDataSource("slave", slaveConfig);
generator.execute();
这套方案在我司的微服务架构中,成功实现了20+服务的统一代码生成。
