MyBatis Generator 超詳細配置


想快速開始,請直接拉到最后,看整體配置。

MyBatis Generator 是 MyBatis 提供的一個代碼生成工具。可以幫我們生成 表對應的持久化對象(po)、操作數據庫的接口(dao)、CRUD sql的xml(mapper)。

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

使用環境

我是在 maven 中配置並使用的。這篇文章也是基於 maven 環境來講解。

既然使用了 MyBatis Generator ,那么你的項目一定使用了 MyBatis, 並且一定使用了某一種數據庫,並且這些依賴應該已經在 maven 中配置好了。

例如

 

接下來需要在 pom 中引入 MyBatis Generator 插件

引入 MyBatis Generator 插件

在 pom 的根節點下添加以下配置

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

配置 MyBatis Generator 插件

光引入 MyBatis Generator 插件還不行,還得配置 MyBatis Generator插件

配置 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 文件的路徑

 

至於這個文件該怎么配置我們待會在

允許覆蓋生成的文件

有時候我們的數據庫表添加了新字段,需要重新生成對應的文件。常規做法是手動刪除舊文件,然后在用 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 需要鏈接數據庫,肯定是需要對應數據庫驅動的依賴的。

如下,給 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>
復制代碼

我用的數據庫是 mysql ,其他數據庫同理。注意數據庫驅動的版本號,不同的版本對應的 MyBatis Generator 配置有些許不同,之后會講。

大部分情況下,我們的項目中已經配置過了對應數據庫的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>
復制代碼

 

 

添加其他依賴

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

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

如圖

 

另外,我看到網上大部分文章都會配置 mybatis-generator-core 這個依賴,但是 MyBatis Generator 官網的案例中都沒有提到說要配置這個依賴,我沒有配置,並且可以正常使用 MyBatis Generator

 

配置 MyBatis Generator Config

MyBatis Generator 插件啟動后,會根據你在 pom 中配置都路徑找到該配置文件。

這個配置文件才是詳細都配置 MyBatis Generator 生成代碼的各種細節。

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

 

引入外部配置文件

MyBatis Generator config 是可以引入外部配置文件的,如下,路徑為相對於當前配置文件的路徑

 

代碼如下,注意是配置在 <generatorConfiguration> 下

<!-- 引入配置文件 -->
<properties resource="application-dev.properties"/>
復制代碼

配置文件中的內容如下

之后可以通過 ${xxx} 來引用外部配置文件中的值

 

配置context

注意是配置在 <generatorConfiguration> 下

<context id="myContext" targetRuntime="MyBatis3" defaultModelType="flat">

</context>
復制代碼
  • id : 隨便填,保證多個 context id 不重復就行
  • defaultModelType : 可以不填,默認值 conditionalflat表示一張表對應一個po
  • targetRuntime :可以不填,默認值 MyBatis3,常用的還有 MyBatis3Simple,這個配置會影響生成的 dao 和 mapper.xml的內容

targetRuntime = MyBatis3,生成的 dao 和 mapper.xml 如下

 

targetRuntime = MyBatis3Simple,生成的 dao 和 mapper.xml 如下,接口會少很多,只包含最最常用的

 

context 節點就講完了,唯一需要注意的就是targetRuntime的值,該配置成什么看個人喜好

context的子元素

上一節只是配置了 context 節點, context 里面還有子元素需要配置。

context的子元素必須按照以下給出的個數、順序配置。(是的,沒錯 MyBatis Generator 對配置的循序還有要求)

  1. property (0..N)
  2. plugin (0..N)
  3. commentGenerator (0 or 1)
  4. jdbcConnection (需要connectionFactory 或 jdbcConnection)
  5. javaTypeResolver (0 or 1)
  6. javaModelGenerator (至少1個)
  7. sqlMapGenerator (0 or 1)
  8. javaClientGenerator (0 or 1)
  9. table (1..N)

plugin

配置一個插件,例如

<plugin type="org.mybatis.generator.plugins.EqualsHashCodePlugin"/>
復制代碼

這個插件給生成的Java模型對象增加了equals和hashCode方法

commentGenerator

commentGenerator 用來配置生成的注釋。默認是生成注釋的,並且會生成時間戳,如下

如果你想要保留注釋和時間戳,可以不配置 commentGenerator

 

如果你不想保留時間戳,需要如下配置

<commentGenerator>
    <!-- 不希望生成的注釋中包含時間戳 -->
    <property name="suppressDate" value="true"/>
</commentGenerator>
復制代碼

默認生成的注釋是不會有 db 表中字段的注釋,如果你想知道每個字段在數據庫中的含義(前提是數據庫中對應表的字段你添加了注釋),可以如下配置

<commentGenerator>
    <!-- 添加 db 表中字段的注釋 -->
    <property name="addRemarkComments" value="true"/>
</commentGenerator>
復制代碼

 

 

但說實話,MyBatis Generator 生成注釋無用信息太多了,所以我一般都選擇不生成注釋

<commentGenerator>
    <!-- 是否不生成注釋 -->
    <property name="suppressAllComments" value="true"/>
