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時需要注意的重要事項包括:

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

  2. 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了

第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);
    }
}

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

檢視生成的實體類:


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

檢視生成的檔案資訊:


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]


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


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

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


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


在最常見的用例中,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


● XStream學習手冊

● 別在 Java 程式碼裡亂打日誌了,這才是正確的打日誌姿勢!

● 高可用Redis服務架構分析與搭建

● 8 種方案,幫你解決重複提交問題!請拿走

● IDEA 解決 Maven 依賴衝突的高能神器,這一篇夠不夠?