MyBatis Generator自動生成程式碼

獅子HH發表於2017-06-19

MBG介紹

MyBatis 是支援定製化 SQL、儲存過程以及高階對映的優秀的持久層框架。MyBatis 避免了幾乎所有的 JDBC 程式碼和手動設定引數以及獲取結果集。MyBatis 可以對配置和原生Map使用簡單的 XML 或註解,將介面和 Java 的 POJOs(Plain Old Java Objects,普通的 Java物件)對映成資料庫中的記錄。

MyBatis使得資料庫操作變得非常方便,使用MyBatis進行資料庫操作的主要工作是書寫Mapping對映檔案,然而手寫對映檔案很容易出錯,而且不夠規範,因此本文使用MBG(MyBatis Generator)工具來自動生成底層模型類、DAO介面類和Mapping對映檔案。

MyBatis Generator可以滿足大部分常用的CRUD(Create,Retrieve,Update,Delete)資料庫操作。對於複雜的操作,如join或儲存過程stored procedures則需要手動編寫SQL程式碼。

MBG將自動生成以下三部分程式碼

  • 與表結構匹配的java POJOs,包括:

    • 一個與表的主鍵相匹配的類(如果該表有主鍵)
    • 一個與表的非主鍵欄位相匹配的類(除了BLOB欄位)
    • 一個包含表中BLOB欄位的類(如果改表含有BLOB欄位)
    • 一個用於動態selects, updates 和 deletes的類(對應於example語句)
  • 與MyBatis/iBATIS相容的SQL Map XML檔案,為簡單的CRUD函式生成SQL語句,生成的SQL語句包括:

    • insert
    • update by primary key
    • update by example (using a dynamic where clause)
    • delete by primary key
    • delete by example (using a dynamic where clause)
    • select by primary key
    • select by example (using a dynamic where clause)
    • count by example
  • 可以使用上述物件的java客戶端類

    對於MyBaits 3.x將生成:

    • 一個mapper介面,適用於MyBatis 3.x mapper結構

    對於iBATIS 2.x將生成:

    • 適用於Spring框架的DAOs
    • 只使用iBATIS SQL對映API的DAOs
    • 適用於iBATIS DAO框架的DAOs(該框架已棄用,建議使用Spring框架)

MBG 應用

下載

下載MBG並解壓:MBG官方下載地址

建立配置檔案

配置檔案用於告訴MBG:

  • 如何連線到資料庫
  • 要生成的物件,以及如何生成
  • 用於物件生成的表

一個最小的配置檔案至少包括5個元素:

  1. <jdbcConnection>元素用於指定如何連線到目標資料庫
  2. <javaModelGenerator>元素用於指定生成的Java model物件的存放位置(包和專案)
  3. <sqlMapGenerator>元素用於指定生成的SQL map檔案的存放位置(包和專案)
  4. <javaClientGenerator>元素用於指定生成的客戶端介面和類的存放位置(包和專案),如果不希望生成Java客戶端程式碼,則忽略該元素
  5. <table>至少一個資料庫表元素

一個來自官網的配置例子,用於解釋配置檔案的結構。

<?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>
  <classPathEntry location="/Program Files/IBM/SQLLIB/java/db2java.zip" />

  <context id="DB2Tables" targetRuntime="MyBatis3">
    <jdbcConnection driverClass="COM.ibm.db2.jdbc.app.DB2Driver"
        connectionURL="jdbc:db2:TEST"
        userId="db2admin"
        password="db2admin">
    </jdbcConnection>

    <javaTypeResolver >
      <property name="forceBigDecimals" value="false" />
    </javaTypeResolver>

    <javaModelGenerator targetPackage="test.model"
                        targetProject="\MBGTestProject\src">
      <property name="enableSubPackages" value="true" />
      <property name="trimStrings" value="true" />
    </javaModelGenerator>

    <sqlMapGenerator targetPackage="test.xml"  targetProject="\MBGTestProject\src">
      <property name="enableSubPackages" value="true" />
    </sqlMapGenerator>

    <javaClientGenerator type="XMLMAPPER" targetPackage="test.dao"
                                          targetProject="\MBGTestProject\src">
      <property name="enableSubPackages" value="true" />
    </javaClientGenerator>

    <table schema="DB2ADMIN" tableName="ALLTYPES" domainObjectName="Customer" >
      <property name="useActualColumnNames" value="true"/>
      <generatedKey column="ID" sqlStatement="DB2" identity="true" />
      <columnOverride column="DATE_FIELD" property="startDate" />
      <ignoreColumn column="FRED" />
      <columnOverride column="LONG_VARCHAR_FIELD" jdbcType="VARCHAR" />
    </table>

  </context>
</generatorConfiguration>

執行MBG

