1. 程式人生 > 程式設計 >Mybatis Generator逆向工程的使用詳細教程

Mybatis Generator逆向工程的使用詳細教程

一、MyBatis Generator簡介

MyBatis Generator(MBG)是MyBatis和iBATIS的程式碼生成器。它將為所有版本的MyBatis以及版本2.2.0之後的iBATIS版本生成程式碼。它將審查資料庫表(或許多表),並將生成可用於訪問表的構件。這減少了設定物件和配置檔案以與資料庫表互動的初始麻煩。MBG尋求對簡單CRUD(建立,檢索,更新,刪除)的大部分資料庫操作產生重大影響。您仍然需要為連線查詢或儲存過程手動編寫SQL和物件程式碼。MyBatis Generator將生成:

與表結構匹配的Java POJO。這可能包括:

  • 一個匹配表的主鍵的類(如果有主鍵)
  • 一個匹配表的非主鍵欄位的類(BLOB欄位除外)
  • 包含表的BLOB欄位的類(如果表具有BLOB欄位)
  • 用於啟用動態選擇,更新和刪除的類

這些類之間存在適當的繼承關係。請注意,生成器可以配置為生成不同型別的POJO層次結構 - 例如,如果您願意,可以選擇為每個表生成單個域物件。

MyBatis/iBATIS相容的SQL Map XML檔案。MBG為配置中的每個表上的簡單CRUD函式生成SQL。生成的SQL語句包括:

  • insert 插入
  • update by primary key 按主鍵更新
  • update by example (using a dynamic where clause) 通過條件更新(使用動態where子句)
  • delete by primary key 按主鍵刪除
  • delete by example (using a dynamic where clause) 按條件刪除(使用動態where子句)
  • select by primary key 按主鍵查詢
  • select by example (using a dynamic where clause) 按條件查詢(使用動態where子句)
  • count by example 按條件查詢記錄總數

根據表結構的不同,這些語句有不同的變體(例如,如果表沒有主鍵,則MBG不會通過主鍵功能生成更新)。

適當使用上述物件的Java客戶端類。Java客戶端類的生成是可選的。MBG將為MyBatis 3.x生成以下型別的Java客戶端:

適用於MyBatis 3.x對映器基礎結構的對映器介面

MBG將為iBATIS 2.x生成以下型別的Java客戶端:

  • 符合Spring框架的DAO
  • 僅使用iBATIS SQL對映API的DAO。這些DAO可以生成兩種:通過建構函式或setter注入提供SqlMapClient。
  • 符合iBATIS DAO框架的DAO(iBATIS的可選部分,現在不推薦使用此框架,我們建議您使用Spring框架)

MyBatis生成器設計為在迭代開發環境中執行良好,並且可以作為Ant任務或Maven外掛包含在連續構建環境中。迭代執行MBG時需要注意的重要事項包括:

如果存在與新生成的XML檔案同名的現有檔案,MBG將自動合併XML檔案。MBG不會覆蓋您對其生成的XML檔案所做的任何自定義更改。您可以反覆執行它,而不必擔心會丟失對XML的自定義更改。MBG將替換先前執行中生成的任何XML元素。

MBG不會合並Java檔案,它可以覆蓋現有檔案或使用不同的唯一名稱儲存新生成的檔案。如果對生成的Java檔案進行更改並以迭代方式執行MBG,則必須手動合併更改。當作為Eclipse外掛執行時 ,MBG可以自動合併Java檔案。

二、MyBatis Generator使用

1、新建MBG的配置檔案generatorConfig.xml檔案

