1. MyBatis逆向工程概述
第一次接触MyBatis逆向工程时,我被它的效率震惊了——原本需要手动编写的大量基础CRUD代码,现在只需要简单配置就能自动生成。这就像给开发工作装上了涡轮增压器,特别是对于需要快速迭代的中小型项目来说,简直是救命稻草。
MyBatis Generator(简称MBG)是MyBatis官方提供的代码生成工具,它能够根据数据库表结构自动生成实体类、Mapper接口和XML映射文件。在实际项目中,我发现它特别适合以下场景:
- 新项目初期需要快速搭建数据访问层
- 数据库表结构频繁变更的开发阶段
- 需要维护大量相似CRUD操作的管理系统
重要提示:虽然逆向工程能节省大量时间,但生成的代码通常需要二次调整。建议只在项目初期或表结构稳定后使用,避免频繁重新生成导致自定义代码被覆盖。
2. 环境准备与基础配置
2.1 必要依赖配置
在Spring Boot项目中整合MyBatis逆向工程,首先需要在pom.xml中添加关键依赖。我推荐使用mybatis-generator-maven-plugin插件方式,这样可以直接通过Maven命令触发代码生成:
xml复制<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.0</version>
</dependency>
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.4.0</version>
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.25</version>
</dependency>
</dependencies>
</plugin>
2.2 generatorConfig.xml详解
逆向工程的核心配置文件是generatorConfig.xml,它决定了生成哪些内容以及如何生成。经过多次项目实践,我总结出以下最佳配置结构:
xml复制<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration PUBLIC
"-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
"http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
<context id="mysql" targetRuntime="MyBatis3">
<!-- 数据库连接配置 -->
<jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/your_db?useSSL=false"
userId="root"
password="123456">
</jdbcConnection>
<!-- 实体类生成配置 -->
<javaModelGenerator targetPackage="com.example.entity"
targetProject="src/main/java">
<property name="enableSubPackages" value="true"/>
<property name="trimStrings" value="true"/>
</javaModelGenerator>
<!-- Mapper XML配置 -->
<sqlMapGenerator targetPackage="mapper"
targetProject="src/main/resources">
<property name="enableSubPackages" value="true"/>
</sqlMapGenerator>
<!-- Mapper接口配置 -->
<javaClientGenerator type="XMLMAPPER"
targetPackage="com.example.mapper"
targetProject="src/main/java">
<property name="enableSubPackages" value="true"/>
</javaClientGenerator>
<!-- 指定要生成的表 -->
<table tableName="user" domainObjectName="User"/>
<table tableName="order" domainObjectName="Order"/>
</context>
</generatorConfiguration>
实战经验:建议将数据库密码等敏感信息放在配置文件中,通过Maven的filter机制动态替换,而不是直接写在xml里。
3. 高级配置与定制化
3.1 自定义类型转换器
默认情况下,MBG会将数据库的DECIMAL类型映射为BigDecimal,但在实际项目中我们可能希望使用Double。这时可以通过类型转换器实现:
xml复制<table tableName="product">
<columnOverride column="price" javaType="java.lang.Double"/>
</table>
更复杂的类型转换可以通过实现TypeHandler接口来完成。我曾经在一个金融项目中,需要将数据库中的特定格式字符串转换为自定义的Money对象:
java复制public class MoneyTypeHandler extends BaseTypeHandler<Money> {
// 实现类型转换逻辑
}
然后在配置中指定:
xml复制<table tableName="account">
<columnOverride column="balance"
typeHandler="com.example.handler.MoneyTypeHandler"/>
</table>
3.2 生成代码的个性化定制
MBG默认生成的代码可能不符合项目规范,我们可以通过以下方式定制:
- 注释生成:通过修改commentGenerator配置添加自定义注释
xml复制<commentGenerator>
<property name="suppressAllComments" value="false"/>
<property name="suppressDate" value="true"/>
<property name="addRemarkComments" value="true"/>
</commentGenerator>
- 方法命名优化:使用plugin扩展点修改生成的方法名
xml复制<plugin type="org.mybatis.generator.plugins.RenameExampleMethodPlugin">
<property name="searchString" value="Example$"/>
<property name="replaceString" value="Criteria"/>
</plugin>
- Lombok集成:减少getter/setter样板代码
xml复制<plugin type="org.mybatis.generator.plugins.LombokPlugin"/>
4. Spring Boot整合实践
4.1 自动化构建配置
为了让逆向工程更好地融入Spring Boot的自动化构建流程,我通常会在pom.xml中添加如下配置:
xml复制<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.4.0</version>
<executions>
<execution>
<id>Generate MyBatis Artifacts</id>
<phase>generate-sources</phase>
<goals>
<goal>generate</goal>
</goals>
</execution>
</executions>
<configuration>
<configurationFile>
${basedir}/src/main/resources/generatorConfig.xml
</configurationFile>
<overwrite>true</overwrite>
<verbose>true</verbose>
</configuration>
</plugin>
这样在运行mvn compile时就会自动触发代码生成,非常适合CI/CD环境。
4.2 多数据源支持
在实际企业应用中,经常需要连接多个数据库。通过扩展MBG的配置可以实现多数据源支持:
xml复制<context id="oracle" targetRuntime="MyBatis3">
<jdbcConnection driverClass="oracle.jdbc.OracleDriver"
connectionURL="jdbc:oracle:thin:@//oracle.example.com:1521/ORCL"
userId="scott"
password="tiger">
</jdbcConnection>
<!-- 其他配置 -->
</context>
<context id="mysql" targetRuntime="MyBatis3">
<jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"
connectionURL="jdbc:mysql://mysql.example.com:3306/app_db"
userId="app_user"
password="mysql123">
</jdbcConnection>
<!-- 其他配置 -->
</context>
然后在Spring Boot中配置多个SqlSessionFactory,每个对应不同的数据源。
5. 常见问题与解决方案
5.1 生成代码冲突处理
当表结构变更后重新生成代码时,可能会覆盖手动修改的部分。我的解决方案是:
- 将自定义代码放在生成的代码之外,通过继承或组合方式扩展
- 使用merge工具对比变更,如:
bash复制mvn mybatis-generator:generate -Dmybatis.generator.overwrite=false
- 为需要保留的方法添加
@Generated注解,然后配置MBG跳过已存在的方法
5.2 性能优化建议
生成的Example类虽然方便,但在复杂查询时性能较差。针对大数据表,我建议:
- 使用自定义SQL替代Example查询
- 为常用查询条件添加索引
- 限制Example查询返回的列数:
java复制Example example = new Example(User.class);
example.selectProperties("id", "name"); // 只查询必要字段
5.3 日志调试技巧
当生成结果不符合预期时,可以通过增加日志输出排查问题:
- 在generatorConfig.xml中开启详细日志:
xml复制<context id="mysql" targetRuntime="MyBatis3">
<property name="javaFileEncoding" value="UTF-8"/>
<property name="verbose" value="true"/>
</context>
- 运行Maven命令时添加调试参数:
bash复制mvn mybatis-generator:generate -X
- 检查target/generated-sources/mybatis-generator目录下的日志文件
6. 实际项目经验分享
6.1 分表策略处理
在电商项目中遇到订单表数据量过大的问题,我们采用了按月分表的策略。为了让MBG支持这种场景,我开发了自定义插件:
java复制public class ShardingTablePlugin extends PluginAdapter {
@Override
public boolean modelExampleClassGenerated(TopLevelClass topLevelClass,
IntrospectedTable introspectedTable) {
// 添加分表逻辑
return true;
}
}
然后在配置中注册插件:
xml复制<plugin type="com.example.plugin.ShardingTablePlugin">
<property name="shardingPattern" value="order_${yyyyMM}"/>
</plugin>
6.2 敏感数据脱敏
对于包含敏感信息的表(如用户手机号),可以在生成阶段就进行脱敏处理:
xml复制<table tableName="user">
<columnOverride column="phone">
<property name="useActualColumnNames" value="false"/>
<property name="columnName" value="CONCAT(LEFT(phone, 3), '****', RIGHT(phone, 4)) AS phone"/>
</columnOverride>
</table>
6.3 多模块项目支持
在大型项目中,我们通常会将实体类、Mapper接口和XML文件放在不同模块。通过调整targetProject配置可以实现:
xml复制<javaModelGenerator targetPackage="com.example.entity"
targetProject="../domain/src/main/java"/>
<sqlMapGenerator targetPackage="mapper"
targetProject="../persistence/src/main/resources"/>
<javaClientGenerator type="XMLMAPPER"
targetPackage="com.example.mapper"
targetProject="../persistence/src/main/java"/>
经过多个项目的实践验证,我发现MyBatis逆向工程的最佳实践是:初期快速生成基础代码,中期转为手动维护关键业务SQL,后期通过插件机制扩展复杂功能。这种渐进式策略既能保证开发效率,又不失灵活性。