手寫 Entity、Mapper 接口、XML 映射文件重複枯燥且易出錯。MyBatis Generator (MBG) 通過讀取數據庫元數據,自動生成:
toStringinsert/updateByPrimaryKey/selectByExample 等)resultMap、動態 where 條件Criteria 鏈式調用)<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>
<?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>
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
mybatis-generator:generate -epublic 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 靈活用法,即可在項目中穩定落地逆向工程流程。