1. 程式人生 > 其它 >MyBatis Generator 詳細配置 demo

MyBatis Generator 詳細配置 demo

技術標籤:Java 學習工具篇Spring全家桶mybatisjavamaven

MyBatis Generator 詳細配置 demo

MyBatis Generator 是 MyBatis 提供的一個程式碼生成工具。可以幫我們生成 表對應的持久化物件(po)、操作資料庫的介面(dao)、CRUD sql的xml(mapper)。

MyBatis Generator 是一個獨立工具,你可以下載它的jar包來執行、也可以在 Ant 和 maven 執行。

目前已知的程式碼生成器有兩種: MyBatis-PlusMyBatis Generator ;前者是後者的加強版,對於MyBatis-Plus的使用可以參見: MyBatis-Plus 3.4.1 程式碼生成器 配置demo

0、使用環境

  • 開發工具:IDEA
  • 資料庫:mysql
  • 包管理工具:maven

1、配置 MyBatis Generator Config

MyBatis Generator 外掛啟動後,會根據你在 pom 中配置都路徑找到該配置檔案。

這個配置檔案才是詳細都配置 MyBatis Generator 生成程式碼的各種細節。

其中最重要的就是 context ,你的配置檔案至少得包含一個context

  • 配置示例:

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE generatorConfiguration
            PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
            "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
    <generatorConfiguration> <!-- 引入配置檔案 --> <properties resource="generator.properties"/> <!-- 一個數據庫一個context,context的子元素必須按照它給出的順序 property*,plugin*,commentGenerator?,jdbcConnection,javaTypeResolver?, javaModelGenerator,sqlMapGenerator?,javaClientGenerator?,table+ --> <context id="MySqlContext" targetRuntime="MyBatis3" defaultModelType="flat"> <property name="beginningDelimiter" value="`"/> <property name="endingDelimiter" value="`"/> <property name="javaFileEncoding" value="UTF-8"/> <!-- 為模型生成序列化方法--> <plugin type="org.mybatis.generator.plugins.SerializablePlugin"/> <!-- 為生成的Java模型建立一個toString方法 --> <plugin type="org.mybatis.generator.plugins.ToStringPlugin"/> <!-- 註釋 --> <!--註釋生成配置--> <!--可以自定義生成model的程式碼註釋--> <commentGenerator type="com.macro.mall.tiny.mbg.CommentGenerator"> <!-- 是否去除自動生成的註釋 true:是 : false:否 --> <property name="suppressAllComments" value="true"/> <property name="suppressDate" value="true"/> <property name="addRemarkComments" value="true"/> </commentGenerator> <!--配置資料庫連線--> <jdbcConnection driverClass="${jdbc.driverClass}" connectionURL="${jdbc.connectionURL}" userId="${jdbc.userId}" password="${jdbc.password}"> <!--解決mysql驅動升級到8.0後不生成指定資料庫程式碼的問題--> <property name="nullCatalogMeansCurrent" value="true" /> </jdbcConnection> <!--實體類配置--> <!--指定生成model的路徑--> <javaModelGenerator targetPackage="com.macro.mall.tiny.mbg.model" targetProject="mall-tiny-01\src\main\java"> <property name="enableSubPackages" value="false"/> <property name="trimStrings" value="true"/> </javaModelGenerator> <!--對映檔案的配置--> <!--指定生成mapper.xml的路徑--> <sqlMapGenerator targetPackage="com.macro.mall.tiny.mbg.mapper" targetProject="mall-tiny-01\src\main\resources"> <property name="enableSubPackages" value="false"/> </sqlMapGenerator> <!--指定生成mapper介面的的路徑--> <javaClientGenerator type="XMLMAPPER" targetPackage="com.macro.mall.tiny.mbg.mapper" targetProject="mall-tiny-01\src\main\java"> <property name="enableSubPackages" value="false"/> </javaClientGenerator> <!-- schema為資料庫名,oracle需要配置,mysql不需要配置。 tableName為對應的資料庫表名 domainObjectName 是要生成的實體類名(可以不指定,預設按帕斯卡命名法將表名轉換成類名) enableXXXByExample 預設為 true, 為 true 會生成一個對應Example幫助類,幫助你進行條件查詢,不想要可以設為false --> <!-- <table schema="" tableName="t_admin" domainObjectName="Admin"--> <!-- enableCountByExample="false" enableDeleteByExample="false" enableSelectByExample="false"--> <!-- enableUpdateByExample="false" selectByExampleQueryId="false"--> <!-- >--> <!-- &lt;!&ndash;是否使用實際列名,預設為false&ndash;&gt;--> <!-- &lt;!&ndash;<property name="useActualColumnNames" value="false" />&ndash;&gt;--> <!-- </table>--> <!--生成全部表tableName設為%--> <table tableName="pms_brand"> <generatedKey column="id" sqlStatement="MySql" identity="true"/> </table> </context> </generatorConfiguration>

2、使用MyBatis Generator

2.1 使用 Maven 外掛執行

