1. 程式人生 > 程式設計 >【MyBatis-Plus-In-Action】六、程式碼生成器——逆行工程

【MyBatis-Plus-In-Action】六、程式碼生成器——逆行工程

上一節我們學習了mybatis-plus 的ActiveRecord(活動記錄),這一節我們來學習一下mybatis-plus 的程式碼生成器

Mybatis-Plus 的程式碼生成器為我們提供了大量的自定義設定,生成的程式碼完全能夠滿足各型別的需求,可以快速的生成程式碼,簡化開發,提高開發效率。

Mybatis-Plus 的程式碼生成器 和 Mybatis MBG 程式碼生成器的對比:

Mybatis-Plus 程式碼生成器 Mybatis MBG
Mybatis-Plus 的程式碼生成器都是基於 java 程式碼來生成 MBG 基於 xml 檔案進行程式碼生成
Mybatis-Plus 的程式碼生成器可生成: 實體類(可以選擇是否支援 AR)
、 Mapper 介面、 Mapper 對映檔案、 Service 層、 Controller 層
MyBatis 的程式碼生成器可生成: 實體類、 Mapper 介面、 Mapper 對映檔案

話不多說,下面我們來開始我們的程式碼生成器的學習之旅。

首先按照快速開始——Spring整合Mybatis-Plus一節的操作,新建一個mp05 的 Module,可以將mp02中的resources資料夾中內容全部複製過來,因為這些配置檔案都是一樣的。

1、修改父專案的pom.xml檔案

在開始mp05的實戰之前,我們需要修改下父工程的pom檔案,因為MP 的程式碼生成器預設使用的是 Apache 的 Velocity

 模板,需要加入 Apache Velocity 的依賴。當然也可以更換為別的模板技術,例如freemarker,此處不做過多的介紹,大家感興趣的可以自己嘗試。另外還需要引入 mybatis-plus-generator 的依賴,這時因為 MyBatis-Plus 從 3.0.3 之後移除了程式碼生成器與模板引擎的預設依賴,需要手動新增相關依賴。除此之外還需要引入spring-webmvc的依賴,因為我們在用程式碼生成器生成的 controller層的時候,SpringMVC的註解會提示報錯,當然,你也可以在生成完程式碼之後再根據需要引入SpringMVC的依賴也可以,這樣並不會影響程式碼生成器的使用。

我們需要修改的 pom.xml 檔案位置如下圖所示:

mp05-01.png

貼上pom.xml修改部分的程式碼方便複製貼上:

<!-- 下面的依賴針對於 mp05 模組-->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>${spring.version}</version>
</dependency>
<!--注意: MyBatis-Plus 從 3.0.3 之後移除了程式碼生成器與模板引擎的預設依賴,需要手動新增相關依賴: -->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-generator</artifactId>
    <version>${mybatis.plus.version}</version>
</dependency>
<!--模板引擎
        MP 的程式碼生成器預設使用的是 Apache 的 Velocity 模板,當然也可以更換為別的模板
        技術,例如 freemarker。此處不做過多的介紹。
        需要加入 Apache Velocity 的依賴-->
<dependency>
    <groupId>org.apache.velocity</groupId>
    <artifactId>velocity-engine-core</artifactId>
    <version>${velocity.version}</version>
</dependency>
<!--加入 slf4j,檢視日誌輸出資訊-->
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>${slf4j.version}</version>
</dependency>
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-log4j12</artifactId>
    <version>${slf4j.version}</version>
</dependency>
複製程式碼

