在企業級 Maven 多模塊架構中,合理配置 MyBatis Generator (MBG) 能實現Model、DAO 接口、Mapper XML的精準分層生成。本文以個人博客系統為例,詳細講解模塊劃分、POM 配置、Generator 配置文件編寫、驅動依賴處理與常見坑點。
blog-parent (pom)
├── blog-model # 實體類 (Entity/POJO)
├── blog-dao-api # DAO 接口 + MBG 插件配置 (核心生成模塊)
├── blog-dao-impl # Mapper XML 文件
└── blog-service # 業務邏輯 (依賴 dao-api, dao-impl)
依賴方向:dao-api → model,dao-impl → dao-api,service → dao-api, model。
<project>
<parent>
<groupId>pers.kaloquan</groupId>
<artifactId>blog</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>blog-dao-api</artifactId>
<properties>
<mysql-connector.version>5.1.40</mysql-connector.version>
<mybatis-generator.version>1.3.5</mybatis-generator.version>
<!-- MBG 插件配置屬性 -->
<plugin.generator.configurationFile>${project.basedir}/src/main/resources/mybatis-generator.xml</plugin.generator.configurationFile>
<plugin.generator.overwrite>true</plugin.generator.overwrite>
<!-- 生成目標項目根目錄 (關鍵:多模塊需絕對路徑) -->
<generator.project.root>D:/IDEAProjects/blog</generator.project.root>
<!-- 驅動包絕對路徑 (MBG 運行時需加載驅動) -->
<generator.classpath>D:/Maven repository/mysql/mysql-connector-java/5.1.40/mysql-connector-java-5.1.40.jar</generator.classpath>
<!-- 數據庫連接信息 -->
<jdbc.driverClass>com.mysql.jdbc.Driver</jdbc.driverClass>
<jdbc.url>jdbc:mysql://localhost:3306/blog?createDatabaseIfNotExist=true&useSSL=true&serverTimezone=UTC</jdbc.url>
<jdbc.userId>root</jdbc.userId>
<jdbc.password>root</jdbc.password>
</properties>
<dependencies>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.1</version>
</dependency>
<dependency>
<groupId>pers.kaloquan</groupId>
<artifactId>blog-model</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>${mybatis-generator.version}</version>
<configuration>
<configurationFile>${plugin.generator.configurationFile}</configurationFile>
<overwrite>${plugin.generator.overwrite}</overwrite>
</configuration>
<executions>
<execution>
<id>Generate MyBatis Artifacts</id>
<phase>generate-sources</phase> <!-- 綁定生命周期 -->
<goals>
<goal>generate</goal>
</goals>
</execution>
</executions>
<dependencies>
<!-- MBG 運行時依賴驅動 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql-connector.version}</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
</project>
<?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>
<!-- 驅動類加載路徑 (必須) -->
<classPathEntry location="${generator.classpath}"/>
<context id="ctx" targetRuntime="MyBatis3Simple"> <!-- 簡化運行時,無 Example 類 -->
<commentGenerator>
<property name="suppressDate" value="true"/> <!-- 不生成時間戳,減少版本衝突 -->
</commentGenerator>
<!-- 數據庫連接 (引用 POM 屬性) -->
<jdbcConnection driverClass="${jdbc.driverClass}"
connectionURL="${jdbc.url}"
userId="${jdbc.userId}"
password="${jdbc.password}"/>
<javaTypeResolver>
<property name="forceBigDecimals" value="false"/> <!-- DECIMAL/NUMERIC 生成 BigDecimal,非 Double -->
</javaTypeResolver>
<!-- 1. 實體類生成到 blog-model -->
<javaModelGenerator targetPackage="blog.model"
targetProject="${generator.project.root}/blog-model/src/main/java">
<property name="enableSubPackages" value="false"/>
<property name="trimStrings" value="true"/> <!-- 自動 trim 字符串字段 -->
</javaModelGenerator>
<!-- 2. Mapper XML 生成到 blog-dao-impl -->
<sqlMapGenerator targetPackage="mapper"
targetProject="${generator.project.root}/blog-dao-impl/src/main/resources">
<property name="enableSubPackages" value="false"/>
</sqlMapGenerator>
<!-- 3. DAO 接口生成到 blog-dao-api (使用註解模式) -->
<javaClientGenerator targetPackage="blog.dao"
targetProject="${generator.project.root}/blog-dao-api/src/main/java"
type="ANNOTATEDMAPPER"> <!-- 關鍵:註解模式 -->
<property name="enableSubPackages" value="false"/>
</javaClientGenerator>
<!-- 表配置 -->
<table tableName="user" schema="blog">
<columnOverride column="id" property="id"/>
<columnOverride column="name" property="name"/>
</table>
</context>
</generatorConfiguration>
| 配置項 | 作用 | 多模塊注意事項 |
|---|---|---|
targetRuntime="MyBatis3Simple" |
生成簡化版 Mapper (無 Example、無動態 SQL),適合註解模式 | 若需 Example 查詢,用 MyBatis3,但需生成 Example 類到 model 模塊 |
type="ANNOTATEDMAPPER" |
DAO 接口使用 @Select 等註解,無需 XML (XML 仍單獨生成) |
XML 由 sqlMapGenerator 生成到 dao-impl,接口與 XML 同名同包自動綁定 |
targetProject 絕對路徑 |
指定生成文件輸出目錄 | 必須用絕對路徑,相對路徑在多模塊下會解析錯誤。用 Maven 屬性 ${generator.project.root} 統一管理 |
classPathEntry 驅動路徑 |
MBG 運行時加載 JDBC 驅動 | 指向本地倉庫具體 Jar 絕對路徑,或配置 <plugin> dependencies 引入驅動 (推薦) |
overwrite=true |
覆蓋已存在文件 | 生產環境建議 false,配合版本控制手動合併 |
# 在 blog-dao-api 模塊執行
mvn clean mybatis-generator:generate
# 或綁定生命周期後,直接
mvn clean compile
blog-model/src/main/java/blog/model/User.java — 實體類 (含 getter/setter/toString)blog-dao-api/src/main/java/blog/dao/UserMapper.java — 註解式接口blog-dao-impl/src/main/resources/mapper/UserMapper.xml — XML 映射 (若 targetRuntime=MyBatis3)classPathEntry 路徑是否存在,或在 plugin dependencies 中顯式添加驅動依賴。targetProject 為絕對路徑,且目錄存在 (Maven 不會自動創建)。tableName 精確匹配數據庫實際表名。CommentGenerator 插件,控制註解、Lombok 註解、Builder 模式等。<context>,分別指定 jdbcConnection 與 table。<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<dependencies>
<dependency>
<groupId>com.github.jeffreyning</groupId>
<artifactId>mybatis-generator-plugin</artifactId>
<version>1.3.1</version>
</dependency>
</dependencies>
</plugin>
<!-- generatorConfig.xml 中 -->
<commentGenerator type="com.github.jeffreyning.mybatis.generator.PluginCommentGenerator">
<property name="generateEntityBuilder" value="true"/>
<property name="generateEntityToString" value="true"/>
<property name="lombok" value="true"/>
</commentGenerator>
通過合理的模塊劃分、Maven 屬性參數化、Generator 精準配置,MyBatis Generator 能完美融入多模塊項目,實現「改表結構 → 執行命令 → 代碼自動同步」的高效開發閉環,消除手寫映射的重複勞動與錯誤隱患。