本文目录导读:

- 目录导读
- MyBatis生成器(MBG)是什么?为何它比手写SQL更高效?
- 环境准备:Maven依赖与配置文件详解
- 五步生成实战案例:从数据库表到代码文件的完整流程
- 生成的代码如何快速扩展:查询条件构造器与动态SQL的活用
- 常见问题问答:为什么生成结果总是不符合预期?如何优雅处理?
- 性能与维护建议:生成代码与手写代码的黄金配比
深入浅出MyBatis生成案例:从CRUD到动态SQL的实战指南
目录导读
- MyBatis生成器(MBG)是什么?为何它比手写SQL更高效?
- 环境准备:Maven依赖与配置文件详解
- 五步生成实战案例:从数据库表到代码文件的完整流程
- 生成的代码如何快速扩展:查询条件构造器与动态SQL的活用
- 常见问题问答:为什么生成结果总是不符合预期?如何优雅处理?
- 性能与维护建议:生成代码与手写代码的黄金配比
MyBatis生成器(MBG)是什么?为何它比手写SQL更高效?
MyBatis Generator(简称MBG)是MyBatis官方提供的一个代码生成器,它能够根据数据库表结构自动生成实体类(POJO)、Mapper接口、XML映射文件以及示例类(Example),对于开发者而言,最核心的价值在于消除了大量重复的CRUD样板代码,想象一个包含20个字段的用户表,手写增删改查至少需要100行XML+50行Java,而MBG在3秒内就能生成同等质量且无拼写错误的代码。
为什么比手写更高效? 体现在三方面:
- 一致性:所有生成的代码遵循统一命名规范,团队协作时减少“风格冲突”。
- 可追踪性:重新运行生成器即可同步表结构变化,避免手动遗漏修改。
- 底层优化:生成的ResultMap自动处理字段映射,避免下划线转驼峰的手动开销。
环境准备:Maven依赖与配置文件详解
第一步:加入Maven插件(在pom.xml中)
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.4.2</version>
<configuration>
<configurationFile>src/main/resources/generatorConfig.xml</configurationFile>
<overwrite>true</overwrite>
<verbose>true</verbose>
</configuration>
</plugin>
注意:
overwrite设为true表示覆盖已有文件,但仅覆盖同名同路径文件,不会删除多余代码。
第二步:创建generatorConfig.xml(核心配置文件)
<generatorConfiguration>
<context id="MysqlContext" targetRuntime="MyBatis3Simple">
<!-- 关闭注释生成 -->
<commentGenerator>
<property name="suppressAllComments" value="true"/>
</commentGenerator>
<!-- 数据库连接 -->
<jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/test"
userId="root" password="123456"/>
<!-- 实体类位置 -->
<javaModelGenerator targetPackage="com.example.pojo" targetProject="src/main/java"/>
<!-- Mapper接口位置 -->
<javaClientGenerator targetPackage="com.example.mapper" targetProject="src/main/java" type="XMLMAPPER"/>
<!-- SQL映射文件位置 -->
<sqlMapGenerator targetPackage="mapper" targetProject="src/main/resources"/>
<!-- 要生成代码的表 -->
<table tableName="user_info" domainObjectName="User"/>
</context>
</generatorConfiguration>
五步生成实战案例:从数据库表到代码文件的完整流程
场景:假设数据库有表user_info,字段包括id(自增)、username、password、email、create_time。
第1步:执行Maven命令,在项目根目录运行:
mvn mybatis-generator:generate
第2步:观察生成的文件,在你的目录下会出现:
User.java(实体类,含getter/setter)UserMapper.java(接口,定义了insert、selectByPrimaryKey、updateByPrimaryKey等基础方法)UserMapper.xml(映射文件,包含所有SQL语句与ResultMap)
第3步:快速验证CRUD,在Spring Boot中注入UserMapper,调用insert()即可插入数据。
User user = new User();
user.setUsername("admin");
user.setPassword("123");
userMapper.insert(user); // 自动返回主键id
第4步:使用Example构建动态查询。UserExample允许你动态拼接where条件,尤其适合多条件筛选:
UserExample example = new UserExample();
example.createCriteria().andUsernameEqualTo("admin").andEmailLike("%@qq.com");
List<User> users = userMapper.selectByExample(example);
第5步:定制化扩展,如果生成的XML无法满足需求,直接在UserMapper.xml中添加自定义SQL标签(例如联表查询),但注意不要修改自动生成的方法名,避免重新生成时覆盖。
生成的代码如何快速扩展:查询条件构造器与动态SQL的活用
核心技巧1:selectByExample的灵活使用
它支持条件组合、排序、去重,例如实现“查询所有邮箱不为空的用户并按时间倒序”:
example.setOrderByClause("create_time DESC");
example.createCriteria().andEmailIsNotNull();
核心技巧2:使用@GeneratedValue返回自增主键
在User.java中,可通过注解方式让数据库自增id回填:
@Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id;
核心技巧3:批处理优化
生成的XML默认是单条插入,若需批量插入,可以手写<foreach>标签,但注意避免重新生成时被覆盖。最佳实践:把自定义SQL放独立XML文件(如CustomUserMapper.xml),避免冲突。
常见问题问答:为什么生成结果总是不符合预期?如何优雅处理?
Q1:生成时提示“Table not found”,怎么办?
A:检查jdbcConnection中的connectionURL是否包含database名称,且table标签的tableName大小写与数据库一致,MySQL下建议统一小写。
Q2:生成的实体类没有注解(如@Table),导致JPA冲突?
A:在generatorConfig.xml中给javaModelGenerator添加<property name="enableLombok" value="true"/>或开启注释标注,但针对MyBatis通常无需JPA注解,建议用Lombok简化代码。
Q3:每次生成都覆盖我手动添加的代码,怎么保护?
A:方法一:将自定义XML方法放在与原文件不同的命名空间(如CustomUserMapper),方法二:将overwrite设为false,让MBG自动生成新文件(如UserMapper1.xml),推荐前者,更清晰。
Q4:生成的SQL只支持单表,如何处理多表关联?
A:MBG不可靠,直接编写一个专门的视图(View)或手写SQL在扩展文件里,绝不要试图修改自动生成的Base_Column_List。
Q5:如何让字段映射自动处理驼峰和下划线?
A:在context标签中设置<property name="autoDelimitKeywords" value="true"/>,并确保数据库表字段使用下划线(如create_time),Java属性自动转为createTime。
性能与维护建议:生成代码与手写代码的黄金配比
建议配比:80%的简单CRUD用生成代码,20%的复杂业务查询手写SQL。
理由:生成器擅长处理结构已知、稳定的表,但涉及大数据量分页统计、多表JOIN、子查询时,手写SQL能更精细地控制执行计划。
维护优化点:
- 缓存复用:生成的Mapper是单例,无需重复构建
SqlSessionFactory。 - 避免内存泄漏:实体类不要实现
Serializable以外的大接口。 - 代码审查清单:检查
ResultMap是否遗漏typeHandler(如枚举、JSON字段),在生成后手动补充。
MyBatis Generator不是“一键全自动”的银弹,而是一个高质量的“脚手架”,正确使用能释放你80%的重复劳动,把精力聚焦在业务逻辑上,这才是它真正的价值所在。