修改後完整的 pom.xml 檔案如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.demo.mybatis-plus</groupId>
    <artifactId>mybatis-plus-in-action</artifactId>
    <packaging>pom</packaging>
    <version>1.0-SNAPSHOT</version>
    <modules>
        <module>mp01</module>
        <module>mp02</module>
        <module>mp03</module>
        <module>mp04</module>
        <module>mp05</module>
        <module>mp06</module>
        <module>mp07</module>
        <module>mp08</module>
    </modules>

    <!-- 統一管理專案依賴版本 -->
    <properties>
        <mybatis.plus.version>3.2.0</mybatis.plus.version>
        <!--<mybatis.plus.version>2.3</mybatis.plus.version>-->
        <junit.version>4.12</junit.version>
        <log4j.version>1.2.17</log4j.version>
        <druid.version>1.1.20</druid.version>
        <mysql.version>5.1.48</mysql.version>
        <spring.version>5.2.0.RELEASE</spring.version>
        <lombok.version>1.18.10</lombok.version>

        <slf4j.version>1.7.28</slf4j.version>
        <velocity.version>2.1</velocity.version>
    </properties>

    <dependencies>
        <!-- mp 依賴
            mybatis-plus 會自動維護mybatis 以及 mybatis-spring相關的依賴
            Mybatis 及 Mybatis-Spring 依賴請勿加入專案配置,以免引起版本衝突!!!Mybatis-Plus 會自動幫你維護!
         -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus</artifactId>
            <version>${mybatis.plus.version}</version>
        </dependency>
        <!--junit -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>${junit.version}</version>
        </dependency>
        <!-- log4j -->
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>${log4j.version}</version>
        </dependency>
        <!-- druid -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>${druid.version}</version>
        </dependency>
        <!-- mysql -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>${mysql.version}</version>
        </dependency>
        <!-- spring -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-orm</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <!--lombok -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>${lombok.version}</version>
            <scope>provided</scope>
        </dependency>

        <!-- 下面的依賴針對於 mp05 模組-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <!--注意: MyBatis-Plus 從 3.0.3 之後移除了程式碼生成器與模板引擎的預設依賴,需要手動新增相關依賴: -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-generator</artifactId>
            <version>${mybatis.plus.version}</version>
        </dependency>
        <!--模板引擎
        MP 的程式碼生成器預設使用的是 Apache 的 Velocity 模板,當然也可以更換為別的模板
        技術,例如 freemarker。此處不做過多的介紹。
        需要加入 Apache Velocity 的依賴-->
        <dependency>
            <groupId>org.apache.velocity</groupId>
            <artifactId>velocity-engine-core</artifactId>
            <version>${velocity.version}</version>
        </dependency>
        <!--加入 slf4j,檢視日誌輸出資訊-->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>${slf4j.version}</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>${slf4j.version}</version>
        </dependency>

    </dependencies>

    <!-- 設定JDK編譯版本 -->
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>
複製程式碼

2、修改mp05的pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>mybatis-plus-in-action</artifactId>
        <groupId>com.demo.mybatis-plus</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>mp05</artifactId>

    <dependencies>
        <!-- mp 依賴
            mybatis-plus 會自動維護mybatis 以及 mybatis-spring相關的依賴
            Mybatis 及 Mybatis-Spring 依賴請勿加入專案配置,以免引起版本衝突!!!Mybatis-Plus 會自動幫你維護!
         -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus</artifactId>
            <version>${mybatis.plus.version}</version>
        </dependency>
        <!--junit -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>${junit.version}</version>
        </dependency>
        <!-- log4j -->
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>${log4j.version}</version>
        </dependency>
        <!-- druid -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>${druid.version}</version>
        </dependency>
        <!-- mysql -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>${mysql.version}</version>
        </dependency>
        <!-- spring -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-orm</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <!--lombok -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>${lombok.version}</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <!--注意: MyBatis-Plus 從 3.0.3 之後移除了程式碼生成器與模板引擎的預設依賴,需要手動新增相關依賴: -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-generator</artifactId>
            <version>${mybatis.plus.version}</version>
        </dependency>
        <!--模板引擎
        MP 的程式碼生成器預設使用的是 Apache 的 Velocity 模板,當然也可以更換為別的模板
        技術,例如 freemarker。此處不做過多的介紹。
        需要加入 Apache Velocity 的依賴-->
        <dependency>
            <groupId>org.apache.velocity</groupId>
            <artifactId>velocity-engine-core</artifactId>
            <version>${velocity.version}</version>
        </dependency>
        <!--加入 slf4j,檢視日誌輸出資訊-->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>${slf4j.version}</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>${slf4j.version}</version>
        </dependency>
    </dependencies>