</commentGenerator>
復制代碼

jdbcConnection

MyBatis Generator 需要鏈接數據庫,所以需要配置 jdbcConnection,具體如下

<jdbcConnection driverClass="${spring.datasource.driverClassName}"
                connectionURL="${spring.datasource.url}"
                userId="${spring.datasource.username}"
                password="${spring.datasource.password}">
    <!--高版本的 mysql-connector-java 需要設置 nullCatalogMeansCurrent=true-->
    <property name="nullCatalogMeansCurrent" value="true"/>
</jdbcConnection>
復制代碼

${}里面是外部配置文件中的"name"

 

你也可以寫死,那就不需要配置<properties resource="application-dev.properties"/>

這里面值得注意的是<property name="nullCatalogMeansCurrent" value="true"/>,因為我用的 mysql-connector-java 版本是 8.0.17,如果配置這一項,會找不到對應的數據庫,官網對此的解釋是

 

 

具體原因參考這篇文章 MyBatis Generator踩坑與自救

javaTypeResolver

javaTypeResolver 是配置 JDBC 與 java 的類型轉換規則,或者你也可以不用配置,使用它默認的轉換規則。

就算配置也只能配置 bigDecimal 類型和時間類型的轉換

<javaTypeResolver>
    <!--是否使用 bigDecimal,默認false。
        false,把JDBC DECIMAL 和 NUMERIC 類型解析為 Integer
        true,把JDBC DECIMAL 和 NUMERIC 類型解析為java.math.BigDecimal-->
    <property name="forceBigDecimals" value="true"/>
    <!--默認false
        false,將所有 JDBC 的時間類型解析為 java.util.Date
        true,將 JDBC 的時間類型按如下規則解析
            DATE	                -> java.time.LocalDate
            TIME	                -> java.time.LocalTime
            TIMESTAMP                   -> java.time.LocalDateTime
            TIME_WITH_TIMEZONE  	-> java.time.OffsetTime
            TIMESTAMP_WITH_TIMEZONE	-> java.time.OffsetDateTime
        -->
    <property name="useJSR310Types" value="true"/>
</javaTypeResolver>
復制代碼

javaModelGenerator

配置 po 生成的包路徑和項目路徑,如下

<javaModelGenerator targetPackage="com.wqlm.boot.user.po" targetProject="src/main/java">
    <!-- 是否讓schema作為包的后綴,默認為false -->
    <!--<property name="enableSubPackages" value="false"/>-->
    <!-- 是否針對string類型的字段在set方法中進行修剪,默認false -->
    <property name="trimStrings" value="true"/>
</javaModelGenerator>
復制代碼

 

 

<property name="trimStrings" value="true"/> 生成出來的 set 方法如下

 

<property name="enableSubPackages" value="true"/> 時,可能會在 po 目錄下在創建一個 “數據庫名” 的文件夾,生成的 po 會放在該文件夾下,也就是說會多一層目錄,用的上的可以配置

sqlMapGenerator

配置 Mapper.xml 文件的生成目錄

<sqlMapGenerator targetPackage="mapper" targetProject="src/main/resources">
    <!--<property name="enableSubPackages" value="false"/>-->
</sqlMapGenerator>
復制代碼

 

 

javaClientGenerator

配置 XxxMapper.java 文件的生成目錄

<javaClientGenerator targetPackage="com.wqlm.boot.user.dao" targetProject="src/main/java" type="XMLMAPPER">
    <!--<property name="enableSubPackages" value="false"/>-->
</javaClientGenerator>
復制代碼

 

 

type="XMLMAPPER" 會將接口的實現放在 mapper.xml中,也推薦這樣配置。也可以設置 type 為其他值,比如 type="ANNOTATEDMAPPER",接口的實現通過注解寫在接口上面,如圖

 

 

如果采用這種方式,不會生成 mapper.xml 也不用配置 <sqlMapGenerator>,但是采用注解來實現接口應對簡單查詢還好,如果是復雜查詢並不如xml方便,所以還是建議將type配置成XMLMAPPER

table

一個 table 對應一張表,如果想同時生成多張表,需要配置多個 table

<!-- schema為數據庫名,oracle需要配置,mysql不需要配置。
     tableName為對應的數據庫表名
     domainObjectName 是要生成的實體類名(可以不指定)
     enableXXXByExample 默認為 true, 為 true 會生成一個對應Example幫助類,幫助你進行條件查詢,不想要可以設為false
     -->
<table schema="" tableName="user" domainObjectName="User"
       enableCountByExample="false" enableDeleteByExample="false" enableSelectByExample="false"
       enableUpdateByExample="false" selectByExampleQueryId="false">
    <!--是否使用實際列名,默認為false-->
    <!--<property name="useActualColumnNames" value="false" />-->
</table>
復制代碼

其中 domainObjectName 不配置時,它會按照帕斯卡命名法將表名轉換成類名

enableXXXByExample 默認為true,但只有在targetRuntime="MyBatis3"時才生效

 