<?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"></properties>
 <!--指定特定資料庫的jdbc驅動jar包的位置-->
 <!--<classPathEntry location="${jdbc.driverLocation}"/>-->
 
 <context id="default" targetRuntime="MyBatis3">
 
 <!-- optional,旨在建立class時,對註釋進行控制,false生成註釋,true無註釋 -->
 <commentGenerator>
  <property name="suppressDate" value="false"/>
  <property name="suppressAllComments" value="false"/>
 </commentGenerator>
 
 <!--jdbc的資料庫連線 -->
 <jdbcConnection
  driverClass="${jdbc.driverClass}"
  connectionURL="${jdbc.connectionURL}"
  userId="${jdbc.userId}"
  password="${jdbc.password}">
 </jdbcConnection>
 
 
 <!--
  預設false,把JDBC DECIMAL 和 NUMERIC 型別解析為 Integer,
  為 true時把JDBC DECIMAL 和 NUMERIC 型別解析為java.math.BigDecimal
 -->
 <!-- 非必需,型別處理器,在資料庫型別和java型別之間的轉換控制-->
 <javaTypeResolver>
  <property name="forceBigDecimals" value="false"/>
 </javaTypeResolver>
 
 
 <!-- Model模型生成器,用來生成含有主鍵key的類,記錄類 以及查詢Example類
  targetPackage 指定生成的model生成所在的包名
  targetProject 指定在該專案下所在的路徑|指定生成到的工程名稱
 -->
 <javaModelGenerator targetPackage="com.test.model"
    targetProject=".\src\main\java">
  <!-- 是否允許子包,即targetPackage.schemaName.tableName -->
  <property name="enableSubPackages" value="false"/>
  <!-- 是否對model新增 建構函式 true新增,false不新增-->
  <property name="constructorBased" value="false"/>
  <!-- 是否對類CHAR型別的列的資料進行trim操作 -->
  <property name="trimStrings" value="true"/>
  <!-- 建立的Model物件是否 不可改變 即生成的Model物件不會有 setter方法,只有構造方法 -->
  <property name="immutable" value="false"/>
 </javaModelGenerator>
 
 <!--Mapper對映檔案生成所在的目錄 為每一個數據庫的表生成對應的SqlMapper檔案 -->
 <sqlMapGenerator targetPackage="com.test.mapper"
    targetProject=".\src\main\java">
  <property name="enableSubPackages" value="false"/>
 </sqlMapGenerator>
 
 <!-- 客戶端程式碼,生成易於使用的針對Model物件和XML配置檔案 的程式碼
  type="ANNOTATEDMAPPER",生成Java Model 和基於註解的Mapper物件
  type="MIXEDMAPPER",生成基於註解的Java Model 和相應的Mapper物件
  type="XMLMAPPER",生成SQLMapper XML檔案和獨立的Mapper介面
 -->
 <javaClientGenerator targetPackage="com.test.mapper"
    targetProject=".\src\main\java" type="XMLMAPPER">
  <property name="enableSubPackages" value="true"/>
 </javaClientGenerator>
 
 <!--需要對映的資料庫的表名-->
 <table tableName="t_userinfo" domainObjectName="UserInfo"
  enableCountByExample="false" enableUpdateByExample="false"
  enableDeleteByExample="false" enableSelectByExample="false"
  selectByExampleQueryId="false">
 </table>
 </context>
</generatorConfiguration>

2、新建generator.properties檔案

jdbc.driverLocation=C:\\mysql-connector-java-5.1.43.jar
jdbc.driverClass=com.mysql.jdbc.Driver
jdbc.connectionURL=jdbc:mysql://localhost:3306/mybatis
jdbc.userId=root
jdbc.password=tiger

3、配置執行mybatis generator操作,這裡有兩種方式

第1種方式:

如果使用maven專案就可以省去編寫Java啟動類,使用maven外掛和配置檔案pom.xml即可,外掛啟動maven-generator,在pom.xml中新增maven-generator外掛

<plugins>
 <!--myBatis逆向工程外掛-->
 <plugin>
 <groupId>org.mybatis.generator</groupId>
 <artifactId>mybatis-generator-maven-plugin</artifactId>
 <version>1.3.2</version>
 <configuration>
  <verbose>true</verbose>
  <overwrite>true</overwrite>
  <configurationFile>${project.basedir}/src/main/resources/generatorConfig.xml</configurationFile>
 </configuration>
 <dependencies>
  <dependency>
  <groupId>mysql</groupId>
  <artifactId>mysql-connector-java</artifactId>
  <version>5.1.35</version>
  </dependency>
 </dependencies>
 </plugin>
</plugins>

點選mybatis-generator:generate就能執行mybatis generator了

Mybatis Generator逆向工程的使用詳細教程

第2種方式:

1、如果不是maven專案新增該mybatis-generator-core-1.3.2.jar,編寫main方法指向mybatis逆向工程,我給依賴貼上到下面了

