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

MyBatis Generator 逆向工程實戰:從數據庫到代碼的全自動化生成

     編輯:Java 綜合教學

為什麼需要 MyBatis Generator?

手寫 Entity、Mapper 接口、XML 映射文件重複枯燥且易出錯。MyBatis Generator (MBG) 通過讀取數據庫元數據,自動生成:

  • POJO (Entity):含字段、Getter/Setter、構造器、toString
  • Mapper 接口:CRUD 方法(insert/updateByPrimaryKey/selectByExample 等)
  • Mapper XML:SQL 語句、resultMap、動態 where 條件
  • Example 類:類型安全的動態查詢構建器(Criteria 鏈式調用)

Maven 整合配置

1. 插件依賴

<plugin>
    <groupId>org.mybatis.generator</groupId>
    <artifactId>mybatis-generator-maven-plugin</artifactId>
    <version>1.4.2</version>
    <configuration>
        <configurationFile>src/main/resources/generatorConfig.xml</configurationFile>
        <verbose>true</verbose>
        <overwrite>true</overwrite>
    </configuration>
    <dependencies>
        <dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.33</version></dependency>
        <dependency><groupId>org.mybatis.generator</groupId><artifactId>mybatis-generator-core</artifactId><version>1.4.2</version></dependency>
    </dependencies>
</plugin>

2. generatorConfig.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>
    <properties resource="jdbc.properties"/>
    <classPathEntry location="${jdbc.driverLocation}"/>

    <context id="default" targetRuntime="MyBatis3">
        <commentGenerator>
            <property name="suppressDate" value="true"/>
            <property name="suppressAllComments" value="true"/>
        </commentGenerator>

        <jdbcConnection driverClass="${jdbc.driverClass}"
                        connectionURL="${jdbc.url}"
                        userId="${jdbc.user}"
                        password="${jdbc.password}">
        </jdbcConnection>

        <javaTypeResolver><property name="forceBigDecimals" value="false"/></javaTypeResolver>

        <javaModelGenerator targetPackage="com.example.demo.entity" targetProject="src/main/java">
            <property name="enableSubPackages" value="false"/>
            <property name="constructorBased" value="true"/>
            <property name="trimStrings" value="true"/>
        </javaModelGenerator>

        <sqlMapGenerator targetPackage="com.example.demo.mapper.xml" targetProject="src/main/resources">
            <property name="enableSubPackages" value="false"/>
        </sqlMapGenerator>

        <javaClientGenerator type="XMLMAPPER" targetPackage="com.example.demo.mapper" targetProject="src/main/java">
            <property name="enableSubPackages" value="false"/>
        </javaClientGenerator>

        <table tableName="user" domainObjectName="User">
            <generatedKey column="id" sqlStatement="MySQL" identity="true"/>
        </table>
        <!-- 多表可配置多個 table 節點,或用 tableName="%" 生成全部 -->
    </context>
</generatorConfiguration>

3. jdbc.properties

jdbc.driverLocation=/path/to/mysql-connector-java-8.0.33.jar
jdbc.driverClass=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/demo?useSSL=false&serverTimezone=UTC&characterEncoding=utf8
jdbc.user=root
jdbc.password=123456

IDEA 一鍵運行

  1. Maven 面板 → Plugins → mybatis-generator → mybatis-generator:generate
  2. 或 Run Configuration → Maven → Command: mybatis-generator:generate -e

實戰場景:Example 動態查詢最佳實踐

場景一:多條件精確刪除

public int deleteUserApply(Long userId, Long teamId) {
    UserApplyExample example = new UserApplyExample();
    example.createCriteria()
           .andUserIdEqualTo(userId)
           .andTeamIdEqualTo(teamId);
    return userApplyMapper.deleteByExample(example);
}

場景二:非主鍵更新(樂觀鎖版本控制)

public int updateTeamScore(TeamInfo team) {
    TeamInfoExample example = new TeamInfoExample();
    example.createCriteria().andTeamIdEqualTo(team.getTeamId());
    // updateByExampleSelective 僅更新非 null 字段
    return teamInfoMapper.updateByExampleSelective(team, example);
}

場景三:模糊查詢 + 排序 + 分頁

public List<TeamInfo> searchByName(String name, int page, int size) {
    TeamInfoExample example = new TeamInfoExample();
    example.createCriteria().andTeamNameLike("%" + name + "%").andEnableEqualTo((short)1);
    example.setOrderByClause("team_score DESC, create_time ASC");
    example.setOffset((page - 1) * size);
    example.setLimit(size);
    return teamInfoMapper.selectByExample(example);
}

場景四:範圍查詢(分數區間)

public TeamLevel getLevelByScore(long score) {
    TeamLevelExample example = new TeamLevelExample();
    example.createCriteria()
           .andNeedScoreLessThanOrEqualTo(score)
           .andUpScoreGreaterThan(score);
    List<TeamLevel> list = teamLevelMapper.selectByExample(example);
    return list.isEmpty() ? null : list.get(0);
}

進階技巧與避坑

問題解決方案
生成代碼覆蓋手動修改將手動代碼抽取到 _Custom 擴展類,或使用 @Generated 註解標識保護區
大表生成緩慢指定 <table tableName="core_%"> 只生成核心表
主鍵策略不匹配配置 <generatedKey>:MySQL 用 identity="true",Oracle 用 sqlStatement 指定序列
Enum 類型映射實現 TypeHandler,在 <columnOverride> 指定 javaType/typeHandler

總結

MyBatis Generator 將「數據庫 Schema → Java 代碼」的機械勞動自動化,配合 Example 動態查詢,極大提升開發效率。掌握 generatorConfig.xml 核心節點配置、主鍵策略映射、Example 靈活用法,即可在項目中穩定落地逆向工程流程。

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