日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
一個(gè)寧?kù)o祥和沒有bug的下午和SqlSession的故事

1 背景

這是一個(gè)安靜祥和沒有bug的下午。作為一只菜雞,時(shí)刻鞏固一下基礎(chǔ)還是很有必要的,如此的大好時(shí)機(jī),就讓我來學(xué)習(xí)學(xué)習(xí)mybatis如何使用。

虎丘網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)!從網(wǎng)頁設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、成都響應(yīng)式網(wǎng)站建設(shè)公司等網(wǎng)站項(xiàng)目制作,到程序開發(fā),運(yùn)營(yíng)維護(hù)。創(chuàng)新互聯(lián)公司2013年成立到現(xiàn)在10年的時(shí)間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選創(chuàng)新互聯(lián)。

這可和我看到的不一樣啊,讓我來看看項(xiàng)目里怎么寫的。

我們項(xiàng)目中的Dao都繼承于BaseDao,而BaseDao繼承于SqlSessionDaoSupport,每次執(zhí)行sql的時(shí)候都是直接將這個(gè)sqlSession返回,然后執(zhí)行sql,這難道不是一個(gè)實(shí)例變量嘛?這和你說的可不一樣誒。于是帶著這樣的疑問,我開始了探索。

2 探索之旅

1)我們都知道,在使用mybatis時(shí),sqlSession都來自于sqlSessionFactory,而sqlSessionFactory可以通過sqlSessionFactoryBuilder創(chuàng)建,也可以通過spring初始化,而項(xiàng)目中很顯然采取了后一種方式。

2)那么我們已經(jīng)得到了sqlSessionFactory,應(yīng)該如何去進(jìn)一步探索sqlSession的來源呢,我想到可以通過項(xiàng)目中已經(jīng)實(shí)現(xiàn)的dao進(jìn)行探索。我們隨便選取一個(gè)dao為例。

它繼承了BaseDao。

而BaseDao又繼承了SqlSessionDaoSupport,在BaseDao中調(diào)用了getSqlSession方法,實(shí)際上也就是SqlSessionDaoSupport的getSqlSession方法。

而SqlSessionDaoSupport的getSqlSession方法是直接將自己的成員變量返回去的,截至目前為止,和我的懷疑點(diǎn)是相符合的,即目前的寫法和mybatis官網(wǎng)的說明是沖突的。

3)反復(fù)閱讀SqlSessionDaoSupport這個(gè)類后,終于被我發(fā)現(xiàn)了線索,細(xì)心的小伙伴應(yīng)該也早已發(fā)現(xiàn)了,就在上圖之中的注釋中,“用戶應(yīng)該使用這個(gè)方法來獲得一個(gè)SqlSession來執(zhí)行sql語句,這個(gè)SqlSession被spring管理,用戶不應(yīng)該提交、回滾或關(guān)閉它。因?yàn)檫@些已經(jīng)被自動(dòng)執(zhí)行了?!?/p>

同時(shí),這個(gè)方法會(huì)返回一個(gè)線程安全的SqlSession。

那么這個(gè)SqlSession是從何而來的呢,從上圖可以看出,它有兩種賦值方式,一種是給他傳一個(gè)SqlSessionFactory,生成SqlSessionTemplate,SqlSessionTemplate即為sqlSession。另一種是直接給他傳一個(gè)SqlSessionTemplate作為SqlSession。根據(jù)本類的注釋,如果SqlSessionFactory和SqlSessionTemplate都被定義了,那么SqlSessionFactory的方式會(huì)失效。至此,我的上述疑問已經(jīng)解決了,也就是說這個(gè)SqlSession并不是一個(gè)mybatis初始的SqlSession,而是spring實(shí)現(xiàn)的SqlSessionTemplate。

4)但是,我又誕生了新的疑問,SqlSessionTemplate是怎么完成線程安全的呢?

于是我進(jìn)入了SqlSessionTemplate的方法執(zhí)行,發(fā)現(xiàn)實(shí)際執(zhí)行語句的都是這個(gè)代理類sqlSessionProxy。

而代理工作內(nèi)容就在SqlSessionInterceptor這個(gè)handler里。

進(jìn)入其中,我們終于發(fā)現(xiàn)了它的獲取和關(guān)閉操作。

也就是說,每次執(zhí)行,代理都會(huì)調(diào)用sessionFactory的openSession方法獲得一個(gè)新的session。

3 總結(jié)

終于的終于,mybatis,spring,項(xiàng)目以及我的疑問得到了統(tǒng)一,真是一個(gè)寧?kù)o祥和而又沒有bug的下午呀。?


網(wǎng)站名稱:一個(gè)寧?kù)o祥和沒有bug的下午和SqlSession的故事
標(biāo)題來源:http://m.5511xx.com/article/cdiogco.html