將編輯好的配置檔案放到合適的路徑下,在命令列中執行如下命令自動生成需要的程式碼:

java -jar mybatis-generator-core-x.x.x.jar -configfile generatorConfig.xml -overwrite

-overwrite 告訴MBG覆蓋已經存在的同名Java檔案,如果想保留已經存在的Java檔案,就忽略該引數。
如果忽略-overwrite引數,在有衝突時,MBG會在檔名後附加.1,例如MyClass.java.1,需要人工解決衝突。

MBG 實戰

資料庫表結構

CREATE TABLE IF NOT EXISTS merchant_user_wechat_map (
  id                    int(10)      UNSIGNED  AUTO_INCREMENT               COMMENT 'id',
  username              varchar(255)              NOT NULL                  COMMENT '使用者名稱',
  openid                varchar(255)              NOT NULL                  COMMENT '使用者微信的openid',
  created_at            timestamp    NOT NULL DEFAULT CURRENT_TIMESTAMP     COMMENT '建立時間',
  updated_at            timestamp    NOT NULL DEFAULT 0                             COMMENT '更新時間',
  is_deleted            tinyint(1)      UNSIGNED           DEFAULT 0        COMMENT '是否刪除',
  PRIMARY KEY (id),
  unique KEY username  (username),
  KEY created_at  (created_at)
)
  ENGINE = InnoDB
  DEFAULT CHARSET  = utf8
  COLLATE = utf8_unicode_ci
  COMMENT = '使用者微信與賬戶的對映關係';

* is_deleted 軟刪除,預設為0,需要刪除改記錄時,將該欄位置為1即可。軟刪除便於追蹤歷史記錄,用軟刪除後需要在查詢、更新等邏輯處進行該欄位的判斷。 *

配置檔案

下載mysql-connector-java,用於連線到資料庫,下載地址,放到<你的mysql-connector-java存放路徑>,配置檔案中會用到該地址。

編寫你的配置檔案,如generatorConfig.xml。可以直接複製下面的配置進行使用,需要修改

  1. <你的mysql-connector-java存放路徑>
  2. 資料庫連線: connectionURL、userId、password
  3. 生成類存放路徑:targetPackage、targetProject
  4. 你自己的元素
<?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>
    <classPathEntry location="<你的mysql-connector-java存放路徑>/mysql-connector-java-5.1.42/mysql-connector-java-5.1.42-bin.jar"/>

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

        <property name="autoDelimitKeywords" value="true"/>
        <property name="beginningDelimiter" value="`"/>
        <property name="endingDelimiter" value="`"/>

        <plugin type="org.mybatis.generator.plugins.RowBoundsPlugin"/>
        <plugin type="org.mybatis.generator.plugins.SerializablePlugin"/>

        <commentGenerator>
            <property name="suppressAllComments" value="true"/>
        </commentGenerator>

        <jdbcConnection driverClass="com.mysql.jdbc.Driver"
                        connectionURL="jdbc:mysql://localhost:3306/store_service?zeroDateTimeBehavior=convertToNull&amp;useSSL=false&amp;useUnicode=true&amp;characterEncoding=UTF-8"
                        userId="testuser"
                        password="testpw">
        </jdbcConnection>

        <javaTypeResolver>
            <property name="forceBigDecimals" value="false"/>
        </javaTypeResolver>

        <!--生成Model類存放位置-->
        <javaModelGenerator targetPackage="example.mbg.tutorial.domain"
                            targetProject="src/main/java">
            <property name="enableSubPackages" value="true"/>
            <property name="trimStrings" value="true"/>
        </javaModelGenerator>

        <sqlMapGenerator targetPackage="example.mbg.tutorial.repository.mapper"
                         targetProject="src/main/resources/base">
            <property name="enableSubPackages" value="true"/>
        </sqlMapGenerator>

        <javaClientGenerator type="XMLMAPPER"
                             targetPackage="example.mbg.tutorial.repository.mapper"
                             targetProject="src/main/java">
            <property name="enableSubPackages" value="true"/>
        </javaClientGenerator>

        <table tableName="merchant_user_wechat_map" domainObjectName="MerchantUserWechatMap" >
            <generatedKey column="id" sqlStatement="JDBC" identity="true"/>
            <columnOverride column="id" javaType="Long"/>
            <columnOverride column="username" javaType="String"/>
            <columnOverride column="openid" javaType="String"/>
            <columnOverride column="created_at" javaType="String"/>
            <columnOverride column="updated_at" javaType="String"/>
            <columnOverride column="is_deleted" javaType="Integer"/>
        </table>

    </context>
</generatorConfiguration>

執行MBG

java -jar mybatis-generator-core-x.x.x.jar -configfile generatorConfig.xml

生成4個檔案如圖所示:

mbg生成檔案

相關文章