国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

MyBatis學(xué)習(xí)筆記(三)Mapper動態(tài)代理開發(fā)

2019-11-10 17:30:30
字體:
供稿:網(wǎng)友

轉(zhuǎn)載自:MyBatis之Mapper動態(tài)代理開發(fā)


1.Sqlsession的使用范圍

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

2.sqlSessionFactory 正常開發(fā)時(shí),以單例方式管理sqlSessionFactory,整個系統(tǒng)運(yùn)行過程中sqlSessionFactory只有一個實(shí)例,將來和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接口: 這里寫圖片描述 和dao接口的實(shí)現(xiàn)類: 這里寫圖片描述 然后就能在測試類中使用。測試類代碼如下: 這里寫圖片描述 我們來看看這種方式開發(fā)有什么問題?

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

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

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

這種方式下程序員只需要寫dao接口,dao接口實(shí)現(xiàn)對象由mybatis自動生成代理對象。因?yàn)楸旧韉ao在三層架構(gòu)中就是一個通用的接口。

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

要想讓mybatis自動創(chuàng)建dao接口實(shí)現(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。文件目錄如下:

這里寫圖片描述 其中有些類我們會在后面用到。

2.2.2mapper.xml(映射文件)

mapper映射文件的命名方式建議表名加Mapper.xml,namespace指定為mapper接口的全限定名。 這里寫圖片描述

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中添加如下兩個方法: 這里寫圖片描述

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

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

測試代碼如下:

這里寫圖片描述

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

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

1.返回值的問題:如果方法(即UserMapper.java接口中的方法)調(diào)用的statement中返回是多條記錄,而mapper.java方法的返回值為pojo,此時(shí)代理對象通過selectOne調(diào)用,但由于返回的是多條記錄所以會報(bà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ò)展性沒有問題,因?yàn)閐ao層就是通用的,可以通過擴(kuò)展pojo(定義pojo包裝類型,后面第四篇文章–MyBatis輸入輸出映射會講擴(kuò)展pojo的知識)來將不同的參數(shù)(可以是pojo也可以是簡單類型)傳入進(jìn)去。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 轮台县| 通辽市| 巴马| 永宁县| 梅河口市| 西乌| 玉溪市| 贞丰县| 若羌县| 鄂伦春自治旗| 汉寿县| 望奎县| 芮城县| 咸阳市| 乌兰县| 搜索| 张家口市| 凤台县| 灵川县| 昌图县| 济源市| 额敏县| 磐石市| 和田市| 绥化市| 田阳县| 西和县| 宁夏| 武陟县| 大邑县| 昭通市| 安岳县| 柳州市| 临湘市| 洛阳市| 长治县| 翼城县| 卢氏县| 金乡县| 孙吴县| 磴口县|