作為一名 Java 後端開發,日常工作中免不了要生成資料庫表對應的持久化物件 PO,運算元據庫的介面 DAO,以及 CRUD 的 XML,也就是 mapper。
Mybatis Generator 是 MyBatis 官方提供的一個程式碼生成工具,完全可以勝任這個工作,不過最近在開發“程式設計貓”開源網站的時候試用了一下 MyBatis-Plus 官方提供 AutoGenerator,發現配置更簡單,開發效率更高!於是就來給小夥伴們安利一波。
來個 GIF 感受一下 AutoGenerator 生成程式碼的快感吧。
一、使用 Mybatis Generator
為了形成鮮明的對比,我們先來使用 Mybatis Generator 生成一次程式碼,感受一下整個過程。
第一步,在 pom.xml 檔案中新增 MySQL+MyBatis 的依賴(Mybatis Generator 的前置條件)。
<!-- MySQL 連線池 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
<!--MyBatis 的 Spring Boot starter -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.2</version>
</dependency>
新增完成後,一定要執行一次 Maven 過載(見下圖),確保 MyBatis 的依賴載入完畢後再執行第二步。
否則下一步可能不通過,但又得不到任何錯誤提示。不要問我為什麼,踩過坑後痛苦的領悟。
新增完成後,可以通過 Maven 外掛來生成程式碼,也可以通過 Java 程式碼來生成程式碼,這裡以 Maven 外掛的形式來演示。Java 程式碼的形式可參照 Mybatis Generator:
第二步,在 pom.xml 的 MyBatis Generator 外掛,先來看一下整體的結構圖,注意是在 build→plugins 下節點下新增。
首先是 MyBatis Generator 外掛,目前最新版是 1.4.0,我們採用上一個穩定版本 1.3.7,穩一點。
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.7</version>
只新增外掛還不夠,還需要對其進行配置,我們使用 configurationFile 元素來指定一個配置檔案 mybatis-generator-config.xml:
<configurationFile>src/main/resources/mybatis-generator-config.xml</configurationFile>
來看一下 mybatis-generator-config.xml 的內容。
<generatorConfiguration>
<context id="myContext" targetRuntime="MyBatis3" defaultModelType="flat">
<!-- 註釋 -->
<commentGenerator>
<!-- 是否不生成註釋 -->
<property name="suppressAllComments" value="true"/>
</commentGenerator>
<!-- jdbc連線 -->
<jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"
connectionURL="jdbc:mysql://ip:3306/codingmoretiny02?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai&useSSL=false"
userId="codingmoretiny02"
password="123456">
<!--高版本的 mysql-connector-java 需要設定 nullCatalogMeansCurrent=true-->
<property name="nullCatalogMeansCurrent" value="true"/>
</jdbcConnection>
<!-- 型別轉換 -->
<javaTypeResolver>
<property name="forceBigDecimals" value="true"/>
</javaTypeResolver>
<!-- 生成實體類地址 -->
<javaModelGenerator targetPackage="com.codingmore.mbg.po" targetProject="src/main/java">
<!-- 是否針對string型別的欄位在set方法中進行修剪,預設false -->
<property name="trimStrings" value="true"/>
</javaModelGenerator>
<!-- 生成Mapper.xml檔案 -->
<sqlMapGenerator targetPackage="com.codingmore.mbg.mapper" targetProject="src/main/resources">
</sqlMapGenerator>
<!-- 生成 XxxMapper.java 介面-->
<javaClientGenerator targetPackage="com.codingmore.mbg.dao" targetProject="src/main/java" type="XMLMAPPER">
</javaClientGenerator>
<table schema="" tableName="user" domainObjectName="User"
enableCountByExample="false" enableDeleteByExample="false" enableSelectByExample="false"
enableUpdateByExample="false" selectByExampleQueryId="false">
</table>
</context>
</generatorConfiguration>
- 配置檔案至少得包含一個context
- commentGenerator 用來配置生成的註釋
- jdbcConnection 用來連結資料庫
- javaTypeResolver 配置 JDBC 與 Java 的型別轉換規則
- javaModelGenerator 配置 po 生成的包路徑和專案路徑
- sqlMapGenerator 配置 mapper.xml 檔案生成的目錄
- javaClientGenerator 配置 mapper.java 檔案生成的目錄
- 一個 table 對應一張表,如果想同時生成多張表,需要配置多個 table
更多配置資訊可以參照下面這篇文章:
由於資料庫表可能會發生變動,因此我們需要追加一個配置 <overwrite>true</overwrite>
,允許覆蓋舊的檔案。為了防止我們編寫的 SQL 語句被覆蓋掉,MyBatis Generator 只會覆蓋舊的 po、dao、而 *mapper.xml 不會覆蓋,而是追加。
Mybatis Generator 需要連結資料庫,所以還需要新增資料庫驅動依賴,就像這樣:
<configuration>
</configuration>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
這樣就會顯得比較冗餘,因為我們之前新增過了。好在 Maven 提供了 includeCompileDependencies 屬性,可以讓我們在外掛中引用之前新增的依賴。
<includeCompileDependencies>true</includeCompileDependencies>
到此為止,mybatis-generator-maven-plugin 就算是配置完成了,完整內容如下所示:
<build>
<plugins>
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.7</version>
<configuration>
<configurationFile>src/main/resources/mybatis-generator-config.xml</configurationFile>
<overwrite>true</overwrite><includeCompileDependencies>true</includeCompileDependencies>
</configuration>
</plugin>
</plugins>
</build>
配置完成後可以雙擊執行 Maven 的外掛 Mybatis Generator,沒有問題的話,可以看到生成後的檔案。
二、使用 MyBatis-Plus 的 AutoGenerator
MyBatis-Plus(簡寫 MP)是 MyBatis 的增強工具,官方宣稱 MP 和 MyBatis 的關係就好像魂鬥羅中的 1P 和 2P,可謂好基友,天下走。
AutoGenerator 是 MyBatis-Plus 推出的程式碼生成器,可以快速生成 Entity、Mapper、Mapper XML、Service、Controller 等各個模組的程式碼,比 Mybatis Generator 更強大,開發效率更高。
通過前面的體驗,想必大家確實感覺到了 Mybatis Generator 的繁瑣,接下來,我們來體驗一下 AutoGenerator,對比過後,大家心裡就有答案了。
第一步,在 pom.xml 檔案中新增 AutoGenerator 的依賴。
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.4.1</version>
</dependency>
第二步,新增模板引擎依賴,MyBatis-Plus 支援 Velocity(預設)、Freemarker、Beetl,這裡使用預設的 Velocity 引擎。
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity-engine-core</artifactId>
<version>2.3</version>
</dependency>
第三步,進行全域性配置。
// 全域性配置
GlobalConfig gc = new GlobalConfig();
String projectPath = System.getProperty("user.dir");
gc.setOutputDir(projectPath + "/src/main/java");
gc.setAuthor("沉默王二");
gc.setOpen(false);
gc.setDateType(DateType.ONLY_DATE);
gc.setSwagger2(true);
gc.setIdType(IdType.AUTO);
第四步,配置資料來源。
// 資料來源配置
DataSourceConfig dsc = new DataSourceConfig();
dsc.setUrl("jdbc:mysql://ip:3306/codingmoretiny02?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai");
dsc.setDriverName("com.mysql.cj.jdbc.Driver");
dsc.setUsername("codingmoretiny02");
dsc.setPassword("123456");
第五步,配置包。
// 包配置
PackageConfig pc = new PackageConfig();
pc.setParent("top.codingmore.mpg");
更多配置項可以到官方檢視:
示例程式碼示例如下所示:
public class CodeGenerator {
public static void main(String[] args) {
// 程式碼生成器
AutoGenerator mpg = new AutoGenerator();
GlobalConfig gc = new GlobalConfig();
String projectPath = System.getProperty("user.dir");
gc.setOutputDir(projectPath + "/src/main/java");
gc.setAuthor("沉默王二");
mpg.setGlobalConfig(gc);
DataSourceConfig dsc = new DataSourceConfig();
dsc.setDriverName("com.mysql.cj.jdbc.Driver");
mpg.setDataSource(dsc);
mpg.execute();
}
}
再來看一下執行後的效果,可以看到資料庫表對應的 controller、service、entity、mapper 等等全有了——爽歪歪:
三、總結對比
對比 Mybatis 的 Generator 和 MyBatis-Plus 的 AutoGenerator,就可以得出這樣一條結論:後者的配置更簡單,開發效率也更高,功能也更強大——可快速生成 Mapper 、 Model 、 Service 、 Controller 層程式碼。
MyBatis-Plus 的確配得上 Plus 啊,確實優秀。
想要完整示例的話,可以到 GitHub 上檢視:
https://github.com/itwanger/codingmore-learning/tree/main/codingmore-tiny-02
本篇已收錄至 GitHub 上星標 1.5k+ star 的開源專欄《Java 程式設計師進階之路》,該專欄風趣幽默、通俗易懂,對 Java 愛好者極度友好和舒適?,內容包括但不限於 Java 基礎、Java 集合框架、Java IO、Java 併發程式設計、Java 虛擬機器、Java 企業級開發(Git、SSM、Spring Boot)等核心知識點。
https://github.com/itwanger/toBeBetterJavaer
star 了這個倉庫就等於你擁有了成為了一名優秀 Java 工程師的潛力。也可以戳下面的連結跳轉到《Java 程式設計師進階之路》的官網網址,開始愉快的學習之旅吧。
沒有什麼使我停留——除了目的,縱然岸旁有玫瑰、有綠蔭、有寧靜的港灣,我是不繫之舟。