1. 程式人生 > >MyBatis Generator 詳解

MyBatis Generator 詳解

MyBatis Generator中文文件地址:

該中文文件由於儘可能和原文內容一致,所以有些地方如果不熟悉,看中文版的文件的也會有一定的障礙,所以本章根據該中文文件以及實際應用,使用通俗的語言來講解詳細的配置。

本文中所有節點的連結都是對應的中文文件地址,可以點選檢視詳細資訊。

注:本文後面提到的MBG全部指代MyBatis Generator。

在MBG中,最主要也最重要的就是XML配置檔案,因此本篇文章主要的內容就是XML配置。

這裡按照配置的順序對配置逐個講解,更細的內容可以配合中文文件參照。

1. 配置檔案頭

<?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">

使用最新版的MBG需要使用上面的xml頭,配置檔案必須包含上面的DOCTYPE

generatorConfiguration節點沒有任何屬性,直接寫節點即可,如下:

<generatorConfiguration>
    <!-- 具體配置內容 -->
</generatorConfiguration>  

3. <generatorConfiguration>子元素

從這段開始,就是配置的主要內容,這些配置都是generatorConfiguration元素的子元素。

包含以下子元素(有嚴格的順序):

這個元素用來指定外部的屬性元素,不是必須的元素。

元素用於指定一個需要在配置中解析使用的外部屬性檔案,引入屬性檔案後,可以在配置中使用 ${property}這種形式的引用,通過這種方式引用屬性檔案中的屬性值。 對於後面需要配置的**jdbc資訊**和targetProject屬性會很有用。

這個屬性可以通過resource或者url來指定屬性檔案的位置,這兩個屬性只能使用其中一個來指定,同時出現會報錯。

  • resource:指定**classpath**下的屬性檔案,使用類似com/myproject/generatorConfig.properties這樣的屬性值。

  • url:可以指定檔案系統上的特定位置,例如file:///C:/myfolder/generatorConfig.properties

這個元素可以0或多個,不受限制。

最常見的用法是通過這個屬性指定驅動的路徑,例如:

<classPathEntry location="E:\mysql\mysql-connector-java-5.1.29.jar"/>

重點提醒:本文之前在這裡有誤導,特別強調。

注意,classPathEntry只在下面這兩種情況下才有效

  • 當載入 JDBC 驅動內省資料庫時
  • 當載入根類中的 JavaModelGenerator 檢查重寫的方法時
因此,如果你需要載入其他用途的jar包,classPathEntry起不到作用,不能這麼寫,解決的辦法就是將你用的jar包新增到類路徑中,在Eclipse等IDE中執行的時候,新增jar包比較容易。當從命令列執行的時候,需要用java -cp xx.jar,xx2.jar xxxMainClass這種方式在-cp後面指定來使用(注意-jar會導致-cp無效)。

在MBG的配置中,至少需要有一個<context>元素。

<context>元素用於指定生成一組物件的環境。例如指定要連線的資料庫,要生成物件的型別和要處理的資料庫中的表。執行MBG的時候還可以指定要執行的<context>

該元素只有一個**必選屬性**id,用來唯一確定一個<context>元素,該id屬性可以在執行MBG的使用。

此外還有幾個**可選屬性**:

  • defaultModelType:**這個屬性很重要**,這個屬性定義了MBG如何生成**實體類**。
    這個屬性有以下可選值:

    • conditional:*這是預設值*,這個模型和下面的hierarchical類似,除了如果那個單獨的類將只包含一個欄位,將不會生成一個單獨的類。 因此,如果一個表的主鍵只有一個欄位,那麼不會為該欄位生成單獨的實體類,會將該欄位合併到基本實體類中。
    • flat:該模型為每一張表只生成一個實體類。這個實體類包含表中的所有欄位。**這種模型最簡單,推薦使用。**
    • hierarchical:如果表有主鍵,那麼該模型會產生一個單獨的主鍵實體類,如果表還有BLOB欄位, 則會為表生成一個包含所有BLOB欄位的單獨的實體類,然後為所有其他的欄位生成一個單獨的實體類。 MBG會在所有生成的實體類之間維護一個繼承關係。
  • targetRuntime:此屬性用於指定生成的程式碼的執行時環境。該屬性支援以下可選值:

    • MyBatis3:*這是預設值*
    • MyBatis3Simple
    • Ibatis2Java2
    • Ibatis2Java5 一般情況下使用預設值即可,有關這些值的具體作用以及區別請檢視中文文件的詳細內容。
  • introspectedColumnImpl:該引數可以指定擴充套件org.mybatis.generator.api.IntrospectedColumn該類的實現類。該屬性的作用可以檢視擴充套件MyBatis Generator

一般情況下,我們使用如下的配置即可:

<context id="Mysql" defaultModelType="flat">

如果你希望不生成和Example查詢有關的內容,那麼可以按照如下進行配置:

<context id="Mysql" targetRuntime="MyBatis3Simple" defaultModelType="flat">

使用MyBatis3Simple可以避免在後面的<table>中逐個進行配置(後面會提到)。

MBG配置中的其他幾個元素,基本上都是<context>的子元素,這些子元素(有嚴格的配置順序)包括:

其中<property>屬性比較特殊,後面講解的時候都會和父元素一起進行講解。在講解<property>屬性前,我們先看看**什麼是分隔符?**。

這裡通過一個例子說明。假設在Mysql資料庫中有一個表名為user info,你沒有看錯,中間是一個空格,這種情況下如果寫出select * from user info這樣的語句,肯定是要報錯的,在Mysql中的時候我們一般會寫成如下的樣子:

select * from `user info`

這裡的使用的**反單引號(`)**就是**分隔符**,**分隔符**可以用於**表名**或者**列名**。

下面繼續看<property>支援的屬性:

  • autoDelimitKeywords
  • beginningDelimiter
  • endingDelimiter
  • javaFileEncoding
  • javaFormatter
  • xmlFormatter

由於這些屬性比較重要,這裡一一講解。

首先是autoDelimitKeywords,當表名或者欄位名為SQL關鍵字的時候,可以設定該屬性為true,MBG會自動給表名或欄位名新增**分隔符**。

然後這裡繼續上面的例子來講beginningDelimiterendingDelimiter屬性。
由於beginningDelimiterendingDelimiter的預設值為雙引號("),在Mysql中不能這麼寫,所以還要將這兩個預設值改為**反單引號(`)**,配置如下:

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

屬性javaFileEncoding設定要使用的Java檔案的編碼,預設使用當前平臺的編碼,只有當生產的編碼需要特殊指定時才需要使用,一般用不到。

最後兩個javaFormatterxmlFormatter屬性**可能會**很有用,如果你想使用模板來定製生成的java檔案和xml檔案的樣式,你可以通過指定這兩個屬性的值來實現。

接下來分節對其他的子元素逐個進行介紹。

該元素可以配置0個或者多個,不受限制。

<plugin>元素用來定義一個外掛。外掛用於擴充套件或修改通過MyBatis Generator (MBG)程式碼生成器生成的程式碼。

外掛將按在配置中配置的順序執行。

有關外掛的詳細資訊可以參考開發外掛提供的外掛瞭解更多。

該元素最多可以配置1個。

這個元素非常有用,相信很多人都有過這樣的需求,就是希望MBG生成的程式碼中可以包含**註釋資訊**,具體就是生成表或欄位的備註資訊。

使用這個元素就能很簡單的實現我們想要的功能。這裡先介紹該元素,介紹完後會舉例如何擴充套件實現該功能。

該元素有一個可選屬性type,可以指定使用者的實現類,該類需要實現org.mybatis.generator.api.CommentGenerator介面。而且必有一個預設的構造方法。這個屬性接收預設的特殊值DEFAULT,會使用預設的實現類org.mybatis.generator.internal.DefaultCommentGenerator

預設的實現類中提供了兩個可選屬性,需要通過<property>屬性進行配置。

  • suppressAllComments:**阻止**生成註釋,預設為false
  • suppressDate:**阻止**生成的註釋包含時間戳,預設為false

一般情況下由於MBG生成的註釋資訊沒有任何價值,而且有時間戳的情況下每次生成的註釋都不一樣,使用**版本控制**的時候每次都會提交,因而一般情況下我們都會遮蔽註釋資訊,可以如下配置:

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

接下來我們簡單舉例實現生成包含表字段註釋資訊的註釋

