MyBatis Generator 超詳細配置

想快速開始,請直接拉到最後,看總體配置。html

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

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

使用環境

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

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

例如 數據庫

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

引入 MyBatis Generator 插件

在 pom 的根節點下添加如下配置mybatis

<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插件oracle

配置 MyBatis Generator config 文件路徑

MyBatis Generator 插件須要根據一個 MyBatis Generator config 文件,來具體運行app

配置以下,版本我用的是目前最新的版本 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,默認falsefalse,把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,默認falsefalse,把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 運行

參考

MyBatis Generator 官網

相關文章
相關標籤/搜索