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

作爲一名 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/

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章