生效時,會在po下多生成一個 XxxExample.java 的文件,如下

一個簡單的user的Example幫助類有470行,我一般不會去用,如上全設置為false

 

當 targetRuntime="MyBatis3Simple"時,enableXXXByExample 不管為true、還是false 都不生效

整體配置

pom 整體配置

<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>
            <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>    
復制代碼

 

 

MyBatis Generator Config 整體配置

<?xml version="1.0" encoding="UTF-8" ?>
<!--mybatis的代碼生成器相關配置-->
<!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="application-dev.properties"/>

    <!-- 一個數據庫一個context,context的子元素必須按照它給出的順序
        property*,plugin*,commentGenerator?,jdbcConnection,javaTypeResolver?,
        javaModelGenerator,sqlMapGenerator?,javaClientGenerator?,table+
    -->
    <context id="myContext" targetRuntime="MyBatis3" defaultModelType="flat">

        <!-- 這個插件給生成的Java模型對象增加了equals和hashCode方法 -->
        <!--<plugin type="org.mybatis.generator.plugins.EqualsHashCodePlugin"/>-->

        <!-- 注釋 -->
        <commentGenerator>
            <!-- 是否不生成注釋 -->
            <property name="suppressAllComments" value="true"/>
            <!-- 不希望生成的注釋中包含時間戳 -->
            <!--<property name="suppressDate" value="true"/>-->
            <!-- 添加 db 表中字段的注釋,只有suppressAllComments為false時才生效-->
            <!--<property name="addRemarkComments" value="true"/>-->
        </commentGenerator>


        <!-- jdbc連接 -->
        <jdbcConnection driverClass="${spring.datasource.driverClassName}"
                        connectionURL="${spring.datasource.url}"
                        userId="${spring.datasource.username}"
                        password="${spring.datasource.password}">
            <!--高版本的 mysql-connector-java 需要設置 nullCatalogMeansCurrent=true-->
            <property name="nullCatalogMeansCurrent" value="true"/>
        </jdbcConnection>

        <!-- 類型轉換 -->
        <javaTypeResolver>
            <!--是否使用bigDecimal,默認false。
                false,把JDBC DECIMAL 和 NUMERIC 類型解析為 Integer
                true,把JDBC DECIMAL 和 NUMERIC 類型解析為java.math.BigDecimal-->
            <property name="forceBigDecimals" value="true"/>
            <!--默認false
                false,將所有 JDBC 的時間類型解析為 java.util.Date
                true,將 JDBC 的時間類型按如下規則解析
                    DATE	                -> java.time.LocalDate
                    TIME	                -> java.time.LocalTime
                    TIMESTAMP               -> java.time.LocalDateTime
                    TIME_WITH_TIMEZONE  	-> java.time.OffsetTime
                    TIMESTAMP_WITH_TIMEZONE	-> java.time.OffsetDateTime
                -->
            <!--<property name="useJSR310Types" value="false"/>-->
        </javaTypeResolver>

        <!-- 生成實體類地址 -->
        <javaModelGenerator targetPackage="com.wqlm.boot.user.po" targetProject="src/main/java">
            <!-- 是否讓 schema 作為包的后綴,默認為false -->
            <!--<property name="enableSubPackages" value="false"/>-->
            <!-- 是否針對string類型的字段在set方法中進行修剪,默認false -->
            <property name="trimStrings" value="true"/>
        </javaModelGenerator>


        <!-- 生成Mapper.xml文件 -->
        <sqlMapGenerator targetPackage="mapper" targetProject="src/main/resources">
            <!--<property name="enableSubPackages" value="false"/>-->
        </sqlMapGenerator>

        <!-- 生成 XxxMapper.java 接口-->
        <javaClientGenerator targetPackage="com.wqlm.boot.user.dao" targetProject="src/main/java" type="XMLMAPPER">
            <!--<property name="enableSubPackages" value="false"/>-->
        </javaClientGenerator>


        <!-- schema為數據庫名,oracle需要配置,mysql不需要配置。
             tableName為對應的數據庫表名
             domainObjectName 是要生成的實體類名(可以不指定,默認按帕斯卡命名法將表名轉換成類名)
             enableXXXByExample 默認為 true, 為 true 會生成一個對應Example幫助類,幫助你進行條件查詢,不想要可以設為false
             -->
        <table schema="" tableName="user" domainObjectName="User"
               enableCountByExample="false" enableDeleteByExample="false" enableSelectByExample="false"
               enableUpdateByExample="false" selectByExampleQueryId="false">
            <!--是否使用實際列名,默認為false-->
            <!--<property name="useActualColumnNames" value="false" />-->
        </table>
    </context>
</generatorConfiguration>
復制代碼

 

 

外部配置文件整體配置

MyBatis Generator Config 引用的外部配置文件內容如下

# mysql
spring.datasource.driverClassName=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/boot?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai
spring.datasource.username=root
spring.datasource.password=123456
復制代碼

 

 

使用 MyBatis Generator

配置好后,雙擊 maven 中的 MyBatis Generator 運行


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM