【MyBatis】解讀SQL映射文件

MyBatis框架真正強(qiáng)大之處就在于SQL映射語(yǔ)句砰奕,mybatis專注于SQL脯丝,對(duì)開(kāi)發(fā)人員來(lái)說(shuō)可以極大限度地進(jìn)行SQL調(diào)優(yōu),以保證性能饶囚。方便使用mybatis框架帕翻,現(xiàn)在就來(lái)談?wù)凷QL映射文件。

<mapper>標(biāo)簽是根元素節(jié)點(diǎn)萝风,只有一個(gè)屬性namespace(命名空間)嘀掸,作用:

  • 用于區(qū)分不同的mapper,全局唯一规惰。
  • 綁定DAO接口睬塌,即面向接口編程。當(dāng)namespace綁定了某個(gè)接口后歇万,可不用寫該接口的實(shí)現(xiàn)類揩晴,mybatis會(huì)根據(jù)接口的完整限定名查找到對(duì)應(yīng)的mapper配置來(lái)執(zhí)行SQL語(yǔ)句,因此namespace的命名必須跟接口同名贪磺。

注意:接口中的方法與映射文件中的SQL語(yǔ)句id應(yīng)對(duì)應(yīng)硫兰。如下代碼中的id=“selectUserById”,則DAO接口中就有selectUserById()與之對(duì)應(yīng)寒锚。

<select id="selectUserById" resultType="xiaojiang.mybatisdemo.entity.User">
        select id,name,sex from user where id = #{id}
</select>

關(guān)于#{...}和${...}的符號(hào)作用:“#”一般是用做參數(shù)傳遞劫映,告訴mybatis生成PreparedStatement參數(shù)违孝,而“{}”一般是作為占位符。

<resultMap>標(biāo)簽泳赋,用來(lái)描述數(shù)據(jù)庫(kù)結(jié)果集和對(duì)象的對(duì)應(yīng)關(guān)系雌桑,即如何將結(jié)果集映射到j(luò)ava對(duì)象中。
還有<select>祖今,<delete>校坑,<update>,<insert>標(biāo)簽 對(duì)應(yīng)增刪改查映射操作千诬。

<resultMap id="唯一標(biāo)識(shí)耍目,供外部引用" type="映射結(jié)果類型,如:基本類型和pojo類">
  <result property="實(shí)體對(duì)象屬性" column="數(shù)據(jù)表中的字段名" />   //表示把查詢出來(lái)的字段對(duì)應(yīng)的值賦給實(shí)體對(duì)象的屬性
  ......
</resultMap>

增刪改查標(biāo)簽內(nèi)的parameterType屬性:表示查詢語(yǔ)句傳入?yún)?shù)的類型的完全限定名或別名大渤,支持復(fù)雜數(shù)據(jù)類型,用來(lái)指定輸入?yún)?shù)的類型掸绞。resultType屬性:查詢語(yǔ)句返回結(jié)果類型的完全限定名或別名泵三。用來(lái)指定輸出結(jié)果的類型。
總結(jié):對(duì)于一個(gè)參數(shù)的情況下衔掸,mybatis傳入?yún)?shù)類型可以是基本類型烫幕,通過(guò)#{參數(shù)名}即可獲取傳入的值,若是多參數(shù)的情況下敞映,即多條件查詢我們?nèi)绾螌?shí)現(xiàn)呢较曼?我們可以考慮將查詢對(duì)象封裝成對(duì)象進(jìn)行入?yún)ⅰP枰獜?fù)雜數(shù)據(jù)類型來(lái)支持振愿,包括Javabean實(shí)體類和Map類型捷犹,通過(guò)#{屬性名}或#{Map的key}來(lái)獲取傳入的值。

剖析一下resultMap和resultType的區(qū)別冕末、關(guān)聯(lián)萍歉、應(yīng)用場(chǎng)景

  • 區(qū)別:mybatis使用resultType做自動(dòng)映射時(shí),必須保證字段名和POJO類的屬性名一致档桃。resultType表示直接返回類型枪孩,resultMap是對(duì)外部resultMap定義的引用,表示返回結(jié)果映射到哪一個(gè)<resultMap>上藻肄。
  • 關(guān)聯(lián):進(jìn)行查詢映射時(shí)蔑舞,查詢出來(lái)的每個(gè)字段都對(duì)應(yīng)一個(gè)Map,包含著字段名和對(duì)應(yīng)的值嘹屯。resultType和resultMap本質(zhì)上是一樣的攻询,都是Map數(shù)據(jù)結(jié)構(gòu)。
  • resultMap的應(yīng)用場(chǎng)景是:用于數(shù)據(jù)庫(kù)字段名與對(duì)象屬性不一致或者需要做復(fù)雜的聯(lián)合查詢州弟,以便自由控制映射結(jié)果蜕窿,即查詢出來(lái)顯示想要顯示的幾列數(shù)據(jù)而不是全部谋逻。注:resultType和resultMap這兩個(gè)屬性絕對(duì)不能同時(shí)存在。

