MyBatis 逆向工程全指南:从配置到高级定制(含 IDEA 实战与避坑)
MyBatis 逆向工程(MyBatis Generator,简称 MBG)是 MyBatis 官方提供的代码生成工具,可根据数据库表自动生成 实体类、Mapper 接口、Mapper XML 文件,大幅减少重复的 CRUD 代码编写工作。 依赖优化、高级配置(如分页 / 注释 / 逻辑删除)、IDEA 快捷配置、常见问题解决方案 及 工程化最佳实践,帮助你高效落地逆向工程。
逆向工程核心依赖与版本选型
1. Maven 依赖配置
1 | <dependencies> |
逆向工程配置文件深度解析
1. 完整配置文件(generatorConfig.xml
)
1 |
|
2. 外部属性文件(db.properties
)
将数据库配置单独抽取,便于环境切换:
1 | # MySQL 8.0+ 配置 |
3. 关键配置项解读
配置节点 | 核心属性 / 子节点 | 作用说明 |
---|---|---|
context |
targetRuntime="MyBatis3" |
生成 MyBatis 3.x 风格代码,包含动态 SQL(如 Example 类,可选关闭) |
commentGenerator |
suppressAllComments="true" |
禁止生成冗余注释,保持代码整洁 |
jdbcConnection |
nullCatalogMeansCurrent="true" |
解决 MySQL 8.0+ 中生成器无法识别表的问题(关键配置,否则可能生成空代码) |
javaModelGenerator |
trimStrings="true" |
自动去除字符串字段的前后空格,避免业务异常 |
table |
enableXXXByExample="false" |
关闭 Example 类生成(Example 适合复杂查询,简单场景可关闭以减少代码量) |
table |
<generatedKey> |
配置主键生成策略(如 MySQL 自增 identity="true" ) |
table |
<columnOverride> |
手动映射字段(如数据库字段名与实体属性名不一致时) |
逆向工程执行方式(3 种主流方式)
1. Java 类执行(适合调试)
1 | import org.mybatis.generator.api.MyBatisGenerator; |
IDEA 避坑:Working Directory 配置
IDEA 路径问题是高频坑,解决方案如下:
- 右键
GeneratorMain
→Edit Configurations
; - 在
Configuration
标签下,将Working directory
改为 (当前模块根目录); - 点击
Apply
→OK
,重新运行即可(避免路径相对于工作空间导致配置文件找不到)。
2. Maven 插件执行(推荐,适合团队协作)
配置好前文的 mybatis-generator-maven-plugin
后,可通过 Maven 命令直接执行:
- 打开 IDEA 的
Maven
面板(右侧); - 展开项目 →
Plugins
→mybatis-generator
; - 双击
mybatis-generator:generate
,即可执行逆向工程。
优势:
- 无需编写 Java 执行类,配置即执行;
- 团队成员统一依赖插件,避免环境差异;
- 可集成到 CI/CD 流程(如 Jenkins 自动生成代码)。
3. IDEA 插件执行(快捷方式,适合高频使用)
安装 MyBatis Generator
插件,通过图形化界面执行:
- 打开 IDEA →
File
→Settings
→Plugins
; - 搜索
MyBatis Generator
,安装并重启 IDEA; - 右键
generatorConfig.xml
→MyBatis Generator
→Generate MyBatis Artifacts
; - 在弹出的窗口中确认配置,点击
Run
即可。
生成代码结构与使用示例
以 student
表为例,逆向工程会生成以下 3 类文件:
1. 实体类(Student.java
)
1 | package com.zhanghe.study.mybatis.model; |
2. Mapper 接口(StudentMapper.java
)
1 | package com.zhanghe.study.mybatis.mapper; |
3. Mapper XML 文件(StudentMapper.xml
)
存放于 src/main/resources/mapper/
目录下,包含动态 SQL 语句(如 insertSelective
、updateByPrimaryKeySelective
的实现):
1 |
|
4. 代码使用示例(Spring Boot 环境)
1 | import com.zhanghe.study.mybatis.mapper.StudentMapper; |
高级定制:满足复杂业务需求
1. 生成 Example
类(支持复杂查询)
若业务需要多条件动态查询(如模糊查询、范围查询),可开启 Example
类生成(默认关闭):
1 | <table tableName="student" domainObjectName="Student" |
Example
类使用示例(多条件查询)
1 | // 查询:班级ID=1 且 年龄>15 的学生 |
2. 适配分页插件(如 PageHelper)
逆向工程生成的代码可直接与 PageHelper 结合使用,无需额外修改:
1 | import com.github.pagehelper.PageHelper; |
3. 逻辑删除配置
若表含逻辑删除字段(如 is_deleted
,0 = 未删除,1 = 已删除),可通过 columnOverride
配置,生成代码时自动过滤已删除数据:
1 | <table tableName="student" domainObjectName="Student"> |
效果:
生成的 selectByPrimaryKey
、selectByExample
等查询 SQL 会自动添加 WHERE is_deleted = 0
,无需手动过滤逻辑删除数据。
常见问题与解决方案
1. 生成代码为空(无实体类 / Mapper)
- 原因 1:数据库连接配置错误(如 URL 中未加
nullCatalogMeansCurrent=true
,MySQL 8.0+ 必加); - 原因 2:表名拼写错误(如配置
tableName="studnet"
,实际表名是student
); - 原因 3:
targetProject
路径错误(如写成./src/main/java/
,多了斜杠,应改为./src/main/java
); - 解决方案:检查数据库连接日志(添加 SLF4J 依赖),确认表是否被正确识别。
2. 主键自增不生效(id
为 null
)
原因 1:未配置
<generatedKey>
标签,或identity="true"
未设置;原因 2:数据库表主键未设置自增(需先在数据库中开启主键自增);
解决方案:
1
<generatedKey column="id" sqlStatement="MySQL" identity="true"/>
3. IDEA 中配置文件找不到(FileNotFoundException
)
- 原因:
Working directory
未设置为 ,导致路径相对于工作空间而非模块; - 解决方案:按前文步骤修改 IDEA 的 Run Configuration,或使用绝对路径(不推荐)。
4. 生成的实体类字段名与数据库不一致
原因 1:未开启驼峰命名映射(如
class_id
未转为classId
);原因 2:特殊字段名(如含下划线、大写字母)未手动映射;
解决方案:
开启 MyBatis 全局驼峰配置(
mapUnderscoreToCamelCase=true
);手动映射特殊字段:
1
<columnOverride column="user_name" property="userName"/>
工程化最佳实践
- 代码生成后不修改:逆向工程生成的代码(尤其是 Mapper 接口和 XML)应视为 “自动生成代码”,避免手动修改;若需扩展功能(如自定义查询),在 Mapper 接口中新增方法,在 XML 中新增 SQL(不修改自动生成的内容)。
- 版本控制忽略自动生成代码:在
.gitignore
中添加自动生成目录(如src/main/java/com/xxx/model/*
),避免团队协作时冲突。 - 分环境配置:通过
properties
标签引入不同环境的数据库配置(开发 / 测试 / 生产),避免频繁修改generatorConfig.xml
。 - 定期更新代码:当数据库表结构变更(如新增字段)时,重新执行逆向工程(开启
overwrite=true
),覆盖旧代码,确保代码与表结构一致。
总结
MyBatis 逆向工程是提升开发效率的关键工具,通过合理配置可自动生成 80% 以上的 CRUD 代码,减少重复劳动。核心步骤为:
- 配置依赖与
generatorConfig.xml
(重点关注数据库连接、代码路径、表映射); - 选择合适的执行方式(Java 类 / Maven 插件 / IDEA 插件);
- 根据业务需求进行高级定制(如
Example
类、逻辑删除、分页适配); - 遵循工程化规范,避免手动修改自动生成代码,确保可维护性
v1.3.10