Mybatis代碼生成器Mybatis Generator(MBG)實戰(zhàn)詳解
前言
本文我們主要實戰(zhàn)Mybatis官方的代碼生成器:Mybatis Generator(MBG),掌握它以后,可以簡化大部分手寫代碼,我們只需要寫復(fù)雜邏輯代碼!
我們掌握了在SpringBoot下Mybatis的基本用法操作步驟回顧一下:
- 創(chuàng)建與MySQL表對應(yīng)的Java PO對象,字段一一對應(yīng);
- 創(chuàng)建Mapper接口,和對應(yīng)的XML映射文件(或注解)。
在實際開發(fā)中,你會發(fā)現(xiàn)有很多重復(fù)的工作:
- 首先是PO對象,我們往往創(chuàng)建與數(shù)據(jù)庫表字段一一對應(yīng)的PO對象;
- 其次在Mapper里,通常都會寫基本的增刪改查代碼。
重復(fù)不符合我們程序員的風(fēng)格:
- 其實對于PO對象,只需要讀取數(shù)據(jù)庫表字段,然后做SQL列類型與Java字段類型轉(zhuǎn)換,再將列名轉(zhuǎn)成駱駝命名就可以實現(xiàn),所以能實現(xiàn)的代碼生成器也非常多!
- 再者對于單表的基本增刪改查是ORM的基本功能,像JPA對單表的基本增刪改查都進(jìn)行了封裝!那么在Mybatis里,這些當(dāng)然也不在話下,Mybatis官方為我們提供了非常好用的代碼生成器:Mybatis Generator (MBG) 。
本文就帶大家實戰(zhàn)一下Mybatis Generator,用它生成實戰(zhàn)項目全部表的PO對象和基本增刪改查代碼!
一、Mybatis Generator簡介
Mybatis Generator(MBG)是Mybatis官方提供的一個代碼生成工具,它可以根據(jù)數(shù)據(jù)庫表自動生成對應(yīng)的Java Model、Mapper和XML文件,甚至還可以生成一些高級查詢功能,使用Mybatis-Generator可以大大降低開發(fā)者的工作量,提高開發(fā)效率!
支持使用Maven插件生成,也支持編寫Java代碼生成,還有命令行等等多種方式!
支持生成XML映射文件風(fēng)格的代碼,也支持生成全注解風(fēng)格的代碼!
二、Maven插件運行方式
首先在工程tg-book-dal的pom.xml中,根節(jié)點project下添加build節(jié)點,如下:
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.7</version>
<configuration>
<verbose>true</verbose>
<overwrite>true</overwrite>
</configuration>
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.21</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
然后刷新tg-book-dal的Maven依賴,你就能看到mybatis-generator插件了,如下圖:

