天天看點

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

作者:實戰Java

作為一名 Java 後端開發,日常工作中免不了要生成資料庫表對應的持久化對象 PO,操作資料庫的接口 DAO,以及 CRUD 的 XML,也就是 mapper。

Mybatis Generator 是 MyBatis 官方提供的一個代碼生成工具,完全可以勝任這個工作,不過最近在開發“程式設計貓”開源網站的時候試用了一下 MyBatis-Plus 官方提供 AutoGenerator,發現配置更簡單,開發效率更高!于是就來給小夥伴們安利一波。

來個 GIF 感受一下 AutoGenerator 生成代碼的快感吧。

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

一、使用 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 的依賴加載完畢後再執行第二步。

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

否則下一步可能不通過,但又得不到任何錯誤提示。不要問我為什麼,踩過坑後痛苦的領悟。

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

添加完成後,可以通過 Maven 插件來生成代碼,也可以通過 Java 代碼來生成代碼,這裡以 Maven 插件的形式來示範。Java 代碼的形式可參照 Mybatis Generator:

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

第二步,在 pom.xml 的 MyBatis Generator 插件,先來看一下整體的結構圖,注意是在 build→plugins 下節點下添加。

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

首先是 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,這款代碼生成神器配置更簡單,效率更高!

來看一下 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

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

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 Generator,這款代碼生成神器配置更簡單,效率更高!

二、使用 MyBatis-Plus 的 AutoGenerator

MyBatis-Plus(簡寫 MP)是 MyBatis 的增強工具,官方宣稱 MP 和 MyBatis 的關系就好像魂鬥羅中的 1P 和 2P,可謂好基友,天下走。

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

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 的 Generator 和 MyBatis-Plus 的 AutoGenerator,就可以得出這樣一條結論:後者的配置更簡單,開發效率也更高,功能也更強大——可快速生成 Mapper 、 Model 、 Service 、 Controller 層代碼。

MyBatis-Plus 的确配得上 Plus 啊,确實優秀。

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

想要完整示例的話,可以到 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)等核心知識點。

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

原文連結;https://xie.infoq.cn/article/3325aa92b3127c27f9327f75f

繼續閱讀