介绍
当前项目的代码生成器是基于 MyBatisPlus(Version:3.5.12)的代码生成器,使用 velocity 模板生成器,在支持MybatisPlus的代码生成变量的基础上新增更多环境变量,如:表主键,主键类型,主键Java类型,主键TypeScript类型,大驼峰表名、属性名、小驼峰表名、属性名,实体名称等超多自定义变量
使用方法
目录文件:src/test/java/cn/anlucky/admin
@SpringBootTest
class GenerationCodeServiceImplTest {
@Autowired
private GenerationCodeService generationCodeService;
/**
* 预览代码
*/
@Test
void previewCode() {
List<String> list = new ArrayList<>();
list.add("sys_users");
Map<String, String> map = generationCodeService.previewCode("cn.anlucky.admin", "system", list);
System.out.println("map = " + map.get("constants"));
}
/**
* 生成代码文件
*/
@Test
void generateCode() {
List<String> list = new ArrayList<>();
list.add("sys_users");
list.add("sys_roles");
list.add("sys_user_roles");
list.add("sys_menus");
list.add("sys_roles_menus");
list.add("sys_oper_log");
list.add("sys_login_log");
list.add("sys_files");
list.add("sys_business_files");
list.add("sys_dict");
list.add("sys_dict_item");
generationCodeService.generateCode("cn.anlucky.admin", "system", list);
}
}
重要
代码生成所使用的数据库是 application.yml 配置激活环境的数据库
重要
因在打包时会执行Test,所以在打包时可以将代码生成的Test注释掉
文件位置
代码生成的文件所在位置的配置 src/main/java/cn/anlucky/admin/system/gen/bean/GenerationPoBean.java
// 设置文件输出路径
generationPo.setOutputDir("D:/Generator/lucky");
模板变量
// project相关
project1.packageName cn.anlucky.admin.system // 完整包名 包路径 + 模块名称
project1.moduleName system // 模块名称
project1.entityName SysUsers // Java实体名称 SysUsers(根据配置改变)
project1.mapperName SysUsersMapper // JAVA Mapper SysUsersMapper(根据配置改变)
project1.mapperXmlName SysUsersMapper // JAVA Mapper XML SysUsersMapperXML(根据配置改变)
project1.serviceName SysUsersService // JAVA Service SysUsersService(根据配置改变)
project1.serviceImplName SysUsersServiceImp // JAVA ServiceImpl SysUsersServiceImpl(根据配置改变)
project1.controllerName SysUsersController // JAVA Controller SysUsersController(根据配置改变)
// table相关
table1.tableName sys_users // 表名称 sys_users
table1.comment 用户信息 // 表注释 用户信息表
table1.tableKey id // 主键字段名 id
table1.tableKeyComment 用户ID // 主键注释 用户Id
table1.tableKeyType LONG // 全大写的JAVA类型 如:String -> STRING Long -> LONG
// java相关
java1.tableName SysUsers // 大驼峰表名 下划线根据代码生成器的配置而改变默认配置已转换 SysUsers
java1.tableNamePath sysUsers // 小驼峰表名 下划线根据代码生成器的配置而改变默认配置已转换 sysUsers
java1.tableNameSmall sysusers // 全小写表名 下划线根据代码生成器的配置而改变默认配置已转换 sysusers
java1.tableKey Id // 主键大驼峰 Id
java1.tableKeyPath id // 主键小驼峰 id
java1.tableKeyType Long // 大驼峰的JAVA类型 如:String -> String
java1.tableKeyTsType number // 主键ts类型
// genTableField 相关 字段注释可参考 类 GenTableField.java
field1.columnName id
field1.columnComment 用户ID
field1.javaColumnName Id
field1.javaColumnNamePath id
field1.isTableKey true
field1.isLogicDeleteField false
field1.isFill false
field1.fill
field1.javaType Long
field1.tsType number
field1.isRequired true
field1.JdbcType BIGINT
field1.defaultValue
field1.columnMaxLength 19
自定义模板变量
重要
若您理解不了代码生成器的原理,请勿修改代码生成器的代码
- 配置文件位置
cn.anlucky.admin.system.gen.config.GenerationConfig
- 方法位置
getInjectionConfigBuilder()
- 代码位置
行: 176 后面 使用object.put(key,value); 添加要自定义的变量
- 若您不慎修改了代码,可使用下面恢复默认代码
/**
* 获取注入配置构建器
*
* @param tableNames 数据库表名称
* @return InjectionConfig.Builder
*/
private InjectionConfig.Builder getInjectionConfigBuilder(List<String> tableNames) {
return new InjectionConfig.Builder()
.customFile(generationPo.getOtherTemplates())
.customMap(generationPo.getOtherTemplateParams())
.beforeOutputFile((tableInfo, objectMap) -> {
// 可以在这里添加自定义逻辑,如修改 objectMap 中的配置
// 表格
HashMap<String, Object> table = new HashMap<>();
// 表格java
HashMap<String, Object> java = new HashMap<>();
// 项目数据
HashMap<String, Object> project = new HashMap<>();
// 包名 parent + moduleName
project.put("packageName", tableInfo.getPackageConfig().getParent());
// 模块名
project.put("moduleName",tableInfo.getPackageConfig().getModuleName());
// 实体名
project.put("entityName",tableInfo.getEntityName());
project.put("mapperName",tableInfo.getMapperName());
project.put("mapperXmlName",tableInfo.getXmlName());
project.put("serviceName",tableInfo.getServiceName());
project.put("serviceImplName",tableInfo.getServiceImplName());
project.put("controllerName",tableInfo.getControllerName());
// 表注释
table.put("tableName",tableInfo.getName());
table.put("comment",tableInfo.getComment());
// 数据库表名称
java.put("tableNameSmall", StringUtils.toRootLowerCase(tableInfo.getEntityName()));
java.put("tableName",tableInfo.getEntityName());
java.put("tableNamePath", tableInfo.getEntityPath());
List<GenTableField> genTableFields = new ArrayList<>();
tableInfo.getFields().forEach(field -> {
GenTableField genTableField = new GenTableField();
genTableField.setColumnName(field.getColumnName());
genTableField.setColumnComment(field.getComment());
genTableField.setJavaColumnName(field.getCapitalName());
genTableField.setJavaColumnNamePath(field.getPropertyName());
genTableField.setIsTableKey(field.isKeyFlag());
genTableField.setIsLogicDeleteField(field.isLogicDeleteField());
genTableField.setIsFill(StringUtils.isNotBlank(field.getFill()));
genTableField.setFill(StringUtils.isNotBlank(field.getFill())?field.getFill():"");
genTableField.setJavaType(field.getPropertyType());
genTableField.setTsType(GenUtils.ConvertTsType(field.getPropertyType())); // 传入Java Type set方法中自动转换为Ts类型
genTableField.setIsRequired(!field.getMetaInfo().isNullable());
String defaultValue = field.getMetaInfo().getDefaultValue();
genTableField.setDefaultValue(StringUtils.isNotBlank(defaultValue)?defaultValue:"");
genTableField.setColumnMaxLength(field.getMetaInfo().getLength());
genTableField.setJdbcType(field.getMetaInfo().getJdbcType());
genTableFields.add(genTableField);
// 获得主键
if(field.isKeyFlag()){
table.put("tableKey",field.getColumnName());
table.put("tableKeyComment",field.getComment());
table.put("tableKeyType",field.getColumnType()); // 全大写
java.put("tableKey",field.getCapitalName());
java.put("tableKeyPath",field.getPropertyName());
java.put("tableKeyType",field.getPropertyType()); // 首字母大写
java.put("tableKeyTsType", GenUtils.ConvertTsType(field.getPropertyType()));
}
});
objectMap.put("genTableFields1",genTableFields);
objectMap.put("project1",project);
objectMap.put("table1",table);
objectMap.put("java1",java);
});
}
- 代码解释
5.1 由beforeOutputFile中可知是一个循环,tableInfo是当前生成数据库表的一个信息实体,ObjectMap是自定义变量的map映射
5.2 由此,可以得出,若想要增加一个自定义变量,只需在objectMap中添加即可
5.3 若满足不了您的定制需求,可自行修改代码
使用模板变量
以 project1.packageName 为例子,在VM模板文件中使用 ${project1.packageName} 即可