注意,這時生成時會報錯,因為我們還需要添加配置文件,接著向下看.
三、生成配置 generatorConfig.xml
在tg-book-dal 的 src/main/resources 下 添加配置文件: generatorConfig.xml ,用于配置生成風(fēng)格,數(shù)據(jù)庫連接、生成代碼包路徑、生成哪些表等等,各配置參數(shù)詳解參考注釋:注意:==我增加了幾個實用的可選配置,像生成時覆蓋原文件、去除注釋、自增主鍵列、columnOverride ==
<!DOCTYPE generatorConfiguration PUBLIC
"-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
"http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
<!-- MyBatis3Simple風(fēng)格 -->
<context id="simple" targetRuntime="MyBatis3Simple">
<property name="javaFileEncoding" value="UTF-8"/>
<!--生成mapper.xml時覆蓋原文件-->
<plugin type="org.mybatis.generator.plugins.UnmergeableXmlMappersPlugin"/>
<commentGenerator>
<!-- 是否去除自動生成的注釋 true:是 : false:否。 自動生成注釋太啰嗦,可以編碼擴(kuò)展CommentGenerator -->
<property name="suppressAllComments" value="true"/>
</commentGenerator>
<!-- 數(shù)據(jù)庫連接 -->
<jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/db_book?useUnicode=true&characterEncoding=utf8&tinyInt1isBit=true&serverTimezone=UTC"
userId="root" password="root">
<!-- 設(shè)置為true就只讀取db_book下的表, 否則會優(yōu)先讀取到mysql的user表 -->
<property name="nullCatalogMeansCurrent" value="true"/>
</jdbcConnection>
<!-- 生成PO的包名和位置 -->
<javaModelGenerator targetPackage="org.tg.book.dal.po.mbg" targetProject="src/main/java"/>
<!-- 生成XML映射文件的包名和位置 -->
<sqlMapGenerator targetPackage="org.tg.book.dal.mapper.mbg" targetProject="src/main/resources"/>
<!-- 生成Mapper接口的包名和位置 -->
<javaClientGenerator type="XMLMAPPER" targetPackage="org.tg.book.dal.mapper.mbg" targetProject="src/main/java"/>
<!-- 要生成對應(yīng)表配置 -->
<table tableName="user" domainObjectName="User" >
<!-- 自增主鍵列 -->
<generatedKey column="id" sqlStatement="MYSQL" identity="true"/>
<!-- tinyint映射為Integer -->
<columnOverride column="role" javaType="Integer" jdbcType="TINYINT"/>
</table>
</context>
</generatorConfiguration>
MyBatis3Simple風(fēng)格
上面配置的是MyBatis3Simple風(fēng)格,只配置了一個表:user,雙擊插件的mybatis-generator:generate以后,生成的代碼如下:

MyBatis3Simple風(fēng)格生成的代碼比較精簡,看一看UserMapper的接口方法,只有基本的增刪改查方法:
public interface UserMapper {
int deleteByPrimaryKey(Integer id);
int insert(User record);
User selectByPrimaryKey(Integer id);
List<User> selectAll();
int updateByPrimaryKey(User record);
}
MyBatis3風(fēng)格
我們再看看MyBatis3風(fēng)格,只需要將 targetRuntime=“MyBatis3Simple” 修改為 targetRuntime=“MyBatis3”,然后再雙擊插件的mybatis-generator:generate,就可以看到增加了 “by example” 和 “selective” 方法

