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/8/3 6:03:55 阅读更多 →
Python+PyCharm+OpenCV环境搭建指南:从零开始配置计算机视觉开发环境

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

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

2026/8/3 6:03:55 阅读更多 →
无线传感器网络安全传输优化方案与Matlab实现

无线传感器网络安全传输优化方案与Matlab实现

1. 项目概述:无线传感器网络中的安全传输挑战在工业监测、环境感知和智能家居等领域,无线传感器网络(WSNs)正发挥着越来越重要的作用。但这类网络面临两个关键挑战:一是信号传输过程中存在的硬件噪声干扰,二…

2026/8/3 6:03:55 阅读更多 →

最新新闻

无标题技术项目的系统化开发与管理方法论

无标题技术项目的系统化开发与管理方法论

1. 项目概述作为一名从业多年的技术博主,我经常遇到一个有趣的现象:许多最有价值的项目往往最初连标题都没有。这种"无标题"状态反而可能蕴含着最纯粹的创意和技术探索。今天我想分享的就是关于如何处理这类"无标题"项目的系统方法论…

2026/8/4 10:25:57 阅读更多 →
KNN算法实现手写字母识别的Matlab实践指南

KNN算法实现手写字母识别的Matlab实践指南

1. 项目概述:KNN算法与手写字母识别的完美结合手写字母识别一直是模式识别领域的经典课题,而K近邻算法(KNN)作为最直观的机器学习方法之一,特别适合初学者入门实践。我在工业质检项目中首次接触这个组合方案时&#xf…

2026/8/4 10:25:57 阅读更多 →
TensorFlow与MATLAB协同开发深度学习应用指南

TensorFlow与MATLAB协同开发深度学习应用指南

1. TensorFlow与MATLAB协同使用概述 在深度学习与科学计算领域,TensorFlow和MATLAB都是重量级工具。TensorFlow作为Google开源的深度学习框架,以其灵活的架构和强大的分布式计算能力著称;而MATLAB则是MathWorks公司推出的数值计算环境&#x…

2026/8/4 10:25:57 阅读更多 →
DeepSeek-V4-Flash API调用实战:从零集成到错误排查

DeepSeek-V4-Flash API调用实战:从零集成到错误排查

在实际 AI 应用开发中,选择一个性能强劲且成本可控的大语言模型 API 是项目成功的关键因素之一。近期,DeepSeek-V4-Flash 正式版 API 的开放公测,因其宣称的单任务成本优势,成为了开发者社区关注的热点。对于需要集成文本生成、代…

2026/8/4 10:25:57 阅读更多 →
论文终稿检查清单:避免99%学生忽略的致命错误

论文终稿检查清单:避免99%学生忽略的致命错误

1. 论文提交前的致命盲区:99%学生忽略的终稿检查清单 去年指导研究生论文时,我发现一个惊人规律:82%的返修意见都集中在格式、引用和基础数据这些"低级错误"上。更可怕的是,这些错误往往会导致导师对学术严谨性的质疑—…

2026/8/4 10:25:57 阅读更多 →
NBTExplorer:3分钟学会用图形化界面轻松编辑Minecraft游戏数据

NBTExplorer:3分钟学会用图形化界面轻松编辑Minecraft游戏数据

NBTExplorer:3分钟学会用图形化界面轻松编辑Minecraft游戏数据 【免费下载链接】NBTExplorer A graphical NBT editor for all Minecraft NBT data sources 项目地址: https://gitcode.com/gh_mirrors/nb/NBTExplorer 你是否曾经因为Minecraft存档损坏而束手…

2026/8/4 10:24:56 阅读更多 →

日新闻

AI Agent白手起家26: 使用标准事件驱动大模型实践

AI Agent白手起家26: 使用标准事件驱动大模型实践

纲要 练习目标:掌握大模型标准事件的调用回顾 LangChain 中的核心标准事件 invokestreambatchastream_eventswith_structured_output 环境准备实战代码:多种事件调用对比 同步调用与流式输出批量处理异步事件流监听结构化输出 运行说明与预期结果总结与扩…

2026/8/4 0:00:40 阅读更多 →
dealsea是什么?跨境卖家必知的美国deal站入门指南

dealsea是什么?跨境卖家必知的美国deal站入门指南

说实话,第一次听说美国这个老牌折扣网站的跨境卖家,十个有八个会问同一个问题:这个平台到底是干嘛的?我见过一个做家居出口的朋友,他在亚马逊上月销二十万美金,却从来没用过它。我给他看了首页——一屏一屏…

2026/8/4 0:01:40 阅读更多 →
清华大学重磅EST:植物自导电闪蒸焦耳热600°C/2600°C两步法!稀土超积累植物秒级转化为CeO₂-石墨烯电催化剂!

清华大学重磅EST:植物自导电闪蒸焦耳热600°C/2600°C两步法!稀土超积累植物秒级转化为CeO₂-石墨烯电催化剂!

通讯作者:邓兵、刘建国通讯单位:清华大学DOI:https://doi.org/10.1021/acs.est.6c00603研究背景稀土元素(REEs)是清洁能源技术与电子器件不可或缺的核心原料,然而传统提取方式依赖能耗高、排放大的采矿与强…

2026/8/4 0:01:40 阅读更多 →

周新闻

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

1. 从水管网络到最大流:一个核心问题的诞生想象一下,你是一个城市供水系统的总工程师。你的城市有多个水源(水库),需要通过一个复杂的地下管道网络,将水输送到各个居民区。每条管道都有其最大通水能力&…

2026/8/3 4:58:13 阅读更多 →
基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/8/3 1:53:31 阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/4 5:26:40 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/3 13:07:03 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/3 5:19:38 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/3 8:27:36 阅读更多 →