【若依框架】定制化代码生成:集成Lombok、Swagger与Mybatis-Plus实战指南

张开发
2026/4/22 18:32:46 15 分钟阅读

分享文章

【若依框架】定制化代码生成:集成Lombok、Swagger与Mybatis-Plus实战指南
1. 为什么需要定制若依框架的代码生成模板第一次接触若依框架时我就被它强大的代码生成功能惊艳到了。只需要简单配置数据库表结构就能一键生成前后端基础代码大大提升了开发效率。但用了一段时间后发现默认生成的代码有些地方不够现代化比如实体类还是传统的getter/setter模式缺少Swagger接口文档支持数据库操作也没有利用Mybatis-Plus的便利特性。这就像买了一辆性能不错的汽车但内饰还是老式的机械仪表盘。为了让开发体验更舒适我决定对代码生成模板进行深度改造。经过几个项目的实践验证这套改造方案确实让开发效率提升了至少30%特别是团队协作时接口文档自动生成的功能让前后端对接变得异常顺畅。2. 环境准备与基础配置2.1 项目结构分析若依框架的代码生成功能主要在ruoyi-generator模块中实现。打开这个模块你会看到几个关键部分src/main/resources/templates/vm存放所有Velocity模板文件src/main/java/com/ruoyi/generator核心生成逻辑代码pom.xml管理模块依赖建议在改造前先备份原始模板文件我吃过亏有一次改错了模板导致生成的代码全部报错不得不从头恢复。2.2 必备依赖配置在ruoyi-generator模块的pom.xml中添加以下依赖!-- Lombok简化实体类 -- dependency groupIdorg.projectlombok/groupId artifactIdlombok/artifactId version1.18.24/version scopeprovided/scope /dependency !-- Mybatis-Plus增强ORM -- dependency groupIdcom.baomidou/groupId artifactIdmybatis-plus-boot-starter/artifactId version3.5.3.1/version /dependency !-- Swagger接口文档 -- dependency groupIdio.springfox/groupId artifactIdspringfox-swagger2/artifactId version3.0.0/version /dependency注意版本兼容性我遇到过Swagger版本过高导致接口文档无法显示的问题最终锁定3.0.0版本最稳定。3. Lombok集成实战3.1 改造实体类模板打开domain.java.vm模板文件主要做三处修改添加Lombok注解引入删除自动生成的getter/setter方法添加构造器注解修改后的模板头部如下package ${packageName}.domain; #foreach ($import in $importList) import ${import}; #end import lombok.Data; import lombok.AllArgsConstructor; import lombok.NoArgsConstructor; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; Data NoArgsConstructor AllArgsConstructor ApiModel(${functionName}实体) public class ${ClassName} extends ${Entity} { // 原有字段定义保持不变 }实测发现加上AllArgsConstructor后有些场景下需要显式调用无参构造器所以必须同时保留NoArgsConstructor注解。3.2 常见问题解决有次生成代码后编译报错排查发现是因为模板中字段注释包含特殊符号导致。建议在模板中添加注释过滤逻辑#set($comment $column.columnComment.replaceAll([\\r\\n],)) ApiModelProperty(${comment}) private $column.javaType $column.javaField;4. Mybatis-Plus深度集成4.1 核心配置调整首先在application.yml中替换Mybatis配置mybatis-plus: mapper-locations: classpath*:mapper/**/*Mapper.xml global-config: db-config: id-type: auto configuration: map-underscore-to-camel-case: true然后创建MybatisPlusConfig配置类Configuration EnableTransactionManagement public class MybatisPlusConfig { Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor new MybatisPlusInterceptor(); // 分页插件 interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); // 乐观锁插件 interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor()); return interceptor; } }4.2 模板文件改造修改mapper.java.vm模板Mapper public interface ${ClassName}Mapper extends BaseMapper${ClassName} { // 原有自定义方法保持不变 }serviceImpl.java.vm中替换基础CRUD操作Override public ${ClassName} select${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaType} ${pkColumn.javaField}) { return getById(${pkColumn.javaField}); } Override public int insert${ClassName}(${ClassName} ${className}) { return save(${className}) ? 1 : 0; }5. Swagger接口文档集成5.1 Controller层改造controller.java.vm模板主要添加三类注解类级别Api注解方法级别ApiOperation参数级别ApiParam示例代码Api(tags ${functionName}管理) RestController RequestMapping(/${moduleName}/${businessName}) public class ${ClassName}Controller { ApiOperation(获取详情) GetMapping(/{id}) public R${ClassName} getInfo( ApiParam(value 主键ID, required true) PathVariable ${pkColumn.javaType} id) { return R.ok(service.getById(id)); } }5.2 实体类文档化在domain.java.vm中为每个字段添加ApiModelPropertyApiModelProperty(value ${column.columnComment}, position $foreach.index) private $column.javaType $column.javaField;注意position参数可以控制文档中字段的显示顺序比默认的字母排序更符合业务逻辑。6. 高级功能扩展6.1 自动填充字段处理在BaseEntity中添加自动填充注解TableField(fill FieldFill.INSERT) private String createBy; TableField(fill FieldFill.INSERT) private LocalDateTime createTime;实现MetaObjectHandlerComponent public class MyMetaObjectHandler implements MetaObjectHandler { Override public void insertFill(MetaObject metaObject) { this.strictInsertFill(metaObject, createTime, LocalDateTime::now, LocalDateTime.class); this.strictInsertFill(metaObject, createBy, () - getCurrentUsername(), String.class); } }6.2 LocalDateTime支持修改GenUtils类中的类型映射// 数据库类型到Java类型映射 typeMap.put(datetime, LocalDateTime); typeMap.put(timestamp, LocalDateTime);在domain模板中添加日期格式化注解JsonFormat(pattern yyyy-MM-dd HH:mm:ss) ApiModelProperty(创建时间) private LocalDateTime createTime;7. 模板调试与验证7.1 生成代码测试修改完所有模板后建议按以下步骤验证准备一张测试表包含各种字段类型通过系统工具 - 代码生成导入表生成代码并导入项目编译检查是否有语法错误启动项目测试接口是否正常7.2 常见问题排查遇到过字段注释包含换行符导致生成的注解格式错误的情况解决方法是在模板中添加过滤#set($comment $column.columnComment.replaceAll([\\r\\n],)) ApiModelProperty(${comment})另一个坑是Mybatis-Plus的TableField注解不生效后来发现是因为没在启动类添加MapperScan注解扫描mapper接口。

更多文章