MyBatis Generator (MBG) 是官方提供的代碼生成工具,支持通過數據庫表結構自動生成:
MBG 解決了 80% 的單表 CRUD 重複代碼編寫工作,讓開發者專注於複雜的關聯查詢、存儲過程等業務邏輯。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
"https://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
<!-- JDBC 驅動包位置 -->
<classPathEntry location="lib/mysql-connector-j-8.0.33.jar"/>
<context id="mysql-context" targetRuntime="MyBatis3">
<!-- 註釋生成配置 -->
<commentGenerator>
<property name="suppressAllComments" value="true"/>
<property name="suppressDate" value="true"/>
</commentGenerator>
<!-- 數據庫連接 -->
<jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"
connectionURL="jdbc:mysql://127.0.0.1:3306/mybatis_db?characterEncoding=utf8"
userId="root" password="123456"/>
<!-- 類型解析:decimal/numeric -> Integer -->
<javaTypeResolver>
<property name="forceBigDecimals" value="false"/>
</javaTypeResolver>
<!-- 實體類生成配置 -->
<javaModelGenerator targetPackage="david.model" targetProject="src">
<property name="enableSubPackages" value="true"/>
<property name="trimStrings" value="true"/>
</javaModelGenerator>
<!-- XML 映射文件生成 -->
<sqlMapGenerator targetPackage="david.mappers" targetProject="src">
<property name="enableSubPackages" value="true"/>
</sqlMapGenerator>
<!-- Mapper 接口生成 -->
<javaClientGenerator targetPackage="david.mapper" type="XMLMAPPER" targetProject="src">
<property name="enableSubPackages" value="true"/>
<property name="methodNameCalculator" value="extended"/>
</javaClientGenerator>
<!-- 表配置:核心業務配置區 -->
<table schema="mybatis_db" tableName="visitor" domainObjectName="Visitor"
enableCountByExample="false" enableUpdateByExample="false"
enableDeleteByExample="false" enableSelectByExample="false"
selectByExampleQueryId="false">
<!-- 主鍵生成策略:MySQL 自增 -->
<generatedKey column="id" sqlStatement="MySql"/>
<!-- 列名覆蓋:數據庫列名 -> 實體屬性名 -->
<columnOverride column="name" property="visitorName"/>
<!-- 忽略列:不生成對應字段 -->
<ignoreColumn column="status" delimitedColumnName="false"/>
</table>
</context>
</generatorConfiguration>
| 節點 | 作用 | 關鍵屬性 |
|---|---|---|
classPathEntry | JDBC 驅動 JAR 路徑 | location |
context | 一套生成上下文(可多數據庫) | id, targetRuntime="MyBatis3" |
commentGenerator | 控制生成代碼註釋 | suppressAllComments, suppressDate |
jdbcConnection | 數據庫連接信息 | driverClass, connectionURL, userId, password |
javaTypeResolver | JDBC 類型 -> Java 類型映射 | forceBigDecimals |
javaModelGenerator | 實體類生成目標包/目錄 | targetPackage, targetProject, enableSubPackages |
sqlMapGenerator | XML 文件生成目標 | targetPackage, targetProject |
javaClientGenerator | Mapper 接口生成目標 | targetPackage, type="XMLMAPPER", methodNameCalculator |
table | 單表生成配置 | schema, tableName, domainObjectName, enableXxxByExample, generatedKey, columnOverride, ignoreColumn |
public class MbGenerator {
public static void main(String[] args) throws Exception {
List<String> warnings = new ArrayList<>();
boolean overwrite = true; // 覆蓋 XML,保留 Java 衝突文件
File configFile = new File("src/david/mbg/mbg-configuration.xml");
ConfigurationParser cp = new ConfigurationParser(warnings);
Configuration config = cp.parseConfiguration(configFile);
DefaultShellCallback callback = new DefaultShellCallback(overwrite);
MyBatisGenerator generator = new MyBatisGenerator(config, callback, warnings);
generator.generate(null);
warnings.forEach(System.out::println);
System.out.println("MBG 代碼生成完成!");
}
}
src/
├── david.model
│ ├── Visitor.java // 主實體類
│ ├── VisitorExample.java // 動態查詢條件類(已禁用)
│ └── VisitorKey.java // 主鍵類(單主鍵時通常不生成)
├── david.mapper
│ └── VisitorMapper.java // Mapper 接口
└── david.mappers
└── VisitorMapper.xml // SQL 映射文件
public interface VisitorMapper {
int insert(Visitor record);
int insertSelective(Visitor record);
Visitor selectByPrimaryKey(Integer id);
int updateByPrimaryKeySelective(Visitor record);
int updateByPrimaryKey(Visitor record);
int deleteByPrimaryKey(Integer id);
// Example 相關方法已通過配置禁用
}
public class MbGeneratorTest {
public static void testCRUD() {
SqlSession session = MybatisUtils.getSqlSession();
try {
VisitorMapper mapper = session.getMapper(VisitorMapper.class);
// 新增
Visitor visitor = new Visitor();
visitor.setVisitorName("AutoGen");
visitor.setEmail("autogen@example.com");
visitor.setCreateTime(new Date());
int insertCount = mapper.insert(visitor);
session.commit();
System.out.println("新增 ID: " + visitor.getId()); // 主鍵回填
// 查詢
Visitor queried = mapper.selectByPrimaryKey(visitor.getId());
System.out.println("查詢: " + queried);
// 更新
queried.setVisitorName("AutoGen-Updated");
int updateCount = mapper.updateByPrimaryKey(queried);
session.commit();
// 刪除
int deleteCount = mapper.deleteByPrimaryKey(visitor.getId());
session.commit();
} finally {
MybatisUtils.closeSession(session);
}
}
}
<table tableName="visitor" domainObjectName="Visitor" .../>
<table tableName="website" domainObjectName="Website" .../>
<table tableName="channel" domainObjectName="Channel" .../>
MBG 運行時會合併現有 XML 文件:保留手寫的複雜查詢,只覆蓋生成的標準 CRUD 節點。Java 文件默認覆蓋,建議:
toString()、驗證註解等<sql> 片段<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.4.2</version>
<configuration>
<configurationFile>src/main/resources/mbg-configuration.xml</configurationFile>
<overwrite>true</overwrite>
<verbose>true</verbose>
</configuration>
<dependencies>
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<version>8.0.33</version>
</dependency>
</dependencies>
</plugin>
運行:mvn mybatis-generator:generate
enableXxxByExample="false" 減少冗余代碼,改用 MyBatis 動態 SQLgeneratedKey sqlStatement="MySql",Oracle 用 SequencecolumnOverride 統一數據庫下劃線 -> Java 駝峰MyBatis Generator 是消除單表 CRUD 樣板代碼的利器。通過精心配置 mbg-configuration.xml,可生成符合項目規範的實體、Mapper、XML 全套代碼。掌握「配置一次、多次生成、手工微調」的工作流,配合 Maven 插件集成到構建流程,能顯著提升團隊開發效率,讓開發者專注於核心業務邏輯實現。