<!-- https://mvnrepository.com/artifact/org.mybatis.generator/mybatis-generator-core -->
<dependency>
 <groupId>org.mybatis.generator</groupId>
 <artifactId>mybatis-generator-core</artifactId>
 <version>1.3.2</version>
</dependency>

2、修改generatorConfig.xml檔案,放開註釋的該配置

<classPathEntry location="${jdbc.driverLocation}"/>

3、然後編寫測試類執行

/**
 * 如果不是maven專案可以這樣生成
 */
public class MybatisGeneratorTest {
 public static void main(String[] args) throws InterruptedException,SQLException,IOException,InvalidConfigurationException,XMLParserException {
 List<String> warnings = new ArrayList<String>();
 //生成的java檔案是否覆蓋
 boolean overwrite = true;
 //指定逆向工程配置檔案
 //File configFile = new File("E:\\project\\mybatis-generator\\src\\main\\resources\\generatorConfig.xml");
 InputStream resourceAsStream = MybatisGeneratorTest.class.getClassLoader().getResourceAsStream("generatorConfig.xml");
 ConfigurationParser cp = new ConfigurationParser(warnings);
 Configuration config = cp.parseConfiguration(resourceAsStream);
 DefaultShellCallback callback = new DefaultShellCallback(overwrite);
 MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config,callback,warnings);
 myBatisGenerator.generate(null);
 }
}

介紹完這兩種方式,檢視資料表:

Mybatis Generator逆向工程的使用詳細教程

檢視生成的實體類:​

Mybatis Generator逆向工程的使用詳細教程

TIP:可以看出如果實體類想要遵循駝峰命名規範,資料庫表字段名設計需要用"_"來劃分

檢視生成的檔案資訊:​

Mybatis Generator逆向工程的使用詳細教程

TIP1:必須在<plugin></plugin>標籤裡新增資料庫驅動,在其他地方新增無效,如果不新增會報找不到驅動錯誤,如過不在該外掛新增資料庫依賴的話可以使用 <classPathEntry location="${jdbc.driverLocation}"/> 來指定資料庫驅動位置。

TIP2:如果你在使用mybatis generator外掛執行的時候報[ERROR] Failed to execute goal org.mybatis.generator:mybatis-generator-maven-plugin:1.3.2:generate (default-cli) on project mybatis-generator: <properties> resource generator.properties does not exist -> [Help 1]​

Mybatis Generator逆向工程的使用詳細教程

儘管你的 <properties resource="generator.properties"></properties>配置的沒有問題,但是還是找不到generator.properties,檢視該配置,註釋掉​

Mybatis Generator逆向工程的使用詳細教程

該配置會改變generatorConfig.xml中讀取generator.properties檔案的預設路徑

TIP3:Mybatis Generator反向工程預設不會覆蓋生成的*.java檔案。也可以設定覆蓋生成的*.java檔案,在反向工程外掛mybatis-generator-maven-plugin新增該配置<overwrite>true</overwrite>則會覆蓋生成的*.java檔案,如圖​

Mybatis Generator逆向工程的使用詳細教程

Mybatis Generator不會覆蓋你的mapper.xml檔案,MBG會合並追加到mapper.xml和你自定義的存在一起,但是如果你修改MBG第一次預設生成的SQL(MBG生成的CRUD),MBG會重新把自己生成的CRUD恢復預設,說白了,MBG只會覆蓋他自己生成的SQL,不會覆蓋你自定義的,你自定義的不變。。。如圖,他不會動你的自定義SQL,只會覆蓋Mybatis反向工程自己生成的SQL,前提MBG自動生成SQL語句的註釋要存在。​

Mybatis Generator逆向工程的使用詳細教程

在最常見的用例中,MyBatis Generator(MBG)由XML配置檔案驅動。配置檔案告訴MBG

  • 如何連線到資料庫
  • 生成什麼物件,以及如何生成它們
  • 應使用哪些表生成物件

官方MBG配置檔案詳解地址:http://mybatis.org/generator/configreference/xmlconfig.html

附帶一個MBG的中文配置檔案詳解:https://www.jianshu.com/p/e09d2370b796

更多Mybatis逆向工程的使用參考:http://www.mybatis.org/generator/index.html

總結

到此這篇關於Mybatis Generator逆向工程的使用詳細教程的文章就介紹到這了,更多相關Mybatis Generator逆向工程內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!