MyBatis之Mapper動態(tài)代理開發(fā)

title: MyBatis之Mapper動態(tài)代理開發(fā)
tags: MyBatis
categories: MyBatis


若圖片無法顯示簸呈,請前往我的博客查看,相應(yīng)文章鏈接:http://codingxiaxw.cn/2016/11/07/33-MyBatis%E4%BD%BF%E7%94%A8mapper%E5%8A%A8%E6%80%81%E4%BB%A3%E7%90%86%E5%BC%80%E5%8F%91/

1.SqlSession的使用范圍

1.SqlSessionFactoryBuilder
SqlSessionFactoryBuilder是以工具類的方式來使用:需要創(chuàng)建sqlSessionFactory時就new一個 SqlSessionFactoryBuilder

2.sqlSessionFactory
正常開發(fā)時伤极,以單例方式管理sqlSessionFactory蛹找,整個系統(tǒng)運(yùn)行過程中sqlSessionFactory只有一個實例,將來和Spring整合后由Spring以單例方式管理sqlSessionFactory

3.SqlSession
SqlSession是一個面向用戶(程序員)的接口哨坪,程序員調(diào)用 SqlSession接口的方法進(jìn)行操作數(shù)據(jù)庫庸疾。那么我們會思考:SqlSession能否以單例方式使用?当编?届慈?由于 SqlSession是線程不安全的,所以 SqlSession最佳應(yīng)用范圍在方法體內(nèi)。也就是說在方法體內(nèi)定義局部變量 SqlSession的對象來使用金顿。

2.MyBatis開發(fā)DAO的方式

我們先來看看MyBatis原始開發(fā)dao的開發(fā)方式词渤,發(fā)現(xiàn)原始開發(fā)的問題,然后再來看看MyBatis使用mapper動態(tài)代理開發(fā)dao的方式(也是MyBatis目前使用的開發(fā)dao的方式)串绩。

2.1原始dao的開發(fā)方式

程序員需要編寫dao接口:[圖片上傳失敗...(image-186922-1526286026566)]和dao接口的實現(xiàn)類:[圖片上傳失敗...(image-e73fbe-1526286026566)]

然后就能在測試類中使用缺虐。測試類代碼如下:

[圖片上傳失敗...(image-4eef03-1526286026566)]

我們來看看這種方式開發(fā)有什么問題?

  • 1.dao的實現(xiàn)類中存在重復(fù)代碼,整個mybatis操作的過程代碼模板重復(fù)(都是先創(chuàng)建sqlSession礁凡、調(diào)用sqlSession的方法高氮、關(guān)閉sqlSession)。
  • 2.dao的實現(xiàn)類中存在硬編碼顷牌,調(diào)用sqlSession方法時將statement的id硬編碼剪芍。

下面我們看看mapper動態(tài)代理的方式。

2.2mapper動態(tài)代理的方式

這種方式下程序員只需要寫dao接口窟蓝,dao接口實現(xiàn)對象由mybatis自動生成代理對象罪裹。因為本身dao在三層架構(gòu)中就是一個通用的接口。

2.2.1mapper開發(fā)規(guī)范

要想讓mybatis自動創(chuàng)建dao接口實現(xiàn)類的代理對象运挫,必須要遵循一些規(guī)則:

  • 1.mapper.xml中 namespace指定為mapper接口的全限定名状共。此步驟的目的:將mapper.xml和mapper.java關(guān)聯(lián)。
  • 2.mapper.xml中statement的id就是mapper.java中的方法名谁帕。
  • 3.mapper.xml中statement的parameterType和mapper.java中方法輸入?yún)?shù)一致峡继。
  • 4.mapper.xml中statement的resultType和mapper.java中方法的返回值類型一致。

采用這種方式后匈挖,我們便可將第一篇文章中提到的User.xml改為UserMapper.xml碾牌。文件目錄如下:
image

其中有些類我們會在后面用到。

2.2.2mapper.xml(映射文件)

mapper映射文件的命名方式建議表名加Mapper.xml,namespace指定為mapper接口的全限定名儡循。

image

2.2.3mapper.java接口

mybatis提出了mapper接口,相當(dāng)于dao接口,mapper接口的命名方式建議為表名加Mapper.

    public interface UserMapper{};

2.3.4將mapper.xml在SqlMapConfing.xml中進(jìn)行注冊

       <mappers>
        <mapper resource="mapper/UserMapper.xml"/>
       </mappers>

2.3.5mapper接口返回單個對象和集合對象

在UserMapper.java中添加如下兩個方法:

image

對于UserMapper.xml舶吗,不管查詢記錄是單條還是多條,在statement(即UserMapper.xml)中的resultType都定義一致择膝,都是單條記錄映射的pojo類型誓琼。