pom.xml 新增配置

<build>
    <plugins>
        <plugin>
            <groupId>org.mybatis.generator</groupId>
            <artifactId>mybatis-generator-maven-plugin</artifactId>
            <version>1.3.7</version>
            <configuration>
                <!--mybatis的程式碼生成器的配置檔案-->
                <configurationFile>src/main/resources/mybatis-generator-config.xml</configurationFile>
                <!--允許移動生成的檔案 -->
                <verbose>true</verbose>
                <!--允許覆蓋生成的檔案-->
                <overwrite>true</overwrite>
                <!--將當前pom的依賴項新增到生成器的類路徑中-->
                <!--<includeCompileDependencies>true</includeCompileDependencies>-->
            </configuration>
            <executions>
                    <execution>
                        <id>Generate MyBatis Artifacts</id>
                        <phase>package</phase>
                        <goals>
                            <goal>generate</goal>
                        </goals>
                    </execution>
                </executions>
            <dependencies>
                <!--mybatis-generator外掛的依賴包-->
                <!--<dependency>-->
                    <!--<groupId>org.mybatis.generator</groupId>-->
                    <!--<artifactId>mybatis-generator-core</artifactId>-->
                    <!--<version>1.3.7</version>-->
                <!--</dependency>-->
                <!-- mysql的JDBC驅動 -->
                <dependency>
                    <groupId>mysql</groupId>
                    <artifactId>mysql-connector-java</artifactId>
                    <version>8.0.17</version>
                </dependency>
            </dependencies>
        </plugin>
    </plugins>
<build>  

配置好後,雙擊 maven 中的 MyBatis Generator 執行

2.1.1 引入 MyBatis Generator 外掛

<build>
    <plugins>
        <plugin>
            <groupId>org.mybatis.generator</groupId>
            <artifactId>mybatis-generator-maven-plugin</artifactId>
            <version>1.3.7</version>
        </plugin>
    <plugins>    
</build>

2.1.2 配置 MyBatis Generator config 檔案路徑

MyBatis Generator 外掛需要根據一個 MyBatis Generator config 檔案,來具體執行

配置如下,版本我用的是目前最新的版本 1.3.7

<build>
    <plugins>
        <plugin>
            <groupId>org.mybatis.generator</groupId>
            <artifactId>mybatis-generator-maven-plugin</artifactId>
            <version>1.3.7</version>
            <configuration>
                <!--mybatis的程式碼生成器的配置檔案-->
                <configurationFile>src/main/resources/mybatis-generator-config.xml</configurationFile>
            </configuration>
        </plugin>
    <plugins>    
</build>

注意,這個路徑是你的配置檔案相對於該 pom 檔案的路徑

2.1.3 允許覆蓋生成的檔案

有時候我們的資料庫表添加了新欄位,需要重新生成對應的檔案。常規做法是手動刪除舊檔案,然後在用 MyBatis Generator 生成新檔案。當然你也可以選擇讓 MyBatis Generator 覆蓋舊檔案,省下手動刪除的步驟。

<build>
    <plugins>
        <plugin>
            <groupId>org.mybatis.generator</groupId>
            <artifactId>mybatis-generator-maven-plugin</artifactId>
            <version>1.3.7</version>
            <configuration>
                <!--mybatis的程式碼生成器的配置檔案-->
                <configurationFile>src/main/resources/mybatis-generator-config.xml</configurationFile>
                <!--允許覆蓋生成的檔案-->
                <overwrite>true</overwrite>
            </configuration>
        </plugin>
    <plugins>    
</build>

值得注意的是,MyBatis Generator 只會覆蓋舊的 po、dao、而 *mapper.xml 不會覆蓋,而是追加,這樣做的目的是防止使用者自己寫的 sql 語句一不小心都被 MyBatis Generator 給覆蓋了

  • 問題解決

以前一直以為是MyBatis Generator生成的問題,直接刪除mapper.xml所在資料夾,重新生成就好了,現在提供一種MyBatis Generator官方提供的解決方法。

  • 升級MyBatis Generator的版本

MyBatis Generator 在1.3.7版本提供瞭解決方案,我們目前使用的版本為1.3.3。

<!-- MyBatis 生成器 -->
<dependency>
    <groupId>org.mybatis.generator</groupId>
    <artifactId>mybatis-generator-core</artifactId>
    <version>1.3.7</version>
</dependency>
  • 在generatorConfig.xml檔案中新增覆蓋mapper.xml的外掛
<!--生成mapper.xml時覆蓋原檔案-->
<plugin type="org.mybatis.generator.plugins.UnmergeableXmlMappersPlugin" />

2.1.4 新增資料庫驅動依賴

MyBatis Generator 需要連結資料庫,肯定是需要對應資料庫驅動的依賴的。

如下,給 MyBatis Generator 新增資料庫驅動依賴

