想快速開始,請直接拉到最後,看總體配置。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
在 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插件oracle
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 插件啓動後,會根據你在 pom 中配置都路徑找到該配置文件。
這個配置文件纔是詳細都配置 MyBatis Generator 生成代碼的各類細節。
其中最重要的就是 context ,你的配置文件至少得包含一個context
MyBatis Generator config 是能夠引入外部配置文件的,以下,路徑爲相對於當前配置文件的路徑
代碼以下,注意是配置在 <generatorConfiguration>
下
<!-- 引入配置文件 -->
<properties resource="application-dev.properties"/>
複製代碼
配置文件中的內容以下
注意是配置在 <generatorConfiguration>
下
<context id="myContext" targetRuntime="MyBatis3" defaultModelType="flat">
</context>
複製代碼
targetRuntime = MyBatis3,生成的 dao 和 mapper.xml 以下
targetRuntime = MyBatis3Simple,生成的 dao 和 mapper.xml 以下,接口會少不少,只包含最最經常使用的
context 節點就講完了,惟一須要注意的就是targetRuntime的值,該配置成什麼看我的喜愛
上一節只是配置了 context 節點, context 裏面還有子元素須要配置。
context的子元素必須按照如下給出的個數、順序配置。(是的,沒錯 MyBatis Generator 對配置的循序還有要求)
配置一個插件,例如
<plugin type="org.mybatis.generator.plugins.EqualsHashCodePlugin"/>
複製代碼
這個插件給生成的Java模型對象增長了equals和hashCode方法
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>
複製代碼
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 是配置 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>
複製代碼
配置 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 會放在該文件夾下,也就是說會多一層目錄,用的上的能夠配置
配置 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>
複製代碼
type="XMLMAPPER"
會將接口的實現放在 mapper.xml中,也推薦這樣配置。也能夠設置 type 爲其餘值,好比 type="ANNOTATEDMAPPER"
,接口的實現經過註解寫在接口上面,如圖
若是採用這種方式,不會生成 mapper.xml 也不用配置 <sqlMapGenerator>
,可是採用註解來實現接口應對簡單查詢還好,若是是複雜查詢並不如xml方便,因此仍是建議將type
配置成XMLMAPPER
一個 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
的文件,以下
當 targetRuntime="MyBatis3Simple"
時,enableXXXByExample 無論爲true、仍是false 都不生效
<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>
複製代碼
<?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
複製代碼
配置好後,雙擊 maven 中的 MyBatis Generator 運行