因為系統提供了一個預設的實現類,所以對我們來說,自己實現一個會很容易,最簡單的方法就是複製預設實現類程式碼到一個新的檔案中,修改類名如MyCommentGenerator,在你自己的實現類中,你可以選擇是否繼續支援上面的兩個屬性,你還可以增加對其他屬性的支援。

我們通過下面一個方法的修改來了解,其他幾個方法請自行修改(寫本章的時候我也沒有完全實現該類,所以不提供完整原始碼了):

@Override
public void addFieldComment(Field field, IntrospectedTable introspectedTable, IntrospectedColumn introspectedColumn) {
    if (introspectedColumn.getRemarks() != null && !introspectedColumn.getRemarks().equals("")) {
        field.addJavaDocLine("/**");
        field.addJavaDocLine(" * " + introspectedColumn.getRemarks());
        addJavadocTag(field, false);
        field.addJavaDocLine(" */");
    }
}

這個方法是給欄位添加註釋資訊的,其中IntrospectedColumn包含了欄位的完整資訊,通過getRemarks方法可以獲取欄位的註釋資訊。上面這個方法修改起來還是很容易的。除了欄位的註釋外還有GetterSetter,以及類的註釋。此外還有生成XML的註釋,大家可以根據預設的實現進行修改。

完成我們自己的實現類後,我們還需要做如下配置:

<commentGenerator type="com.github.abel533.mybatis.generator.MyCommentGenerator"/>

<jdbcConnection>用於指定資料庫連線資訊,該元素必選,並且只能有一個。

配置該元素只需要注意如果JDBC驅動不在**classpath**下,就需要通過<classPathEntry>元素引入jar包,這裡**推薦**將jar包放到**classpath**下。

該元素有兩個必選屬性:

  • driverClass:訪問資料庫的JDBC驅動程式的完全限定類名
  • connectionURL:訪問資料庫的JDBC連線URL

該元素還有兩個可選屬性:

  • userId:訪問資料庫的使用者ID
  • password:訪問資料庫的密碼

此外該元素還可以接受多個<property>子元素,這裡配置的<property>屬性都會新增到JDBC驅動的屬性中。

這個元素配置起來最容易,這裡舉個簡單例子:

<jdbcConnection driverClass="com.mysql.jdbc.Driver"
                connectionURL="jdbc:mysql://localhost:3306/test"
                userId="root"
                password="">
</jdbcConnection>

該元素最多可以配置一個。

這個元素的配置用來指定JDBC型別和Java型別如何轉換。

該元素提供了一個可選的屬性type,和<commentGenerator>比較型別,提供了預設的實現DEFAULT,一般情況下使用預設即可,需要特殊處理的情況可以通過其他元素配置來解決,不建議修改該屬性。

該屬性還有一個可以配置的<property>元素。

可以配置的屬性為forceBigDecimals,該屬性可以控制是否強制DECIMALNUMERIC型別的欄位轉換為Java型別的java.math.BigDecimal,預設值為false,一般不需要配置。

預設情況下的轉換規則為:

  1. 如果精度>0或者長度>18,就會使用java.math.BigDecimal
  2. 如果精度=0並且10<=長度<=18,就會使用java.lang.Long
  3. 如果精度=0並且5<=長度<=9,就會使用java.lang.Integer
  4. 如果精度=0並且長度<5,就會使用java.lang.Short

如果設定為true,那麼一定會使用java.math.BigDecimal,配置示例如下:

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

該元素必須配置一個,並且最多一個。

該元素用來控制生成的實體類,根據<context>中配置的defaultModelType,一個表可能會對應生成多個不同的實體類。一個表對應多個類實際上並不方便,所以前面也推薦使用flat,這種情況下一個表對應一個實體類。

該元素只有兩個屬性,都是必選的。

  • targetPackage:生成實體類存放的包名,一般就是放在該包下。實際還會受到其他配置的影響(<table>中會提到)。
  • targetProject:指定目標專案路徑,可以是絕對路徑或相對路徑(如 targetProject="src/main/java")。