<build>
    <plugins>
        <plugin>
            <groupId>org.mybatis.generator</groupId>
            <artifactId>mybatis-generator-maven-plugin</artifactId>
            <version>1.3.7</version>
            <configuration>
                <!--mybatis的程式碼生成器的配置檔案-->
                <configurationFile>src/main/resources/mybatis-generator-config.xml</configurationFile>
                <!--允許覆蓋生成的檔案-->
                <overwrite>true</overwrite>
            </configuration>
            <dependencies>
                <!-- mysql的JDBC驅動 -->
                <dependency>
                    <groupId>mysql</groupId>
                    <artifactId>mysql-connector-java</artifactId>
                    <version>8.0.17</version>
                </dependency>
            </dependencies>
        </plugin>
    <plugins>    
</build>

大部分情況下,我們的專案中已經配置過了對應資料庫的JDBC驅動。

現在在外掛中又配置一次,感覺有些冗餘,maven 提供了 includeCompileDependencies 屬性,讓我們在外掛中引用 dependencies 的依賴,這樣就不需要重複配置了。

<build>
    <plugins>
        <plugin>
            <groupId>org.mybatis.generator</groupId>
            <artifactId>mybatis-generator-maven-plugin</artifactId>
            <version>1.3.7</version>
            <configuration>
                <!--mybatis的程式碼生成器的配置檔案-->
                <configurationFile>src/main/resources/mybatis-generator-config.xml</configurationFile>
                <!--允許覆蓋生成的檔案-->
                <overwrite>true</overwrite>
                <!--將當前pom的依賴項新增到生成器的類路徑中-->
                <includeCompileDependencies>true</includeCompileDependencies>
            </configuration>
        </plugin>
    <plugins>    
</build>

2.1.5 新增其他依賴

一般配置了 includeCompileDependencies 後就不需要配置其他依賴了,因為 includeCompileDependencies 會將當前 pom 的 dependencies 中所以 Compile 期的依賴全部新增到生成器的類路徑中。

但有的人不想配置 includeCompileDependencies ,或者想在MyBatis Generator外掛中使用另一個版本的依賴,就可以配置 dependencies

2.2 Java 程式碼執行

package com.macro.mall.tiny.mbg;

import org.mybatis.generator.api.MyBatisGenerator;
import org.mybatis.generator.config.Configuration;
import org.mybatis.generator.config.xml.ConfigurationParser;
import org.mybatis.generator.internal.DefaultShellCallback;

import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

/**
 * 用於生產MBG的程式碼
 * Created by macro on 2018/4/26.
 */
public class Generator {
    public static void main(String[] args) throws Exception {
        //MBG 執行過程中的警告資訊
        List<String> warnings = new ArrayList<String>();
        //當生成的程式碼重複時,覆蓋原始碼
        boolean overwrite = true;
        //讀取我們的 MBG 配置檔案
        InputStream is = Generator.class.getResourceAsStream("/generatorConfig.xml");
        ConfigurationParser cp = new ConfigurationParser(warnings);
        Configuration config = cp.parseConfiguration(is);
        is.close();

        DefaultShellCallback callback = new DefaultShellCallback(overwrite);
        //建立 MBG
        MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings);
        //執行生成程式碼
        myBatisGenerator.generate(null);
        //輸出警告資訊
        for (String warning : warnings) {
            System.out.println(warning);
        }
    }
}

3、自定義註釋生成器

package com.macro.mall.tiny.mbg;

import org.mybatis.generator.api.IntrospectedColumn;
import org.mybatis.generator.api.IntrospectedTable;
import org.mybatis.generator.api.dom.java.Field;
import org.mybatis.generator.internal.DefaultCommentGenerator;
import org.mybatis.generator.internal.util.StringUtility;

import java.util.Properties;

/**
 * 自定義註釋生成器
 * Created by macro on 2018/4/26.
 */
public class CommentGenerator extends DefaultCommentGenerator {
    private boolean addRemarkComments = false;

    /**
     * 設定使用者配置的引數
     */
    @Override
    public void addConfigurationProperties(Properties properties) {
        super.addConfigurationProperties(properties);
        this.addRemarkComments = StringUtility.isTrue(properties.getProperty("addRemarkComments"));
    }

    /**
     * 給欄位添加註釋
     */
    @Override
    public void addFieldComment(Field field, IntrospectedTable introspectedTable,
                                IntrospectedColumn introspectedColumn) {
        String remarks = introspectedColumn.getRemarks();
        //根據引數和備註資訊判斷是否新增備註資訊
        if (addRemarkComments && StringUtility.stringHasValue(remarks)) {
            addFieldJavaDoc(field, remarks);
        }
    }

    /**
     * 給model的欄位添加註釋
     */
    private void addFieldJavaDoc(Field field, String remarks) {
        //文件註釋開始
        field.addJavaDocLine("/**");
        //獲取資料庫欄位的備註資訊
        String[] remarkLines = remarks.split(System.getProperty("line.separator"));
        for (String remarkLine : remarkLines) {
            field.addJavaDocLine(" * " + remarkLine);
        }
        addJavadocTag(field, false);
        field.addJavaDocLine(" */");
    }

}