resultMap默認(rèn)的自動(dòng)映射級(jí)別是PARTIAL桐经,即自動(dòng)匹配所有屬性毁兆,有內(nèi)部嵌套(association、collection)的除外阴挣∑椋可通過(guò)mybatis-cfg.xml配置文件修改,如下:

<settings>
  <setting name="autoMappingBehavior" value="NONE">   //NONE表示禁止自動(dòng)匹配畔咧,//FULL表示自動(dòng)匹配所有屬性茎芭。
</settings>

注意:對(duì)應(yīng)增刪改操作,一般執(zhí)行完都是返回SQL語(yǔ)句影響的行數(shù)誓沸,所以DAO層接口的返回值設(shè)置為int類型梅桩,還有這類操作是沒(méi)有resultType屬性的,只有查詢操作才需要對(duì)返回結(jié)果的類型進(jìn)行指定拜隧。

傳遞多參數(shù)查詢的幾種方法

  • 1宿百、封裝成對(duì)象進(jìn)行參數(shù)傳遞
  • 2、直接多參數(shù)入?yún)⒑樘恚褂聾Param注解垦页,如下:
  //修改接口方法
  public int updatePwd(@Param("uid")Integer id,@Param("upwd")String pwd);
  //修改mapper.xml映射文件
  <update id="updatePwd">
    update user set pwd=#{upwd} where id=#{uid}
  </update>

實(shí)現(xiàn)resultMap高級(jí)結(jié)果映射

  • association處理一對(duì)一關(guān)聯(lián)關(guān)系

場(chǎng)景:即POJO對(duì)象中內(nèi)嵌其他Javabean對(duì)象。

對(duì)應(yīng)映射文件代碼

<resultMap id="唯一標(biāo)識(shí)干奢,供外部引用" type="映射結(jié)果類型痊焊,如:基本類型和pojo類">
  <id property="id" column="數(shù)據(jù)表字段名id" />   //非必須子標(biāo)簽,不過(guò)一般都要加入忿峻,否則mybatis雖能正常工作薄啥,但是性能開(kāi)銷嚴(yán)重
  <result property="實(shí)體對(duì)象屬性" column="數(shù)據(jù)表中的字段名" />   //表示把查詢出來(lái)的字段對(duì)應(yīng)的值賦給實(shí)體對(duì)象的屬性
  ......
  <association property="其他Javabean對(duì)象" javaType="其他Javabean類">
    <id property="id" column="數(shù)據(jù)表字段名id">
    <result property="屬性" column="字段名" />
    ......
  </association>  
</resultMap>
  • collection處理一對(duì)多關(guān)聯(lián)關(guān)系

場(chǎng)景:即POJO對(duì)象中內(nèi)嵌一個(gè)集合列表。

對(duì)應(yīng)映射文件代碼

<resultMap id="唯一標(biāo)識(shí)逛尚,供外部引用" type="映射結(jié)果類型罪佳,如:基本類型和pojo類">
  <id property="id" column="數(shù)據(jù)表字段名id" />   //非必須子標(biāo)簽,不過(guò)一般都要加入黑低,否則mybatis雖能正常工作赘艳,但是性能開(kāi)銷嚴(yán)重
  <result property="實(shí)體對(duì)象屬性" column="數(shù)據(jù)表中的字段名" />   //表示把查詢出來(lái)的字段對(duì)應(yīng)的值賦給實(shí)體對(duì)象的屬性
  ......
  <collection property="其他集合對(duì)象,如:List<User> userList" javaType="對(duì)應(yīng)的泛型類克握,如:User">
    <id property="id" column="數(shù)據(jù)表字段名id">
    <result property="屬性" column="字段名" />
    ......
  </collection>  
</resultMap>

MyBatis緩存

一級(jí)緩存存的是SQL語(yǔ)句蕾管,二級(jí)緩存存的是結(jié)果對(duì)象。默認(rèn)情況下mybatis是未開(kāi)啟緩存的

  • 一級(jí)緩存:是基于PerpetualCache的HashMap本地緩存菩暗,作用域是session掰曾,當(dāng)session被flush或者close后,cache就被清空停团。
  • 二級(jí)緩存:是global caching旷坦,可被所有SqlSession共享掏熬。
//開(kāi)啟mybatis緩存
<settings>
  <setting name="cacheEnabled" value="true" />
</settings>

也可單獨(dú)在mapper.xml文件中對(duì)指定查詢開(kāi)啟緩存

  <select id="getUserList" resultType="User" useCache="true">
    ......
  </select>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市秒梅,隨后出現(xiàn)的幾起案子旗芬,更是在濱河造成了極大的恐慌,老刑警劉巖捆蜀,帶你破解...
    沈念sama閱讀 218,036評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件疮丛,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡辆它,警方通過(guò)查閱死者的電腦和手機(jī)誊薄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)锰茉,“玉大人呢蔫,你說(shuō)我怎么就攤上這事§” “怎么了片吊?”我有些...
    開(kāi)封第一講書人閱讀 164,411評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)扬霜。 經(jīng)常有香客問(wèn)我定鸟,道長(zhǎng)而涉,這世上最難降的妖魔是什么著瓶? 我笑而不...
    開(kāi)封第一講書人閱讀 58,622評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮啼县,結(jié)果婚禮上材原,老公的妹妹穿的比我還像新娘。我一直安慰自己季眷,他們只是感情好余蟹,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,661評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著子刮,像睡著了一般威酒。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上挺峡,一...
    開(kāi)封第一講書人閱讀 51,521評(píng)論 1 304
  • 那天葵孤,我揣著相機(jī)與錄音,去河邊找鬼橱赠。 笑死尤仍,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的狭姨。 我是一名探鬼主播宰啦,決...
    沈念sama閱讀 40,288評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼苏遥,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了赡模?” 一聲冷哼從身側(cè)響起田炭,我...
    開(kāi)封第一講書人閱讀 39,200評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎纺裁,沒(méi)想到半個(gè)月后诫肠,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,644評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡欺缘,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,837評(píng)論 3 336
  • 正文 我和宋清朗相戀三年栋豫,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片谚殊。...
    茶點(diǎn)故事閱讀 39,953評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡丧鸯,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出嫩絮,到底是詐尸還是另有隱情丛肢,我是刑警寧澤,帶...
    沈念sama閱讀 35,673評(píng)論 5 346
  • 正文 年R本政府宣布剿干,位于F島的核電站蜂怎,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏置尔。R本人自食惡果不足惜杠步,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,281評(píng)論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望榜轿。 院中可真熱鬧幽歼,春花似錦、人聲如沸谬盐。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,889評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)飞傀。三九已至皇型,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間砸烦,已是汗流浹背弃鸦。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,011評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留外冀,地道東北人寡键。 一個(gè)月前我還...
    沈念sama閱讀 48,119評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親西轩。 傳聞我的和親對(duì)象是個(gè)殘疾皇子员舵,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,901評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 1. 簡(jiǎn)介 1.1 什么是 MyBatis ? MyBatis 是支持定制化 SQL藕畔、存儲(chǔ)過(guò)程以及高級(jí)映射的優(yōu)秀的...
    笨鳥(niǎo)慢飛閱讀 5,520評(píng)論 0 4
  • 1 Mybatis入門 1.1 單獨(dú)使用jdbc編程問(wèn)題總結(jié) 1.1.1 jdbc程序 上邊使...
    哇哈哈E閱讀 3,307評(píng)論 0 38
  • 使用MyBatis實(shí)現(xiàn)條件查詢 1.SQL映射文件: MyBatis真正的強(qiáng)大之處就在于SQL映射語(yǔ)句马僻,MyBat...
    Java小生閱讀 1,813評(píng)論 0 0
  • MyBatis 理論篇 [TOC] 什么是MyBatis ?MyBatis是支持普通SQL查詢,存儲(chǔ)過(guò)程和高級(jí)映射...
    有_味閱讀 2,899評(píng)論 0 26
  • 文|晶格 一切讓你身心愉悅溶弟,忘乎所以的娛樂(lè)女淑,都會(huì)上癮。 比如說(shuō):熬夜辜御。 0. 大學(xué)第一年鸭你,我堅(jiān)持晚上10點(diǎn)半睡覺(jué),...
    晶格閱讀 482評(píng)論 5 5