該元素支援以下幾個<property>子元素屬性:

  • constructorBased:該屬性只對MyBatis3有效,如果true就會使用構造方法入參,如果false就會使用setter方式。預設為false
  • enableSubPackages:如果true,MBG會根據catalogschema來生成子包。如果false就會直接用targetPackage屬性。預設為false
  • immutable:該屬性用來配置實體類屬性是否可變,如果設定為true,那麼constructorBased不管設定成什麼,都會使用構造方法入參,並且不會生成setter方法。如果為false,實體類屬性就可以改變。預設為false
  • rootClass:設定所有實體類的基類。如果設定,需要使用類的全限定名稱。並且如果MBG能夠載入rootClass,那麼MBG不會覆蓋和父類中完全匹配的屬性。匹配規則:

    • 屬性名完全相同
    • 屬性型別相同
    • 屬性有getter方法
    • 屬性有setter方法
  • trimStrings:是否對資料庫查詢結果進行trim操作,如果設定為true就會生成類似這樣public void setUsername(String username) {this.username = username == null ? null : username.trim();}setter方法。預設值為false

配置示例如下:

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

該元素可選,最多配置一個。但是有如下兩種必選的特殊情況:

  • 如果targetRuntime目標是**iBATIS2**,該元素必須配置一個。
  • 如果targetRuntime目標是**MyBatis3**,只有當<javaClientGenerator>需要XML時,該元素必須配置一個。 如果沒有配置<javaClientGenerator>,則使用以下的規則:
    • 如果指定了一個<sqlMapGenerator>,那麼MBG將只生成XML的SQL對映檔案和實體類。
    • 如果沒有指定<sqlMapGenerator>,那麼MBG將只生成實體類。

該元素只有兩個屬性(和前面提過的<javaModelGenerator>的屬性含義一樣),都是必選的。

  • targetPackage:生成實體類存放的包名,一般就是放在該包下。實際還會受到其他配置的影響(<table>中會提到)。
  • targetProject:指定目標專案路徑,可以是絕對路徑或相對路徑(如 targetProject="src/main/resources")。

該元素支援<property>子元素,只有一個可以配置的屬性:

  • enableSubPackages:如果true,MBG會根據catalogschema來生成子包。如果false就會直接用targetPackage屬性。預設為false

配置示例:

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

該元素可選,最多配置一個。

如果不配置該元素,就不會生成Mapper介面。

