Ruoyi框架集成MyBatis-Plus代码生成器优化实践
1. 项目背景与核心需求Ruoyi作为国内广泛使用的开源快速开发框架其前后端分离版本在企业级应用开发中占据重要地位。在实际项目开发中代码生成器是提升开发效率的关键工具而MyBatis-Plus作为MyBatis的增强工具能够显著简化数据库操作代码的编写。我在多个Ruoyi项目实践中发现框架自带的代码生成器虽然功能完整但在生成MyBatis-Plus风格的代码时存在以下典型问题实体类字段注解不够规范如缺少TableField注解Service层接口与实现类冗余未充分利用MP的IService接口Mapper接口继承关系不明确未统一继承BaseMapper生成的XML文件存在冗余SQL未充分利用MP的CRUD方法这些问题导致生成的代码需要大量手工调整反而降低了开发效率。本文将分享如何改造Ruoyi的代码生成脚本使其生成符合MyBatis-Plus最佳实践的标准化代码。2. 代码生成器原理解析2.1 Ruoyi代码生成器工作机制Ruoyi的代码生成器基于Velocity模板引擎实现核心流程如下读取数据库表元数据表名、字段、注释等根据模板文件生成对应的Java/XML/Vue文件将生成的文件输出到指定目录关键模板文件位于ruoyi-generator/src/main/resources/vm目录下包括domain.java.vm实体类模板mapper.java.vmMapper接口模板service.java.vmService接口模板serviceImpl.java.vmService实现类模板mapper.xml.vmXML映射文件模板2.2 MyBatis-Plus最佳实践优化后的代码生成应当符合MP的以下规范实体类使用TableName注解指定表名使用TableField注解标注非标准命名字段实现Serializable接口Mapper接口继承BaseMapperT接口使用Mapper注解Service层接口继承IServiceT实现类继承ServiceImplM,T并实现自定义接口XML文件只保留自定义SQL基础CRUD由MP自动提供3. 模板文件改造实战3.1 实体类模板优化修改domain.java.vm模板关键部分package ${packageName}.domain; import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import lombok.Data; import java.io.Serializable; import java.util.Date; /** * ${tableComment}实体类 */ Data TableName(${tableName}) public class ${ClassName} implements Serializable { private static final long serialVersionUID 1L; #foreach ($column in $columns) #if($column.isPk()) TableId #elseif($column.columnName ! $column.javaField) TableField(${column.columnName}) #end private $column.javaType $column.javaField; #end }优化点说明添加TableName注解明确表映射主键字段自动添加TableId注解字段名与属性名不一致时自动添加TableField实现Serializable接口支持缓存序列化使用Lombok简化代码3.2 Mapper接口模板改造重写mapper.java.vm模板package ${packageName}.mapper; import ${packageName}.domain.${ClassName}; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import org.apache.ibatis.annotations.Mapper; /** * ${functionName}Mapper接口 */ Mapper public interface ${ClassName}Mapper extends BaseMapper${ClassName} { // 自定义方法在此添加 }关键改进统一继承BaseMapper获得基础CRUD能力添加Mapper注解确保能被Spring扫描精简模板代码只保留必要结构3.3 Service层模板重构3.3.1 服务接口模板修改service.java.vmpackage ${packageName}.service; import ${packageName}.domain.${ClassName}; import com.baomidou.mybatisplus.extension.service.IService; /** * ${functionName}服务层 */ public interface I${ClassName}Service extends IService${ClassName} { // 自定义服务方法 }3.3.2 服务实现模板重写serviceImpl.java.vmpackage ${packageName}.service.impl; import ${packageName}.domain.${ClassName}; import ${packageName}.mapper.${ClassName}Mapper; import ${packageName}.service.I${ClassName}Service; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.springframework.stereotype.Service; /** * ${functionName}服务实现 */ Service public class ${ClassName}ServiceImpl extends ServiceImpl${ClassName}Mapper, ${ClassName} implements I${ClassName}Service { // 自定义方法实现 }优化效果服务接口继承IService获得批量操作方法实现类继承ServiceImpl减少模板代码保持自定义扩展能力3.4 XML映射文件精简改造mapper.xml.vm模板?xml version1.0 encodingUTF-8 ? !DOCTYPE mapper PUBLIC -//mybatis.org//DTD Mapper 3.0//EN http://mybatis.org/dtd/mybatis-3-mapper.dtd mapper namespace${packageName}.mapper.${ClassName}Mapper !-- 只保留MyBatis-Plus不提供的自定义SQL -- !-- 基础CRUD操作由MyBatis-Plus自动实现 -- !-- 示例复杂查询 -- select idselectCustomList resultType${packageName}.domain.${ClassName} select #foreach($column in $columns)${column.columnName}#if($foreach.hasNext),#end#end from ${tableName} where !-- 自定义条件 -- /where /select /mapper优化策略删除基础CRUD的SQL定义只保留真正的自定义SQL添加注释说明文件用途4. 生成配置与使用技巧4.1 代码生成器配置调整在application.yml中建议配置# 代码生成配置 gen: # 作者信息 author: yourname # 生成包路径 packageName: com.ruoyi.project # 自动去除表前缀 autoRemovePre: true # 表前缀配置 tablePrefix: sys_4.2 实际生成操作步骤启动Ruoyi后台服务访问系统工具 - 代码生成导入需要生成代码的数据表编辑表信息设置模块名、业务名确认实体类名称选择生成路径点击生成代码按钮4.3 生成后代码结构调整建议推荐的项目结构src/main/java └── com.ruoyi.project ├── domain # 实体类 ├── mapper # Mapper接口 ├── service # 服务接口 └── service/impl # 服务实现5. 常见问题与解决方案5.1 字段映射不生效现象数据库字段与实体类属性无法自动映射排查步骤检查TableName注解的表名是否正确确认TableField注解的字段名是否与数据库一致查看MP的全局配置mybatis-plus.global-config.db-config.column-format解决方案// 示例处理带下划线的字段 TableField(value user_name) private String userName;5.2 基础CRUD方法不存在现象继承BaseMapper但无法调用selectById等方法可能原因Mapper接口未添加Mapper注解未配置MapperScan扫描路径MyBatis-Plus starter未正确引入解决方法在启动类添加注解MapperScan(com.ruoyi.project.mapper)检查pom.xml依赖dependency groupIdcom.baomidou/groupId artifactIdmybatis-plus-boot-starter/artifactId version3.5.3/version /dependency5.3 分页查询异常现象分页查询返回所有记录正确配置添加分页插件配置类Configuration public class MyBatisPlusConfig { Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor new MybatisPlusInterceptor(); interceptor.addInnerInterceptor(new PaginationInnerInterceptor()); return interceptor; } }控制器中使用Page对象GetMapping(/list) public TableDataInfo list(PageEntity page, Entity query) { return getDataTable(service.page(page, Wrappers.query(query))); }6. 高级优化技巧6.1 自动填充功能集成在实体类中添加自动填充注解public class User { TableField(fill FieldFill.INSERT) private Date createTime; TableField(fill FieldFill.INSERT_UPDATE) private Date updateTime; }实现元对象处理器Component public class MyMetaObjectHandler implements MetaObjectHandler { Override public void insertFill(MetaObject metaObject) { this.strictInsertFill(metaObject, createTime, Date.class, new Date()); } Override public void updateFill(MetaObject metaObject) { this.strictUpdateFill(metaObject, updateTime, Date.class, new Date()); } }6.2 逻辑删除配置在实体类中添加注解TableLogic private Integer deleted;在application.yml中配置mybatis-plus: global-config: db-config: logic-delete-field: deleted # 全局逻辑删除字段 logic-delete-value: 1 # 删除值 logic-not-delete-value: 0 # 未删除值6.3 多数据源支持对于需要连接多个数据库的场景添加dynamic-datasource依赖dependency groupIdcom.baomidou/groupId artifactIddynamic-datasource-spring-boot-starter/artifactId version3.5.2/version /dependency配置数据源spring: datasource: dynamic: primary: master datasource: master: url: jdbc:mysql://localhost:3306/ruoyi username: root password: 123456 slave: url: jdbc:mysql://192.168.1.2:3306/ruoyi username: root password: 123456在Mapper上指定数据源DS(slave) // 指定从库 public interface UserMapper extends BaseMapperUser {}经过以上优化后Ruoyi生成的代码将完全符合MyBatis-Plus的最佳实践开发人员可以专注于业务逻辑的实现而不用再花费大量时间调整基础CRUD代码。在实际项目中这种优化能使代码生成效率提升40%以上同时显著降低维护成本。

相关新闻

SMC PneuDraw:云端气动设计工具如何填补行业协作与标准化缺口

SMC PneuDraw:云端气动设计工具如何填补行业协作与标准化缺口

1. 项目概述:当气动设计遇上云端协作如果你是一名自动化设备的设计工程师,或者是在工厂一线负责设备维护与改造的技术人员,那么“画气路图”这件事,你一定不陌生。从最原始的CAD线条绘制,到后来使用专业的二维绘图软件…

2026/9/28 22:21:13 阅读更多 →
Python+PyCharm+OpenCV环境搭建指南:从零开始配置计算机视觉开发环境

Python+PyCharm+OpenCV环境搭建指南:从零开始配置计算机视觉开发环境

1. 从零开始的视觉开发环境搭建:为什么是PythonPyCharmOpenCV?如果你对用代码“看见”世界感兴趣,想自己动手做个图像识别、人脸检测或者视频处理的小工具,那么Python、PyCharm和OpenCV这个组合,几乎是你绕不开的起点。…

2026/9/29 17:16:01 阅读更多 →
【Bug已解决】Does Accelerate automatically set the DataLoader’s sampler to a DistributedSampler? 解决方案

【Bug已解决】Does Accelerate automatically set the DataLoader’s sampler to a DistributedSampler? 解决方案

【Bug已解决】Does Accelerate automatically set the DataLoader’s sampler to a DistributedSampler? 解决方案 一、现象长什么样 这是 accelerate 最高频的"以为会自动、实际没自动"类问题之一。现象通常不是报错,而是训练行为不对&#x…

2026/9/29 19:03:10 阅读更多 →

最新新闻

Spring Boot 3迁移MyBatis-Plus:SqlSessionFactory缺失根因与修复

Spring Boot 3迁移MyBatis-Plus:SqlSessionFactory缺失根因与修复

前段时间把一个老服务从Spring Boot 2.7往3.2迁移,顺手把MyBatis也换成MyBatis-Plus,结果启动直接抛了一串异常,核心信息就是Error creating bean with name sqlSessionFactory。但更让人头疼的是,控制台给的提示并不统一——有时…

2026/10/15 5:40:35 阅读更多 →
基于Java和SpringBoot的旅游信息网站与景区门票管理系统设计与实现

基于Java和SpringBoot的旅游信息网站与景区门票管理系统设计与实现

毕业设计选这个题目,算是给自己选了一条比较稳的路。基于Java和SpringBoot的旅游信息网站兼旅游景区门票管理系统,这个题目最大的好处是业务边界清晰、技术栈主流、演示效果好,无论做课程设计还是毕业设计,都是一个容易出成果、也…

2026/10/15 5:40:35 阅读更多 →
纸牌+文字叙事:休闲游戏内容化与混合变现的爆款拆解

纸牌+文字叙事:休闲游戏内容化与混合变现的爆款拆解

1. 霸榜数据背后,玩的是什么新东西先聊聊这个标题为什么会让人多看两眼。“纸牌”这个品类在海外市场一直属于典型的闷声发大财赛道:规则几十年不变、用户年龄跨度大、买量成本相对可控、付费习惯稳定。但大多数纸牌产品做的事情都是“把同一个玩法换皮肤…

2026/10/15 5:40:35 阅读更多 →
纸牌+文字剧情:休闲游戏混合变现与买量素材的爆款融合玩法

纸牌+文字剧情:休闲游戏混合变现与买量素材的爆款融合玩法

纸牌文字,这个组合放在三年前没人信,最近半年我反复在美区榜单上蹲它,还真把这条赛道蹲火了。霸榜美国TOP1不是靠榜单玄学,而是靠一套很实的玩法缝合逻辑:传统纸牌游戏的用户基本盘稳定、活跃高,但付费天花…

2026/10/15 5:40:35 阅读更多 →
IPv6工程落地实战:地址规划、NDP排错与华为设备特有陷阱

IPv6工程落地实战:地址规划、NDP排错与华为设备特有陷阱

1. 这份IPv6笔记到底在解决什么问题?“【HCIE备考笔记】【03-IPv6】重点难点整理”——光看标题,你可能以为这只是某位考生随手记下的几页草稿。但实际翻过几十份真实备考资料后你会发现:绝大多数人卡在IPv6,不是因为协议本身多难…

2026/10/15 5:40:35 阅读更多 →
Fontsource 字体解析:Amarante —— 基于 Art Nouveau 的中等对比度展示字体

Fontsource 字体解析:Amarante —— 基于 Art Nouveau 的中等对比度展示字体

前端CLI开发工具 【免费下载链接】fontsource Self-host Open Source fonts in neatly bundled NPM packages. 项目地址: https://gitcode.com/gh_mirrors/fo/fontsource 点击查看 免费下载 Amarante 是 Fontsource 注册表中收录的 Google 系字体之一,由…

2026/10/15 5:39:22 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 7:53:34 阅读更多 →