1. MybatisPlus代码生成器项目概述
在Java企业级开发中,持久层框架的使用一直是项目效率的关键点。MybatisPlus作为Mybatis的增强工具,其代码生成器模块能够显著减少重复的CRUD代码编写工作。我最近在多个电商和ERP系统中深度使用了这个工具,发现它不仅能生成标准的Mapper和Entity,还能根据配置生成Controller、Service等全套模板代码。
这个生成器特别适合以下场景:
- 新项目快速搭建基础架构
- 老项目引入MybatisPlus进行改造
- 需要批量生成大量相似结构的数据表对应代码
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 核心功能与实现原理
2.1 代码生成流程解析
典型的代码生成过程包含这几个关键步骤:
- 数据库连接配置
- 生成策略设置
- 包路径定义
- 模板引擎渲染
java复制// 典型配置示例
AutoGenerator generator = new AutoGenerator();
generator.setDataSource(dataSourceConfig);
generator.setGlobalConfig(globalConfig);
generator.setPackageInfo(packageConfig);
generator.setStrategy(strategyConfig);
generator.setTemplate(templateConfig);
generator.execute();
2.2 核心配置项详解
2.2.1 数据源配置
必须准确配置数据库连接信息,这是生成器工作的基础:
java复制DataSourceConfig dataSource = new DataSourceConfig();
dataSource.setUrl("jdbc:mysql://localhost:3306/test");
dataSource.setDriverName("com.mysql.jdbc.Driver");
dataSource.setUsername("root");
dataSource.setPassword("123456");
注意:生产环境建议使用加密方式处理密码,不要明文配置
2.2.2 全局配置
控制生成文件的存放位置和基础信息:
java复制GlobalConfig globalConfig = new GlobalConfig();
globalConfig.setOutputDir(System.getProperty("user.dir") + "/src/main/java");
globalConfig.setAuthor("Developer");
globalConfig.setOpen(false); // 生成后不打开文件夹
2.2.3 包配置
定义生成的Java包结构:
java复制PackageConfig packageConfig = new PackageConfig();
packageConfig.setParent("com.example");
packageConfig.setEntity("model");
packageConfig.setMapper("dao");
3. 高级定制技巧
3.1 自定义模板开发
MybatisPlus默认使用Velocity模板引擎,我们可以覆盖默认模板:
- 在resources下创建templates目录
- 复制需要修改的模板文件(如entity.java.vm)
- 按照业务需求修改模板内容
velocity复制## entity.java.vm示例
#if(${table.convert})
@TableName("${table.name}")
#end
public class ${entity} {
#foreach($field in ${table.fields})
private ${field.propertyType} ${field.propertyName};
#end
}
3.2 字段类型映射配置
对于特殊的数据库字段类型,可以自定义类型映射:
java复制StrategyConfig strategy = new StrategyConfig();
strategy.setColumnNaming(NamingStrategy.underline_to_camel);
strategy.setEntityLombokModel(true);
// 自定义类型映射
Map<String, String> typeMap = new HashMap<>();
typeMap.put("tinyint", "Integer");
typeMap.put("bit", "Boolean");
strategy.setTypeConvert(typeMap);
4. 实战问题排查
4.1 常见错误解决方案
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
| 生成代码字段不全 | 数据库用户权限不足 | 授予SELECT权限 |
| 生成的实体类没有注解 | 未启用Lombok配置 | setEntityLombokModel(true) |
| 表名映射错误 | 表名有特殊字符 | 使用@TableName显式指定 |
4.2 性能优化建议
-
批量生成时:
- 先获取所有表结构信息再统一生成
- 避免频繁创建销毁生成器实例
-
模板优化:
- 移除不需要的getter/setter
- 简化实体类注释
-
使用缓存:
java复制// 启用缓存提升重复生成效率 globalConfig.setEnableCache(true);
5. 扩展应用场景
5.1 多数据源支持
对于需要从多个数据库生成代码的场景:
java复制// 主库生成器
AutoGenerator mainGenerator = createGenerator(mainDataSource);
mainGenerator.execute();
// 从库生成器
AutoGenerator slaveGenerator = createGenerator(slaveDataSource);
slaveGenerator.setPackageConfig(adjustPackage(packageConfig));
slaveGenerator.execute();
5.2 与Spring Boot集成
在Spring Boot项目中更简便的配置方式:
yaml复制# application.yml
mybatis-plus:
global-config:
banner: false
generator:
dataSource:
url: jdbc:mysql://localhost:3306/test
username: root
password: 123456
strategy:
naming: underline_to_camel
column-naming: underline_to_camel
配合@ConditionalOnProperty可以实现按需生成。
6. 最佳实践建议
经过多个项目的实践验证,我总结出这些经验:
-
版本控制:
- 生成的代码要及时提交到版本库
- 但模板文件应该单独管理
-
目录结构:
code复制src/main/java ├── generated │ ├── controller │ ├── entity │ └── mapper └── manual ├── service └── impl -
增量生成:
- 使用setInclude()指定需要生成的表
- 避免全量生成覆盖手动修改的代码
-
模板定制建议:
- 添加Swagger注解
- 统一异常处理
- 增加日志输出
在实际项目中,我通常会先使用生成器创建基础代码,然后在这些代码基础上进行业务逻辑开发。对于字段变更频繁的早期项目,可以配置成每次启动时自动比对生成,但要注意做好变更管理。
