Mybatis代碼生成器Mybatis Generator(MBG)實戰(zhàn)詳解
前言
本文我們主要實戰(zhàn)Mybatis官方的代碼生成器:Mybatis Generator(MBG),掌握它以后,可以簡化大部分手寫代碼,我們只需要寫復雜邏輯代碼!
我們掌握了在SpringBoot下Mybatis的基本用法操作步驟回顧一下:
- 創(chuàng)建與MySQL表對應的Java PO對象,字段一一對應;
- 創(chuàng)建Mapper接口,和對應的XML映射文件(或注解)。
在實際開發(fā)中,你會發(fā)現(xiàn)有很多重復的工作:
- 首先是PO對象,我們往往創(chuàng)建與數(shù)據(jù)庫表字段一一對應的PO對象;
- 其次在Mapper里,通常都會寫基本的增刪改查代碼。
重復不符合我們程序員的風格:
- 其實對于PO對象,只需要讀取數(shù)據(jù)庫表字段,然后做SQL列類型與Java字段類型轉(zhuǎn)換,再將列名轉(zhuǎn)成駱駝命名就可以實現(xiàn),所以能實現(xiàn)的代碼生成器也非常多!
- 再者對于單表的基本增刪改查是ORM的基本功能,像JPA對單表的基本增刪改查都進行了封裝!那么在Mybatis里,這些當然也不在話下,Mybatis官方為我們提供了非常好用的代碼生成器:Mybatis Generator (MBG) 。
本文就帶大家實戰(zhàn)一下Mybatis Generator,用它生成實戰(zhàn)項目全部表的PO對象和基本增刪改查代碼!
一、Mybatis Generator簡介
Mybatis Generator(MBG)是Mybatis官方提供的一個代碼生成工具,它可以根據(jù)數(shù)據(jù)庫表自動生成對應的Java Model、Mapper和XML文件,甚至還可以生成一些高級查詢功能,使用Mybatis-Generator可以大大降低開發(fā)者的工作量,提高開發(fā)效率!
支持使用Maven插件生成,也支持編寫Java代碼生成,還有命令行等等多種方式!
支持生成XML映射文件風格的代碼,也支持生成全注解風格的代碼!
二、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 ,用于配置生成風格,數(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風格 --> <context id="simple" targetRuntime="MyBatis3Simple"> <property name="javaFileEncoding" value="UTF-8"/> <!--生成mapper.xml時覆蓋原文件--> <plugin type="org.mybatis.generator.plugins.UnmergeableXmlMappersPlugin"/> <commentGenerator> <!-- 是否去除自動生成的注釋 true:是 : false:否。 自動生成注釋太啰嗦,可以編碼擴展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"/> <!-- 要生成對應表配置 --> <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風格
上面配置的是MyBatis3Simple風格,只配置了一個表:user,雙擊插件的mybatis-generator:generate以后,生成的代碼如下:
MyBatis3Simple風格生成的代碼比較精簡,看一看UserMapper的接口方法,只有基本的增刪改查方法:
public interface UserMapper { int deleteByPrimaryKey(Integer id); int insert(User record); User selectByPrimaryKey(Integer id); List<User> selectAll(); int updateByPrimaryKey(User record); }
MyBatis3風格
我們再看看MyBatis3風格,只需要將 targetRuntime=“MyBatis3Simple” 修改為 targetRuntime=“MyBatis3”,然后再雙擊插件的mybatis-generator:generate,就可以看到增加了 “by example” 和 “selective” 方法
- selective方法:選擇性插入或更新,判斷PO字段不為空才插入或修改。在只需要插入或修改個別字段值時使用,對應生成的SQL不包括
=null
的字段,但同樣也需要注意,你無法用它將字段設(shè)置為null。 ?? - by example方法:這個東西有點小強大,可以動態(tài)生成各種查詢條件,在后面的接口開發(fā)實戰(zhàn)中我們再使用。但就是生成的代碼有點多,沒有實現(xiàn)example代碼的復用。對于單表復雜查詢喜歡直接SQL的,可以禁用生成example,可以通過table節(jié)點的如下配置來指定是否啟用。
屬性 | 說明 |
---|---|
enableSelectByExample | 是否啟用生成selectByExample |
enableDeleteByExample | 是否啟用生成deleteByExample |
enableCountByExample | 是否啟用生成countByExample |
enableUpdateByExample | 是否啟用生成updateByExample和updateByExampleSelective |
MyBatis3DynamicSql風格
只需要將 targetRuntime=“MyBatis3” 修改為 targetRuntime=“MyBatis3DynamicSql”。
生成的代碼是全注解風格的,也就不會生成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代碼配置的方式, 相當于把 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)成好習慣,一步一提交!
總結(jié)
本文主要介紹了Mybatis Generator (MBG)生成代碼的2種生成方式(當然還支持其它方式):
- Maven插件方式
- Java代碼方式
以及generatorConfig.xml配置的3種生成風格:
- MyBatis3Simple風格
- MyBatis3風格
- MyBatis3DynamicSql風格
以上就是Mybatis代碼生成器Mybatis Generator(MBG)實戰(zhàn)詳解的詳細內(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-01Spring Cloud @RefreshScope 原理及使用
這篇文章主要介紹了Spring Cloud @RefreshScope 原理及使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-01-01詳解SpringMVC組件之HandlerMapping(二)
這篇文章主要介紹了詳解SpringMVC組件之HandlerMapping(二),HandlerMapping組件是Spring?MVC核心組件,用來根據(jù)請求的request查找對應的Handler,在Spring?MVC中,有各式各樣的Web請求,每個請求都需要一個對應的Handler來處理,需要的朋友可以參考下2023-08-08springboot 使用yml配置文件給靜態(tài)變量賦值教程
這篇文章主要介紹了springboot 使用yml配置文件給靜態(tài)變量賦值教程,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-04-04Spring Date jpa 獲取最新一條數(shù)據(jù)的實例代碼
這篇文章主要介紹了Spring Date jpa 獲取最新一條數(shù)據(jù)的實例代碼,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-10-10