- selective方法:選擇性插入或更新,判斷PO字段不為空才插入或修改。在只需要插入或修改個別字段值時使用,對應(yīng)生成的SQL不包括
=null的字段,但同樣也需要注意,你無法用它將字段設(shè)置為null。 ?? - by example方法:這個東西有點小強(qiáng)大,可以動態(tài)生成各種查詢條件,在后面的接口開發(fā)實戰(zhàn)中我們再使用。但就是生成的代碼有點多,沒有實現(xiàn)example代碼的復(fù)用。對于單表復(fù)雜查詢喜歡直接SQL的,可以禁用生成example,可以通過table節(jié)點的如下配置來指定是否啟用。
| 屬性 | 說明 |
|---|---|
| enableSelectByExample | 是否啟用生成selectByExample |
| enableDeleteByExample | 是否啟用生成deleteByExample |
| enableCountByExample | 是否啟用生成countByExample |
| enableUpdateByExample | 是否啟用生成updateByExample和updateByExampleSelective |
MyBatis3DynamicSql風(fēng)格
只需要將 targetRuntime=“MyBatis3” 修改為 targetRuntime=“MyBatis3DynamicSql”。
生成的代碼是全注解風(fēng)格的,也就不會生成UserMapper.xml和UserExample類,而是新生成了UserDynamicSqlSupport類。
需要增加mybatis-dynamic-sql依賴包:
<!--mybatis-dynamic-sql-->
<dependency>
<groupId>org.mybatis.dynamic-sql</groupId>
<artifactId>mybatis-dynamic-sql</artifactId>
<version>1.1.4</version>
</dependency>
四、Java代碼運行方式
除了使用插件運行方式來生成,我們還可以以Java代碼方式運行,添加mybatis-generator-core依賴包,如下:
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.3.7</version>
</dependency>
添加main方法,如下:
package org.tg.book.dal;
import org.mybatis.generator.api.MyBatisGenerator;
import org.mybatis.generator.config.Configuration;
import org.mybatis.generator.config.xml.ConfigurationParser;
import org.mybatis.generator.exception.InvalidConfigurationException;
import org.mybatis.generator.exception.XMLParserException;
import org.mybatis.generator.internal.DefaultShellCallback;
import java.io.File;
import java.io.IOException;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
public class MybatisGeneratorRunner {
public static void main(String[] args) throws XMLParserException, IOException, InvalidConfigurationException, SQLException, InterruptedException {
List<String> warnings = new ArrayList<String>();
boolean overwrite = true;
// 使用xml配置文件的方式
File configFile = new File(MybatisGeneratorRunner.class.getClassLoader().getResource("generatorConfig.xml").getPath());
ConfigurationParser cp = new ConfigurationParser(warnings);
Configuration config = cp.parseConfiguration(configFile);
// 使用純Java代碼配置的方式, 相當(dāng)于把 generatorConfig.xml配置的都用java代碼配置到config中
// config = new Configuration();
DefaultShellCallback callback = new DefaultShellCallback(overwrite);
MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings);
myBatisGenerator.generate(null);
System.out.println(warnings);
}
}
注意:我執(zhí)行后生成到父項目下了??,需要修改
generatorConfig.xml將targetProject加上項目名稱,如下:
<!-- 生成PO的包名和位置 --> <javaModelGenerator targetPackage="org.tg.book.dal.po.mbg" targetProject="tg-book-dal/src/main/java"/> <!-- 生成XML映射文件的包名和位置 --> <sqlMapGenerator targetPackage="org.tg.book.dal.mapper.mbg" targetProject="tg-book-dal/src/main/resources"/> <!-- 生成Mapper接口的包名和位置 --> <javaClientGenerator type="XMLMAPPER" targetPackage="org.tg.book.dal.mapper.mbg" targetProject="tg-book-dal/src/main/java"/>
targetProject加上tg-book-dal以后用插件生成,又提示目錄找不到,汗(⊙﹏⊙)b
[WARNING] The specified target project directory tg-book-dal/src/main/resources does not exist [WARNING] The specified target project directory tg-book-dal/src/main/java does not exist [WARNING] The specified target project directory tg-book-dal/src/main/java does not exist [WARNING] The specified target project directory tg-book-dal/src/main/java does not exist
五、MGB生成全部表
一共8張表,主要注意點:
- generatedKey:配置自增id
- columnOverride:指定tinyint列映射到Java類型是Integer還是Boolean
除了user的另外7張表配置:
<table tableName="book" domainObjectName="Book" >
<generatedKey column="id" sqlStatement="MYSQL" identity="true"/>
<columnOverride column="status" javaType="Integer" jdbcType="TINYINT"/>
<columnOverride column="is_recommend" javaType="Boolean" jdbcType="TINYINT"/>
</table>
<table tableName="book_borrowing" domainObjectName="BookBorrowing" >
<generatedKey column="id" sqlStatement="MYSQL" identity="true"/>
<columnOverride column="status" javaType="Integer" jdbcType="TINYINT"/>
</table>
<table tableName="book_comment" domainObjectName="BookComment" >
<generatedKey column="id" sqlStatement="MYSQL" identity="true"/>
<columnOverride column="score" javaType="Integer" jdbcType="TINYINT"/>
</table>
<table tableName="book_favorite" domainObjectName="BookFavorite" >
<generatedKey column="id" sqlStatement="MYSQL" identity="true"/>
<columnOverride column="is_cancelled" javaType="Boolean" jdbcType="TINYINT"/>
</table>
<table tableName="notice" domainObjectName="Notice" >
<generatedKey column="id" sqlStatement="MYSQL" identity="true"/>
<columnOverride column="is_deleted" javaType="Boolean" jdbcType="TINYINT"/>
</table>
<table tableName="qualification" domainObjectName="Qualification" >
<generatedKey column="id" sqlStatement="MYSQL" identity="true"/>
<columnOverride column="status" javaType="Integer" jdbcType="TINYINT"/>
</table>
<table tableName="student" domainObjectName="Student" >
<generatedKey column="id" sqlStatement="MYSQL" identity="true"/>
<columnOverride column="is_approved" javaType="Boolean" jdbcType="TINYINT"/>
<columnOverride column="is_frozen" javaType="Boolean" jdbcType="TINYINT"/>
</table>
六、增加Ext包
mbg包的代碼我們不做任何修改,為了便于區(qū)分,我們將自定義的PO和Mapper單獨放到ext包下,命名以Ext結(jié)尾。
- 原來的UserMapper修改為UserMapperExt
- 刪除原來的BookMapper和BookMapperImpl,用MBG生成的BookMapper替代,原來引用的關(guān)聯(lián)代碼都修改一下
- 刪除原來的PO對象:User和Book,用MBG生成的User和Book替代,原來引用的關(guān)聯(lián)代碼都修改一下
- AuthServiceImpl、BookServiceImpl、UserServiceImpl都有修改的點
最終結(jié)構(gòu)dal的 mapper和po包,如下:

