首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

MyBatis Generator 代碼生成器實戰:從數據庫表自動生成實體、Mapper、XML 全套代碼

     編輯:Java 相關知識

MyBatis Generator (MBG) 簡介

MyBatis Generator (MBG) 是官方提供的代碼生成工具,支持通過數據庫表結構自動生成:

  • 實體類 (POJO):包含主鍵類、非主鍵字段類、BLOB 字段類、Example 查詢條件類
  • Mapper 接口:標準 CRUD 方法(insert、updateByPrimaryKey、deleteByPrimaryKey、selectByPrimaryKey、selectByExample 等)
  • XML 映射文件:對應的 SQL 語句

MBG 解決了 80% 的單表 CRUD 重複代碼編寫工作,讓開發者專注於複雜的關聯查詢、存儲過程等業務邏輯。

MBG 配置文件詳解

mbg-configuration.xml 完整配置

<?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>

核心配置節點解析

節點作用關鍵屬性
classPathEntryJDBC 驅動 JAR 路徑location
context一套生成上下文(可多數據庫)id, targetRuntime="MyBatis3"
commentGenerator控制生成代碼註釋suppressAllComments, suppressDate
jdbcConnection數據庫連接信息driverClass, connectionURL, userId, password
javaTypeResolverJDBC 類型 -> Java 類型映射forceBigDecimals
javaModelGenerator實體類生成目標包/目錄targetPackage, targetProject, enableSubPackages
sqlMapGeneratorXML 文件生成目標targetPackage, targetProject
javaClientGeneratorMapper 接口生成目標targetPackage, type="XMLMAPPER", methodNameCalculator
table單表生成配置schema, tableName, domainObjectName, enableXxxByExample, generatedKey, columnOverride, ignoreColumn

Java 代碼運行生成

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 映射文件

VisitorMapper.java 接口方法

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);
        }
    }
}

進階配置技巧

1. 多表批量生成

<table tableName="visitor" domainObjectName="Visitor" .../>
<table tableName="website" domainObjectName="Website" .../>
<table tableName="channel" domainObjectName="Channel" .../>

2. 保留自定義 SQL(XML 合併機制)

MBG 運行時會合併現有 XML 文件:保留手寫的複雜查詢,只覆蓋生成的標準 CRUD 節點。Java 文件默認覆蓋,建議:

  • 實體類:生成後手動添加 toString()、驗證註解等
  • Mapper 接口:生成後添加自定義方法聲明
  • XML:手寫複雜查詢放在生成內容之外,或使用 <sql> 片段

3. 整合 Maven 插件(推薦)

<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

最佳實踐總結

  1. 僅生成單表 CRUD:關聯查詢、複雜報表、存儲過程手寫
  2. 禁用 Example:enableXxxByExample="false" 減少冗余代碼,改用 MyBatis 動態 SQL
  3. 主鍵策略匹配數據庫:MySQL 用 generatedKey sqlStatement="MySql",Oracle 用 Sequence
  4. 列名映射規範化:columnOverride 統一數據庫下劃線 -> Java 駝峰
  5. 版本控制生成代碼:納入 Git 管理,便於追蹤變更與團隊協作
  6. 定期重新生成:表結構變更後重新運行,保持代碼同步

總結

MyBatis Generator 是消除單表 CRUD 樣板代碼的利器。通過精心配置 mbg-configuration.xml,可生成符合項目規範的實體、Mapper、XML 全套代碼。掌握「配置一次、多次生成、手工微調」的工作流,配合 Maven 插件集成到構建流程,能顯著提升團隊開發效率,讓開發者專注於核心業務邏輯實現。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved