MyBatis Generator生成文件分析

【原創(chuàng)文章瓣喊,轉載請注明原文章地址蚪拦,謝謝溯街!】

Paste_Image.png

在進入MyBatis Generator生成器之前较坛,先分析一下MBG生成的代碼結構:

示例###

示例使用的DDL為:

CREATE TABLE `userinfo` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`userName` varchar(255) DEFAULT NULL,
`password` varchar(255) DEFAULT NULL,
`email` varchar(255) DEFAULT NULL,
`age` int(11) DEFAULT NULL,
`DEPT_ID` bigint(20) DEFAULT NULL,
`admin` tinyint(1) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `FK_11v5rvnq0cx1ljqf41fud7feg` (`DEPT_ID`)
) 

使用的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>
<context id="mysql" defaultModelType="hierarchical" targetRuntime="MyBatis3">

    <property name="javaFileEncoding" value="UTF-8" />
    <property name="beginningDelimiter" value="`" />
    <property name="endingDelimiter" value="`" />

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

    <javaTypeResolver
        type="org.mybatis.generator.internal.types.JavaTypeResolverDefaultImpl">
        <property name="forceBigDecimals" value="false" />
    </javaTypeResolver>

    <javaModelGenerator targetPackage="com._520it.mybatis.domain" targetProject="src/main/java">
        <property name="enableSubPackages" value="true" />
        <property name="trimStrings" value="true" />
    </javaModelGenerator>

    <sqlMapGenerator targetPackage="com._520it.mybatis.mapper" targetProject="src/main/resources">
        <property name="enableSubPackages" value="true" />
    </sqlMapGenerator>

    <javaClientGenerator targetPackage="com._520it.mybatis.mapper" type="MIXEDMAPPER" targetProject="src/main/java">
        <property name="enableSubPackages" value="true" />
    </javaClientGenerator>

    <table tableName="userinfo">
        <columnOverride column="username">
            <!-- 使用property屬性來指定列要生成的屬性名稱 -->
            <property name="property" value="userName" />
        </columnOverride>
    </table>
</context>
</generatorConfiguration>

使用的是mybatis generator maven plugin生成凛驮,使用的是MyBatis3 runtime瓦哎,生成的對象有:

  • UserinfoKey:包裝了主鍵的對象摔敛;
  • Userinfo:除了主鍵的其他字段包裝在Userinfo類中棵帽;
  • UserinfoExample:包裝了動態(tài)查詢的查詢條件括袒;
  • UserinfoMapper:MyBatis3的Mapper接口官辈,其中簡單的CRUD直接使用Annotation標記翘瓮,復雜的SQL放在mapper.xml中贮折;
  • UserInfoMapper.xml:生成的mapper.xml文件;

具體的類結構圖如下:

Paste_Image.png

在所有生成的內容中资盅,注意動態(tài)查詢的幾個類的關系:

  • Criteria脱货,GeneratedCriteria和Criterion都是UserInfoExample的內部類岛都;
  • 在GeneratedCriteria類中,我只列出了針對id的N多個條件方法振峻,其實MBG為每一個類型都創(chuàng)建了這么多個方法臼疫;目的就是為了能像Hibernate的Criteria的查詢方式;
  • 查詢的使用:MBG生成的這堆內容扣孟,最重要的目的我感覺就是為了讓動態(tài)查詢更像Hibernate的Criteria烫堤,在使用的時候,按照下面的步驟:
    • 不要把UserInfoExample想象成QueryObject凤价,可以把他想象成Hibernate中的Query對象鸽斟;
    • 調用UserinfoExample對象的createCriteria方法先創(chuàng)建一個Criteria對象,因為這個對象的查詢方法都是返回Criteria對象本身利诺,所以也可以使用方法調用鏈的方式執(zhí)行富蓄;
    • 調用Criteria對象上提供給各個屬性的各種添加查詢條件的方法,按照實際查詢情況調用對應方法即可慢逾;
    • 將設置好條件的UserinfoExample對象立倍,傳給UserInfoMapper中對應的方法即可,可接受的方法主要幾個XXXByExample方法侣滩;

另外需要看一下的就是UserinfoMapper.xml中生成的一些關鍵代碼口注,最重要的就是按照Criteria創(chuàng)建查詢條件的方式,簡單說君珠,調用Criteria對象上的每一個查詢條件寝志,其實都是創(chuàng)建了一個Criterion對象,保持在Criteria對象中的List<Criterion>集合中策添,在查詢的時候材部,其實就是遍歷其中每一個Criterion,按照傳入的列唯竹,條件败富,具體的參數來完成查詢的拼裝:

<sql id="Example_Where_Clause">
<where>
  <foreach collection="oredCriteria" item="criteria" separator="or">
    <if test="criteria.valid">
      <trim prefix="(" prefixOverrides="and" suffix=")">
        <foreach collection="criteria.criteria" item="criterion">
          <choose>
            <when test="criterion.noValue">
              and ${criterion.condition}
            </when>
            <when test="criterion.singleValue">
              and ${criterion.condition} #{criterion.value}
            </when>
            <when test="criterion.betweenValue">
              and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
            </when>
            <when test="criterion.listValue">
              and ${criterion.condition}
              <foreach close=")" collection="criterion.value" item="listItem" open="(" separator=",">
                #{listItem}
              </foreach>
            </when>
          </choose>
        </foreach>
      </trim>
    </if>
  </foreach>
</where>
</sql>

到此,MyBatis3生成的比較復雜的runtime已經分析完成摩窃,接下來就可以分析MBG的實現(xiàn)方式等了兽叮。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市猾愿,隨后出現(xiàn)的幾起案子鹦聪,更是在濱河造成了極大的恐慌,老刑警劉巖蒂秘,帶你破解...
    沈念sama閱讀 218,036評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件泽本,死亡現(xiàn)場離奇詭異,居然都是意外死亡姻僧,警方通過查閱死者的電腦和手機规丽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評論 3 395
  • 文/潘曉璐 我一進店門蒲牧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人赌莺,你說我怎么就攤上這事冰抢。” “怎么了艘狭?”我有些...
    開封第一講書人閱讀 164,411評論 0 354
  • 文/不壞的土叔 我叫張陵挎扰,是天一觀的道長。 經常有香客問我巢音,道長遵倦,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,622評論 1 293
  • 正文 為了忘掉前任官撼,我火速辦了婚禮梧躺,結果婚禮上,老公的妹妹穿的比我還像新娘傲绣。我一直安慰自己掠哥,他們只是感情好,可當我...
    茶點故事閱讀 67,661評論 6 392
  • 文/花漫 我一把揭開白布斜筐。 她就那樣靜靜地躺著,像睡著了一般蛀缝。 火紅的嫁衣襯著肌膚如雪顷链。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,521評論 1 304
  • 那天屈梁,我揣著相機與錄音嗤练,去河邊找鬼。 笑死在讶,一個胖子當著我的面吹牛煞抬,可吹牛的內容都是我干的。 我是一名探鬼主播构哺,決...
    沈念sama閱讀 40,288評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼革答,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了曙强?” 一聲冷哼從身側響起残拐,我...
    開封第一講書人閱讀 39,200評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎碟嘴,沒想到半個月后溪食,有當地人在樹林里發(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 45,644評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡娜扇,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,837評論 3 336
  • 正文 我和宋清朗相戀三年错沃,在試婚紗的時候發(fā)現(xiàn)自己被綠了栅组。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,953評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡枢析,死狀恐怖玉掸,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情登疗,我是刑警寧澤排截,帶...
    沈念sama閱讀 35,673評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站辐益,受9級特大地震影響断傲,放射性物質發(fā)生泄漏。R本人自食惡果不足惜智政,卻給世界環(huán)境...
    茶點故事閱讀 41,281評論 3 329
  • 文/蒙蒙 一认罩、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧续捂,春花似錦垦垂、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,889評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至矾克,卻和暖如春页慷,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背胁附。 一陣腳步聲響...
    開封第一講書人閱讀 33,011評論 1 269
  • 我被黑心中介騙來泰國打工酒繁, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人控妻。 一個月前我還...
    沈念sama閱讀 48,119評論 3 370
  • 正文 我出身青樓州袒,卻偏偏與公主長得像,于是被迫代替她去往敵國和親弓候。 傳聞我的和親對象是個殘疾皇子郎哭,可洞房花燭夜當晚...
    茶點故事閱讀 44,901評論 2 355

推薦閱讀更多精彩內容

  • 本文包括:1、Hibernate 的查詢方式2菇存、HQL (Hibernate Query Language) 查詢...
    廖少少閱讀 2,656評論 0 15
  • hibernate(20170731) 1.導包:hibernate-distribution-3.5.6-Fin...
    瀟湘雨smile閱讀 541評論 0 0
  • 這部分主要是開源Java EE框架方面的內容彰居,包括Hibernate、MyBatis撰筷、Spring陈惰、Spring ...
    雜貨鋪老板閱讀 1,381評論 0 2
  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法,內部類的語法抬闯,繼承相關的語法井辆,異常的語法,線程的語...
    子非魚_t_閱讀 31,631評論 18 399
  • 盡管現(xiàn)在手機屏幕的趨勢是越做越大溶握,然而實際上真正使得手機如此輕便的地方正在于它的小尺寸杯缺。相比于臺式電腦,甚至筆記本...
    三達不留點gpj閱讀 2,880評論 0 24