最終的mapper XML映射文件,如下:

七、Git提交
養(yǎng)成好習(xí)慣,一步一提交!

總結(jié)
本文主要介紹了Mybatis Generator (MBG)生成代碼的2種生成方式(當(dāng)然還支持其它方式):
- Maven插件方式
- Java代碼方式
以及generatorConfig.xml配置的3種生成風(fēng)格:
- MyBatis3Simple風(fēng)格
- MyBatis3風(fēng)格
- MyBatis3DynamicSql風(fēng)格
以上就是Mybatis代碼生成器Mybatis Generator(MBG)實戰(zhàn)詳解的詳細(xì)內(nèi)容,更多關(guān)于Mybatis代碼生成器Mybatis Generator的資料請關(guān)注腳本之家其它相關(guān)文章!
- Mybatis generator修改Mapper.java文件實現(xiàn)詳解
- MyBatis?Generator?ORM層面的代碼自動生成器(推薦)
- 更簡單更高效的Mybatis?Plus最新代碼生成器AutoGenerator
- MybatisX-Generator自動代碼生成插件教程
- MyBatis-Plus中AutoGenerator的使用案例
- Mybatis-plus?代碼生成器?AutoGenerator?的簡介和使用詳解
- MyBatis Generator介紹及使用方法
- Mybatis-Plus開發(fā)提速器generator的使用
- MyBatis Generator配置入門
- mybatis-generator-gui根據(jù)需求改動示例
- MyBatis?Generator使用小結(jié)
相關(guān)文章
MyBatis #{}和${} |與數(shù)據(jù)庫連接池使用詳解
本文將為大家說說關(guān)于 #{} 和 ${},這個是 MyBatis 在面試中最常問的面試題,以及數(shù)據(jù)庫連接池相關(guān)的知識,感興趣的朋友跟隨小編一起看看吧2024-01-01
Spring Cloud @RefreshScope 原理及使用
這篇文章主要介紹了Spring Cloud @RefreshScope 原理及使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-01-01
詳解SpringMVC組件之HandlerMapping(二)
這篇文章主要介紹了詳解SpringMVC組件之HandlerMapping(二),HandlerMapping組件是Spring?MVC核心組件,用來根據(jù)請求的request查找對應(yīng)的Handler,在Spring?MVC中,有各式各樣的Web請求,每個請求都需要一個對應(yīng)的Handler來處理,需要的朋友可以參考下2023-08-08
springboot 使用yml配置文件給靜態(tài)變量賦值教程
這篇文章主要介紹了springboot 使用yml配置文件給靜態(tài)變量賦值教程,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-04-04
Spring Date jpa 獲取最新一條數(shù)據(jù)的實例代碼
這篇文章主要介紹了Spring Date jpa 獲取最新一條數(shù)據(jù)的實例代碼,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-10-10

