1. 为什么需要MyBatis代码生成器?
在Java持久层开发中,最枯燥的环节莫过于手动编写大量重复的DAO、Mapper和实体类代码。我曾接手过一个老项目,其中包含87张数据库表,每张表平均需要编写5个基础文件(Entity、Mapper接口、XML映射文件、Service接口、ServiceImpl实现类),这意味着需要手动编写435个文件——这还没算上单元测试代码。这种重复劳动不仅效率低下,而且容易因人为疏忽导致字段映射错误。
MyBatis Generator(简称MBG)正是为解决这类痛点而生。它通过解析数据库表结构,自动生成:
- 与表字段精确对应的POJO实体类
- 包含基础CRUD操作的Mapper接口
- 动态SQL组成的XML映射文件
- 可选生成Example查询条件类
实际项目中,使用代码生成器通常能减少60%-80%的持久层编码工作量。我在电商系统开发中,针对120张表的代码生成仅需15分钟,而手动编码至少需要2周。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环境准备与基础配置
2.1 必备组件安装
推荐使用Maven项目集成MBG,在pom.xml中添加如下依赖:
xml复制<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.4.2</version>
</dependency>
同时需要准备数据库驱动,以MySQL为例:
xml复制<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.33</version>
</dependency>
2.2 配置文件详解
在resources目录下创建generatorConfig.xml,这是MBG的核心配置文件:
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"
userId="root"
password="123456">
</jdbcConnection>
<!-- Java模型生成配置 -->
<javaModelGenerator targetPackage="com.example.entity"
targetProject="src/main/java">
<property name="enableSubPackages" value="true"/>
<property name="trimStrings" value="true"/>
</javaModelGenerator>
<!-- SQL映射文件生成配置 -->
<sqlMapGenerator targetPackage="mapper"
targetProject="src/main/resources">
<property name="enableSubPackages" value="true"/>
</sqlMapGenerator>
<!-- DAO接口生成配置 -->
<javaClientGenerator type="XMLMAPPER"
targetPackage="com.example.mapper"
targetProject="src/main/java"/>
<!-- 指定要生成的表 -->
<table tableName="user" domainObjectName="User"/>
<table tableName="order" domainObjectName="Order"/>
</context>
</generatorConfiguration>
关键配置项说明:
targetRuntime:建议使用MyBatis3,支持更丰富的特性trimStrings:自动去除字符串字段前后空格,避免常见数据问题enableSubPackages:按表名创建子包,保持代码组织清晰
3. 高级生成策略与定制
3.1 字段映射精细化控制
有时需要手动修正自动生成的字段映射关系。例如数据库字段为user_name,但希望实体类属性为username:
xml复制<table tableName="user" domainObjectName="User">
<columnOverride column="user_name" property="username"/>
<columnOverride column="create_time"
javaType="java.time.LocalDateTime"/>
</table>
3.2 自定义类型处理器
对于特殊字段类型(如JSON、枚举),可以注册自定义TypeHandler:
xml复制<table tableName="product">
<columnOverride column="specs"
javaType="com.example.type.JsonType"
typeHandler="com.example.handler.JsonTypeHandler"/>
</table>
3.3 生成Example查询类
MBG可以生成用于构建复杂查询条件的Example类:
xml复制<context id="mysql" targetRuntime="MyBatis3">
<plugin type="org.mybatis.generator.plugins.CaseInsensitiveLikePlugin"/>
<plugin type="org.mybatis.generator.plugins.SerializablePlugin"/>
</context>
生成的Example用法示例:
java复制UserExample example = new UserExample();
example.createCriteria()
.andUsernameLike("%admin%")
.andStatusEqualTo(1);
List<User> users = userMapper.selectByExample(example);
4. 实战中的问题排查与优化
4.1 常见报错解决方案
问题1:无法连接数据库
- 检查驱动版本是否匹配(MySQL 8.0+需使用com.mysql.cj.jdbc.Driver)
- URL需添加时区参数:
jdbc:mysql://localhost:3306/db?serverTimezone=Asia/Shanghai
问题2:生成文件内容为空
- 确认表名大小写是否与数据库一致
- 检查数据库用户是否有SELECT权限
4.2 生成代码的二次开发
虽然MBG生成的代码开箱即用,但实际项目中通常需要扩展:
- 添加自定义基类:
xml复制<context>
<plugin type="org.mybatis.generator.plugins.BaseRecordPlugin">
<property name="rootClass" value="com.example.base.BaseEntity"/>
</plugin>
</context>
- 集成Lombok减少样板代码:
xml复制<context>
<plugin type="org.mybatis.generator.plugins.LombokPlugin"/>
</context>
- 分页插件整合:
java复制// 在自定义Mapper接口中添加分页方法
public interface BaseMapper<T> {
List<T> selectPage(@Param("page") PageParam page, @Param("ew") Wrapper<T> wrapper);
}
4.3 生成器性能优化
当需要处理大量表时(50+),建议:
- 使用
<include>和<exclude>规则过滤表:
xml复制<table tableName="%">
<exclude tableName="temp_%"/>
<exclude tableName="test_%"/>
</table>
-
分模块生成配置,减少单次生成量
-
使用Maven Profile管理不同环境的生成策略
5. 企业级应用实践
5.1 多数据源支持
在微服务架构中,常需要从多个数据库生成代码:
xml复制<generatorConfiguration>
<context id="ds1" targetRuntime="MyBatis3">
<jdbcConnection connectionURL="jdbc:mysql://ds1-host:3306/db1".../>
<!-- 配置1 -->
</context>
<context id="ds2" targetRuntime="MyBatis3">
<jdbcConnection connectionURL="jdbc:mysql://ds2-host:3306/db2".../>
<!-- 配置2 -->
</context>
</generatorConfiguration>
执行时通过参数指定contextId:
bash复制mvn mybatis-generator:generate -Dmybatis.generator.contextId=ds1
5.2 自定义模板开发
MBG支持Velocity模板引擎自定义输出格式。例如创建src/main/resources/my-templates目录,添加:
model.java.vm- 自定义实体类模板mapper.java.vm- 自定义Mapper接口模板
配置使用自定义模板:
xml复制<context>
<property name="javaFileEncoding" value="UTF-8"/>
<plugin type="org.mybatis.generator.plugins.UnmergeableXmlMappersPlugin"/>
<commentGenerator type="com.example.CustomCommentGenerator"/>
</context>
5.3 与MyBatis-Plus的集成
虽然MBG功能强大,但MyBatis-Plus提供了更便捷的CRUD操作。可以通过以下方式结合:
- 生成基础代码后,让Mapper继承BaseMapper:
java复制public interface UserMapper extends BaseMapper<User> {
// 自定义方法
}
- 使用MyBatis-Plus代码生成器(需单独配置):
java复制AutoGenerator generator = new AutoGenerator();
generator.setGlobalConfig(config);
generator.setDataSource(dataSourceConfig);
generator.setPackageInfo(packageConfig);
generator.setStrategy(strategyConfig);
generator.execute();
6. 持续集成中的自动化
将代码生成纳入CI/CD流程,确保每次数据库变更后及时同步:
- Maven插件配置:
xml复制<build>
<plugins>
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.4.2</version>
<executions>
<execution>
<id>generate-mybatis-code</id>
<phase>generate-sources</phase>
<goals>
<goal>generate</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
- Git Hooks方案:
在pre-commit钩子中检查数据库迁移脚本,触发代码生成:
bash复制#!/bin/sh
# 检查是否有DDL变更
if git diff --cached --name-only | grep 'migrations/'; then
mvn mybatis-generator:generate
git add src/main/java/com/example/mapper/
git add src/main/resources/mapper/
fi
- Jenkins Pipeline集成:
groovy复制pipeline {
agent any
stages {
stage('Generate Code') {
when {
changeset '**/migrations/*.sql'
}
steps {
sh 'mvn mybatis-generator:generate'
}
}
}
}
在实际项目迭代中,我通常会建立这样的流程:数据库变更 → 执行迁移脚本 → 自动生成代码 → 提交到版本库。这能确保团队所有成员使用的持久层代码始终与数据库结构保持同步,避免因手动修改导致的字段映射错误。