而對于UserMapper.java接口方法中的返回值,如果返回的是單個對象调榄,返回值類型是pojo踊赠,生成的代理對象內(nèi)部會自動通過selectOne獲取記錄,如果返回值類型是多條對象每庆,生成的代理對象內(nèi)部會自動通過selectList獲取記錄。

測試代碼如下:
image

使用Mapper代理方式進(jìn)行開發(fā)今穿,使程序員只需要關(guān)注UserMapper.java接口中的方法缤灵,它的實現(xiàn)類由Mapper自動為我們生成,帶來了很大的方便。但這種方式也有它的弊端腮出。

2.3.6mapper代理開發(fā)的問題

  • 1.返回值的問題:如果方法(即UserMapper.java接口中的方法)調(diào)用的statement中返回是多條記錄帖鸦,而mapper.java方法的返回值為pojo,此時代理對象通過selectOne調(diào)用胚嘲,但由于返回的是多條記錄所以會報錯:Expected one result (for null ) to be returned by selectOne() but found 4;
  • 2.輸入?yún)?shù)的問題:使用mapper代理的方式開發(fā)作儿,mapper接口方法的輸入?yún)?shù)只有一個,可擴(kuò)展性是否很差?答:可擴(kuò)展性沒有問題馋劈,因為dao層就是通用的攻锰,可以通過擴(kuò)展pojo(定義pojo包裝類型,后面第四篇文章--MyBatis輸入輸出映射會講擴(kuò)展pojo的知識)來將不同的參數(shù)(可以是pojo也可以是簡單類型)傳入進(jìn)去妓雾。

2018.3.19更

歡迎加入我的Java交流1群:659957958娶吞。群里目前已有1800人,每天都非承狄觯活躍妒蛇,但為了篩選掉那些不懷好意的朋友進(jìn)來搞破壞,所以目前入群方式已改成了付費(fèi)方式楷拳,你只需要支付9塊錢绣夺,即可獲取到群文件中的所有干貨以及群里面各位前輩們的疑惑解答;為了鼓勵良好風(fēng)氣的發(fā)展欢揖,讓每個新人提出的問題都得到解決乐导,所以我將得到的入群收費(fèi)收入都以紅包的形式發(fā)放到那些主動給新手們解決疑惑的朋友手中。在這里浸颓,我們除了談技術(shù)物臂,還談生活、談理想产上;在這里棵磷,我們?yōu)槟愕膶W(xué)習(xí)方向指明方向,為你以后的求職道路提供指路明燈晋涣;在這里仪媒,我們把所有好用的干貨都與你分享。還在等什么谢鹊,快加入我們吧算吩!

2018.4.21更:如果群1已滿或者無法加入,請加Java學(xué)習(xí)交流2群:305335626 佃扼。群2作為群1的附屬群偎巢,除了日常的技術(shù)交流、資料分享兼耀、學(xué)習(xí)方向指明外压昼,還會在每年互聯(lián)網(wǎng)的秋春招時節(jié)在群內(nèi)發(fā)布大量的互聯(lián)網(wǎng)內(nèi)推方式求冷,話不多說,快上車吧窍霞!

3.聯(lián)系

If you have some questions after you see this article,you can tell your doubts in the comments area or you can find some info by clicking these links.

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末匠题,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子但金,更是在濱河造成了極大的恐慌韭山,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件冷溃,死亡現(xiàn)場離奇詭異钱磅,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)秃诵,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進(jìn)店門续搀,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人菠净,你說我怎么就攤上這事禁舷。” “怎么了毅往?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵牵咙,是天一觀的道長。 經(jīng)常有香客問我攀唯,道長洁桌,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任侯嘀,我火速辦了婚禮另凌,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘戒幔。我一直安慰自己吠谢,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布诗茎。 她就那樣靜靜地躺著工坊,像睡著了一般。 火紅的嫁衣襯著肌膚如雪敢订。 梳的紋絲不亂的頭發(fā)上王污,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天,我揣著相機(jī)與錄音楚午,去河邊找鬼昭齐。 笑死,一個胖子當(dāng)著我的面吹牛醒叁,可吹牛的內(nèi)容都是我干的司浪。 我是一名探鬼主播泊业,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼把沼,長吁一口氣:“原來是場噩夢啊……” “哼啊易!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起饮睬,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤租谈,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后捆愁,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體割去,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年昼丑,在試婚紗的時候發(fā)現(xiàn)自己被綠了呻逆。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡菩帝,死狀恐怖咖城,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情呼奢,我是刑警寧澤宜雀,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站握础,受9級特大地震影響辐董,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜禀综,卻給世界環(huán)境...
    茶點故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一简烘、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧定枷,春花似錦孤澎、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至贱迟,卻和暖如春姐扮,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背衣吠。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工茶敏, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人缚俏。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓惊搏,卻偏偏與公主長得像贮乳,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子恬惯,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,037評論 2 355

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