</project>
複製程式碼

3、MP 程式碼生成器示例

我們在 mp05\src\test\java\com\mp\test\路徑下新建一個測試類 TestMp.java

TestMp.java 的程式碼如下:

public class TestMp {
    private ApplicationContext ioc = new
            ClassPathXmlApplicationContext("applicationContext.xml");

    /**
     * 程式碼生成器 示例程式碼
     */
    @Test
    public void testGenerator() {
        // 1、全域性配置
        com.baomidou.mybatisplus.generator.config.GlobalConfig config = new com.baomidou.mybatisplus.generator.config.GlobalConfig();
        config.setActiveRecord(true) // 是否支援AR模式
                .setAuthor("jianshu")   // 作者
                .setOutputDir("E:\\myCode\\mybatis-plus-in-action\\mp05\\src\\main\\java")      // 生成路徑
                .setFileOverride(true) // 檔案覆蓋
                .setIdType(IdType.AUTO) // 主鍵策略
                .setServiceName("%sService") //設定生成的service介面名首字母是否為I,預設是以I開頭
                .setBaseColumnList(true) // 基本列
                .setBaseResultMap(true); // 返回結果map

        // 2、資料來源配置
        DataSourceConfig dataSourceConfig = new DataSourceConfig();
        dataSourceConfig.setDbType(DbType.MYSQL) // 設定資料庫型別
                .setDriverName("com.mysql.jdbc.Driver")
                .setUrl("jdbc:mysql://172.19.8.51:3306/wmcTradeOrderDevTemp?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8")
                .setUsername("root")
                .setPassword("root");

        // 3、策略配置
        StrategyConfig stConfig = new StrategyConfig();
        stConfig.setCapitalMode(true) // 全域性大寫命名
//                .setColumnNaming(NamingStrategy.underline_to_camel)  //表名 欄位名 是否使用下滑線命名
                .setNaming(NamingStrategy.underline_to_camel) // 資料庫表對映到實體的命名策略
                .setInclude("tbl_employee") //生成的表
                .setTablePrefix("tbl_"); // 表字首

        // 4、包名策略配置
        PackageConfig pkConfig = new PackageConfig();
        pkConfig.setParent("com.mp")
                .setController("controller")
                .setEntity("beans")
                .setMapper("mapper")
                .setService("service")
                .setXml("mapper");

        // 5、整合配置
        AutoGenerator ag = new
                AutoGenerator().setGlobalConfig(config)
                .setDataSource(dataSourceConfig)
                .setStrategy(stConfig)
                .setPackageInfo(pkConfig);

        // 6、執行
        ag.execute();
    }

}
複製程式碼

執行 testGenerator() 方法後,重新整理一下專案,我們可以看到會自動生成 beansmapperservicecontroller的程式碼。

注意:關於表及欄位命名策略選擇:在 Mybatis-Plus 中,我們建議資料庫表名 和 表字段名採用駝峰命名方式, 如果採用下劃線命名方式 請開啟全域性下劃線開關,如果表名欄位名命名方式不一致請使用對應的註解指定,我們建議最好保持一致。這麼做的原因是為了避免在對應實體類時產生的效能損耗,這樣欄位不用做對映就能直接和實體類對應。當然如果專案裡不用考慮這點效能損耗,那麼你採用下滑線也是沒問題的,只需要在生成程式碼時配置 ColumnNaming屬性就可以。

完成上面的操作後,mp05的程式碼結構如下所示:

mp05-02.png

至此,基於 mybatis-plus 的程式碼生成器——逆行工程演示就完成了,下面我們就可以進入到下一節外掛擴充套件的學習了。

原始碼

相關示例完整程式碼:mybatis-plus-in-action