当前位置: 首页 > news >正文

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

1. 为什么需要定制若依代码生成器

第一次接触若依框架时,我就被它强大的代码生成功能惊艳到了。只需要简单配置数据库表结构,就能一键生成前后端基础代码,这大大提升了开发效率。但用着用着就发现,默认生成的代码虽然能用,却不够"现代化"——每次都要手动添加Lombok注解、调整Mybatis-Plus配置、补充Swagger文档,重复劳动让人头疼。

举个例子,上周我接手一个用户管理模块的开发。用若依生成代码后,发现实体类里全是getter/setter方法,一个简单的User类就占了200多行代码;Mapper接口还要自己继承BaseMapper;最麻烦的是接口文档,得逐个方法写注释。这些重复工作至少浪费了我半天时间。

其实这些问题都有现成的解决方案:Lombok能简化POJO代码,Mybatis-Plus提供了强大的CRUD封装,Swagger可以自动生成API文档。如果能把这些工具集成到代码生成器里,岂不是能省下大量时间?这就是我们今天要解决的问题。

2. Lombok集成实战

2.1 准备工作

首先确保项目中已经引入Lombok依赖。我推荐使用最新稳定版,目前是1.18.28。在pom.xml中添加:

<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.28</version> <scope>provided</scope> </dependency>

这里有个小技巧:把scope设为provided,因为Lombok只在编译期起作用,运行时不需要。

2.2 改造Velocity模板

若依的代码生成模板位于ruoyi-generator模块的resources/templates目录下。我们要修改的是domain.java.vm文件,这是生成实体类的模板。

原始模板会生成冗长的getter/setter方法,我们要做三处改动:

  1. 在import部分添加Lombok的引入
  2. 在类上添加@Data、@NoArgsConstructor、@AllArgsConstructor注解
  3. 删除模板中原有的getter/setter代码块

修改后的关键部分如下:

#foreach ($import in $importList) import ${import}; #end import lombok.Data; import lombok.NoArgsConstructor; import lombok.AllArgsConstructor; @Data @NoArgsConstructor @AllArgsConstructor public class ${ClassName} extends ${Entity} { // 原有字段定义保持不变 }

实际项目中我发现,有时候需要排除某些字段的toString和equals方法。这时可以用@ToString(exclude = "fieldName")和@EqualsAndHashCode(exclude = "fieldName")来精细控制。

3. Mybatis-Plus深度集成

3.1 基础配置

首先替换Mybatis依赖为Mybatis-Plus:

<dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.5.3.1</version> </dependency>

配置文件中需要调整:

mybatis-plus: mapper-locations: classpath*:mapper/**/*Mapper.xml global-config: db-config: id-type: auto configuration: map-underscore-to-camel-case: true

3.2 模板改造

需要修改三个模板文件:

  1. mapper.java.vm - 让Mapper接口继承BaseMapper
  2. service.java.vm - Service接口继承IService
  3. serviceImpl.java.vm - ServiceImpl继承ServiceImpl

以mapper.java.vm为例:

@Mapper public interface ${ClassName}Mapper extends BaseMapper<${ClassName}> { // 原有自定义方法 }

这里有个坑要注意:如果实体类中有非数据库字段(如transient字段),需要加上@TableField(exist = false)注解,否则Mybatis-Plus会尝试映射这些字段导致报错。

3.3 自动填充功能

Mybatis-Plus的自动填充功能特别适合记录操作日志。我们在BaseEntity中添加注解:

@TableField(fill = FieldFill.INSERT) private String createBy; @TableField(fill = FieldFill.INSERT) private LocalDateTime createTime; @TableField(fill = FieldFill.UPDATE) private String updateBy; @TableField(fill = FieldFill.UPDATE) private LocalDateTime updateTime;

然后实现MetaObjectHandler接口:

@Component public class MyMetaObjectHandler implements MetaObjectHandler { @Override public void insertFill(MetaObject metaObject) { this.strictInsertFill(metaObject, "createBy", String.class, getCurrentUsername()); this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, LocalDateTime.now()); } @Override public void updateFill(MetaObject metaObject) { this.strictUpdateFill(metaObject, "updateBy", String.class, getCurrentUsername()); this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now()); } }

4. Swagger文档集成

4.1 基础配置

首先引入依赖:

<dependency> <groupId>io.springfox</groupId> <artifactId>springfox-boot-starter</artifactId> <version>3.0.0</version> </dependency>

在启动类添加@EnableOpenApi注解。

4.2 改造Controller模板

修改controller.java.vm文件,主要添加三类注解:

  1. 类上的@Api
  2. 方法上的@ApiOperation
  3. 参数上的@ApiParam

示例代码:

@Api(tags = "${functionName}管理") @RestController @RequestMapping("/${moduleName}/${businessName}") public class ${ClassName}Controller { @ApiOperation("查询${functionName}列表") @GetMapping public TableDataInfo<${ClassName}> list( @ApiParam("查询条件") ${ClassName} query) { // 方法实现 } }

4.3 实体类文档化

修改domain.java.vm模板,添加@ApiModel和@ApiModelProperty:

@ApiModel("${functionName}实体") public class ${ClassName} { @ApiModelProperty("${column.columnComment}") private ${column.javaType} ${column.javaField}; }

这里有个实用技巧:在@ApiModelProperty中可以使用value、notes、example等多个属性来丰富文档内容。比如:

@ApiModelProperty(value = "用户年龄", example = "18", notes = "必须大于0") private Integer age;

5. 日期类型升级为LocalDateTime

5.1 为什么选择LocalDateTime

相比传统的Date类型,LocalDateTime有三大优势:

  1. 不可变性,线程安全
  2. 更精确的时间控制(纳秒级)
  3. 更友好的API设计

5.2 前后端改造

前端需要修改src/views/tool/gen/editTable.vue,在类型选项中添加LocalDateTime。

后端需要修改GenUtils类,将数据库的datetime类型映射为LocalDateTime:

// 在类型映射部分添加 typeMap.put("datetime", "LocalDateTime");

5.3 模板调整

修改domain.java.vm中关于日期字段的处理:

#if($column.javaType == 'LocalDateTime') @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private LocalDateTime ${column.javaField}; #end

同时记得在VelocityUtils中添加对应的import语句:

if (GenConstants.TYPE_LOCAL_DATE_DATE.equals(column.getJavaType())) { importList.add("java.time.LocalDateTime"); importList.add("com.fasterxml.jackson.annotation.JsonFormat"); }

6. 实际应用中的经验分享

经过几个项目的实践,这套改造方案已经相当稳定。但有几个注意事项想特别提醒:

  1. 版本兼容性:确保Lombok、Mybatis-Plus和Swagger的版本与Spring Boot兼容。我目前使用的组合是Spring Boot 2.7.x + Mybatis-Plus 3.5.3 + Lombok 1.18.28

  2. IDE支持:团队成员需要统一安装Lombok插件,否则IDE会报错。在CI/CD流程中也要配置Lombok支持

  3. Swagger性能:在生产环境记得关闭Swagger,可以通过profile控制:

spring: profiles: active: dev
  1. 字段命名规范:Mybatis-Plus的字段映射默认是下划线转驼峰,如果数据库字段命名不规范会导致映射失败

这套改造方案在我们团队实施后,新模块的开发效率提升了约40%。特别是对接前端时,再也不用一边写接口一边维护文档了。

http://www.jsqmd.com/news/529577/

相关文章:

  • Matlab 实现基于 IMM 和 UKF/EKF 的三维路径跟踪预测仿真
  • 5个突破性特性彻底改变终端工作流
  • HY-Motion 1.0真实案例分享:高质量骨骼动画生成全流程
  • Youtu-VL-4B-Instruct场景实战:从论文截图到可编辑文档,全自动转换流程
  • 探索全局路径规划算法与 DWA 算法融合实现动态避障
  • CXPatcher:跨平台兼容解决方案的技术突破与实践指南
  • tracetcp:突破防火墙限制的网络诊断利器
  • 从零开始使用在线MIDI工具:新手入门到创作指南
  • 微信小程序视频封面获取实战:从wx.chooseVideo到wx.chooseMedia的升级方案
  • PostgreSQL连接工具不止pgAdmin:这3款免费客户端(DBeaver、DataGrip、Navicat)的横向对比与选型指南
  • 实战指南:如何用Wireshark+机器学习识别恶意TLS流量(附特征提取代码)
  • 编译原理实验3:从LLVM IR手写到LightIR代码生成
  • 手把手生成RGBD-Bonn数据集的关联文件
  • Sensirion UPT Core:嵌入式传感器统一数据建模解析
  • BEV分割新范式:PETRv2在车道线检测中的创新应用
  • ncmdump:网易云音乐NCM格式解密转换终极指南
  • ClawdBot保姆级教程:零基础掌握设备授权,安全使用本地AI
  • ChatGLM-6B在市场营销中的应用:个性化推荐系统
  • Windows 7环境下iperf3网络测试工具兼容性解决方案
  • GB28181实战:基于ZLMediaKit构建高并发国标流媒体服务
  • 2026年降AI工具哪款支持批量处理?多篇论文同时降的方案
  • 解放空洞骑士玩家双手:Scarab模组管理器的效率革命
  • 游戏加速神器OpenSpeedy:免费开源的时间控制器终极指南
  • 3步解决B站缓存视频无法播放问题:m4s-converter技术方案详解
  • Windows 10 + WSL2 + VcXsrv 三件套:零基础搞定Ubuntu图形界面开发环境
  • 3大突破重构创作流程:JavaQuestPlayer QSP开发平台全解析
  • Shell脚本踩坑实录:7种Permission denied报错的终极排查指南(附真实案例)
  • 百度网盘下载加速终极指南:3分钟突破限速封锁
  • StructBERT在知识图谱构建中的应用:实体关系抽取前的语义对齐
  • OpenCalib:从粗到精,剖析LiDAR-IMU自动标定的工程实现