1. 项目背景与核心价值
在Java企业级开发中,MyBatis作为一款优秀的持久层框架,其"半自动化"的特性既保留了SQL的灵活性,又通过XML/注解配置简化了数据库操作。但在实际开发中,手动编写每个数据表对应的实体类、Mapper接口和XML映射文件是一项重复性极高的劳动。这正是mybatis-generator插件存在的意义——它能够根据数据库表结构自动生成这三层基础代码,将开发者从重复劳动中解放出来。
我最近在金融行业的一个账户管理系统项目中,需要对接包含87张表的Oracle数据库。如果手动编写这些基础代码,按每张表平均15个字段计算,至少需要编写1305个getter/setter方法、87个Mapper接口和对应的XML文件。而使用mybatis-generator后,整个生成过程只用了不到10分钟,且保证了命名规范的一致性。
2. 环境准备与插件配置
2.1 基础环境要求
在开始前需要确保:
- JDK 1.8+(推荐JDK11)
- Maven 3.6+(用于构建)
- IDE(IntelliJ IDEA或Eclipse)
- 数据库驱动(根据实际数据库类型准备)
2.2 插件引入方式
在pom.xml中添加如下配置:
xml复制<build>
<plugins>
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.4.1</version>
<dependencies>
<!-- 添加数据库驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.28</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
注意:不同数据库需要对应驱动,Oracle需使用ojdbc8,SQL Server需使用mssql-jdbc
2.3 配置文件详解
在resources目录下创建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="mysqlTables" 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.model"
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.dao"
targetProject="src/main/java">
<property name="enableSubPackages" value="true"/>
</javaClientGenerator>
<!-- 指定要生成的表 -->
<table tableName="user_info" domainObjectName="User"/>
<table tableName="account" domainObjectName="Account"/>
</context>
</generatorConfiguration>
3. 核心功能实现与定制
3.1 指定表生成策略
在实际项目中,我们通常不需要生成整个数据库的所有表。有三种指定表的方案:
- 精确指定(推荐):
xml复制<table tableName="user" domainObjectName="User"/>
- 通配符匹配:
xml复制<table tableName="order_*" />
- 排除特定表:
xml复制<table tableName="%" enableCountByExample="false"
enableUpdateByExample="false" enableDeleteByExample="false"
enableSelectByExample="false" selectByExampleQueryId="false">
<exclude tableName="temp_*"/>
</table>
3.2 字段映射高级配置
对于特殊字段类型,可以自定义Java类型映射:
xml复制<table tableName="user">
<columnOverride column="created_at" javaType="java.time.LocalDateTime"/>
<columnOverride column="status"
javaType="com.example.enums.UserStatus"
jdbcType="TINYINT"/>
</table>
3.3 生成代码风格控制
通过配置可以控制生成的代码风格:
xml复制<javaModelGenerator>
<!-- 使用Lombok注解 -->
<property name="rootClass" value="com.example.BaseEntity"/>
<property name="useLombok" value="true"/>
</javaModelGenerator>
<javaClientGenerator>
<!-- 生成@Mapper注解 -->
<property name="annotation" value="org.apache.ibatis.annotations.Mapper"/>
</javaClientGenerator>
4. 执行生成与结果验证
4.1 执行生成命令
在项目根目录下执行:
bash复制mvn mybatis-generator:generate
或者在IDE中运行Maven插件的generate目标。
4.2 生成结果结构
成功执行后会生成如下结构:
code复制src/
├── main/
│ ├── java/
│ │ └── com/
│ │ └── example/
│ │ ├── model/ # 实体类
│ │ │ ├── User.java
│ │ │ └── Account.java
│ │ └── dao/ # Mapper接口
│ │ ├── UserMapper.java
│ │ └── AccountMapper.java
│ └── resources/
│ └── mapper/ # XML映射文件
│ ├── UserMapper.xml
│ └── AccountMapper.xml
4.3 生成代码示例
典型的实体类生成结果:
java复制public class User {
private Long id;
private String username;
private String password;
private LocalDateTime createTime;
// getters/setters
// equals/hashCode
// toString
}
对应的Mapper接口:
java复制public interface UserMapper {
int deleteByPrimaryKey(Long id);
int insert(User record);
User selectByPrimaryKey(Long id);
List<User> selectAll();
int updateByPrimaryKey(User record);
}
5. 高级技巧与实战经验
5.1 自定义插件开发
当默认功能不满足需求时,可以开发自定义插件。创建一个实现PluginAdapter的类:
java复制public class CustomCommentPlugin extends PluginAdapter {
@Override
public boolean modelFieldGenerated(Field field,
TopLevelClass topLevelClass,
IntrospectedColumn column,
IntrospectedTable table,
ModelClassType modelClassType) {
// 为字段添加Swagger注解
field.addAnnotation("@ApiModelProperty(value = \"" +
column.getRemarks() + "\")");
return true;
}
}
然后在配置中引用:
xml复制<plugin type="com.your.package.CustomCommentPlugin"/>
5.2 多数据源生成方案
对于需要从多个数据库生成代码的场景:
- 创建多个context配置
- 使用不同的jdbcConnection
- 指定不同的targetPackage
xml复制<context id="oracle" targetRuntime="MyBatis3">
<jdbcConnection driverClass="oracle.jdbc.OracleDriver".../>
<javaModelGenerator targetPackage="com.model.oracle".../>
</context>
<context id="mysql" targetRuntime="MyBatis3">
<jdbcConnection driverClass="com.mysql.jdbc.Driver".../>
<javaModelGenerator targetPackage="com.model.mysql".../>
</context>
5.3 增量生成策略
当表结构变更时,如何避免覆盖已有代码:
- 使用mergeable="true"配置:
xml复制<sqlMapGenerator>
<property name="mergeable" value="true"/>
</sqlMapGenerator>
- 对于Java文件,建议:
- 实体类:每次重新生成
- Mapper接口:继承自定义的BaseMapper
- 自定义SQL:使用@Select等注解或外部XML
