取代 Mybatis Generator,這款程式碼生成神器配置更簡單,開發效率更高!

沉默王二發表於2022-02-14

作為一名 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:

https://mybatis.org/generator/running/runningWithJava.html

第二步,在 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&amp;characterEncoding=utf-8&amp;serverTimezone=Asia/Shanghai&amp;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

更多配置資訊可以參照下面這篇文章:

https://juejin.cn/post/6844903982582743048

由於資料庫表可能會發生變動,因此我們需要追加一個配置 <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");

更多配置項可以到官方檢視:

https://baomidou.com/pages/061573/

示例程式碼示例如下所示:

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 程式設計師進階之路》的官網網址,開始愉快的學習之旅吧。

https://tobebetterjavaer.com/

沒有什麼使我停留——除了目的,縱然岸旁有玫瑰、有綠蔭、有寧靜的港灣,我是不繫之舟

相關文章