該元素有3個必選屬性:

  • type:該屬性用於選擇一個預定義的客戶端程式碼(可以理解為Mapper介面)生成器,使用者可以自定義實現,需要繼承

    相關推薦

    MyBatis Generator

    MyBatis Generator中文文件地址:該中文文件由於儘可能和原文內容一致,所以有些地方如果不熟悉,看中文版的文件的也會有一定的障礙,所以本章根據該中文文件以及實際應用,使用通俗的語言來講解詳細的配置。本文中所有節點的連結都是對應的中文文件地址,可以點選檢視詳細資訊。注:本文後面提到的MBG全部指代M

    MyBatis Generator

    MyBatis Generator中文文件地址: 該中文文件由於儘可能和原文內容一致,所以有些地方如果不熟悉,看中文版的文件的也會有一定的障礙,所以本章根據該中文文件以及實際應用,使用通俗的語言來講解詳細的配置。 本文中所有節點的連結都是對應的中文

    generator

    直接 嵌套 遞歸 resolv typeof then n) else str generator函數 yield可以返回值,也可以傳入值 形式: 註意!generator不能寫成arrow function的形式!!! function *函數(){ 代碼1..

    mybatis 基礎

    batis 添加用戶 主鍵 actor cor @override iba 基本功 ide 轉 https://www.cnblogs.com/Mr-Kenson/p/8124680.html mybatis 是一個開源的 用於對數據庫操作的框架, 讀者基本都大體了解其

    spring+springmvc+mybatis整合

    一,導包 1,建立一個web工程,匯入spring,springmvc,mybatis需要的jar包 2,下載適配包Mybatis-Spring.jar(或者寫依賴),不同版本的spring和mybatis需要的適配包不同 二,web.xml (在WEB-INF目錄下) 1,載

    Hibernate與Mybatis區別

    1. hibernate是全自動,而mybatis是半自動 hibernate完全可以通過物件關係模型實現對資料庫的操作,擁有完整的JavaBean物件與資料庫的對映結構來自動生成sql。而mybatis僅有基本的欄位對映,物件資料以及物件實際關係仍然

    mybatis配置

    1.SqlMapConfig.xml configuration作為根標籤有如下子標籤,dtd資訊已經將其子標籤出現的順序以及次數規定好了 <1>properties(屬性),該標籤中有resource(類路徑)或url(檔案路徑例:url=”file:/

    Python中的generator

    注:本文在原文基礎上做了一點點修改,僅僅作為個人理解與記憶,建議直接檢視原文。 generator使用場景:   1  當我們需要一個公用的,按需生成的資料   2  某個事情執行一部分,另一部分在某個事件發生後再執行下一部分,實現非同步。 注意事項:  

    Mybatis 坑路2 -> MyBatis 配置

    ####使用 XML 配置 MyBatis   Mybatis 最關鍵的組成部分是 SqlSessionFactory,我們可以從中獲取 SqlSession,並執行對映的 SQL 語句。   SqlSessionFactory 物件可以通過基

    Mybatis使用和入門案例

    前言 MyBatis和Hibernate一樣,是一個優秀的持久層框架。已經說過很多次了,原生的jdbc操作存在大量的重複性程式碼(如註冊驅動,建立連線,建立statement,結果集檢測等)。框架的作用就是把這些繁瑣的程式碼封裝,這樣可以讓程式設計師專注於sql語句本身。

    Maven搭建SpringMVC+Mybatis專案

    前言          最近比較閒,複習搭建一下專案,這次主要使用Spring+SpringMVC+Mybatis。專案持久層使用Mybatis3,控制層使用SpringMVC4.1,使用Spring4.1管理控制器,資料庫連線池使用druid資料來源,該項資料庫暫使用My

    MyBatis 開發

    Mybatis是什麼—基於Java的持久層框架 MyBatis 本是apache的一個開源專案iBatis, 2010年這個專案由apache software foundation 遷移到了google code,並且改名為MyBatis 。2013年

    mybatis TypeHandler

    1.TypeHandler概念 TypeHandler,型別轉換器,在mybatis中用於實現java型別和JDBC型別的相互轉換.mybatis使用prepareStatement來進行引數設定的時候,需要通過typeHandler將傳入的java引數設定成

    JAVAORM框架之Mybatis (Ibatis)

    agen r.java文件 conn soc 部分 ppr jdbc project shm 目錄 Mybatis基礎概念 Mybatis開放方式演進 Mybatis框架核心要點 關聯查詢 延遲加載(懶加載) 動態SQL Mybatis緩存 Mybatis逆向工程 Pag

    MyBatis學習(1):Mybatis使用和入門案例

    前言 MyBatis和Hibernate一樣,是一個優秀的持久層框架。已經說過很多次了,原生的jdbc操作存在大量的重複性程式碼(如註冊驅動,建立連線,建立statement,結果集檢測等)。框架的作用就是把這些繁瑣的程式碼封裝,這樣可以讓程式設計師專注於sq

    SpringBoot 整合MyBatis案例

    SpringBoot約定大於配置的特點,讓框架的配置非常簡潔,與傳統的SSM框架相比,簡化了大量的XML配置,使得程式設計師可以從繁瑣的配置中脫離出來,將精力集中在業務程式碼層面,提高了開發效率,並且後期的維護成本也大大降低。 從原始碼中可以看到,每一個springboot整合的jar包也是一個maven的

    MyBatis標籤(轉)

    MyBatis 真正的核心在對映檔案中。比直接使用 JDBC 節省95%的程式碼。而且將 SQL 語句獨立在 Java 程式碼之外,可以進行更為細緻的 SQL 優化。   一、 對映檔案的頂級元素 select:對映查詢語句 insert:對映插入語句 update:對映更新語句

    mybatis學習二:mybatis配置

    MyBatis最關鍵的組成部分是SqlSessionFactory,我們可以從中獲取SqlSession, 並執行對映的SQL語句。 SqlSessionFactory物件可以通過基於XML的配置資訊或者JavaAPI建立。 注意:setting初期學習以連線為

    mybatis xml及示例

    說明:主要介紹mybatis   xml檔案的一般屬性。 <select id="findUserAll" parameterType="com.zpkj.space.model.query.UserQuery" resultType="com.zpkj.spac

    SpringBoot多資料來源及MyBatis配置

    前言 最近迫於專案需要,筆者踏上了springboot多資料來源的配置之旅。之前筆者配置過spring的動態多資料來源切換,當時使用的是JDBC Template。 目前專案中持久化框架使用是mybatis,經過分析後不難發現,多資料來源配置需要解決兩個問題,一個是由原先的spring經典方式切換到了