自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

一個寧靜祥和沒有bug的下午和SqlSession的故事

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

1 背景

這是一個安靜祥和沒有bug的下午。作為一只菜雞,時刻鞏固一下基礎還是很有必要的,如此的大好時機,就讓我來學習學習mybatis如何使用。

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

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

2 探索之旅

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

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

它繼承了BaseDao。

而BaseDao又繼承了SqlSessionDaoSupport,在BaseDao中調用了getSqlSession方法,實際上也就是SqlSessionDaoSupport的getSqlSession方法。

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

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

同時,這個方法會返回一個線程安全的SqlSession。

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

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

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

而代理工作內容就在SqlSessionInterceptor這個handler里。

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

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

3 總結

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

責任編輯:武曉燕 來源: 京東云
相關推薦

2015-01-14 13:07:03

2009-08-26 17:05:55

.NET委托

2009-09-14 17:08:02

WebFormView

2025-02-13 07:00:00

Dubbo-goJava服務端

2015-08-13 14:35:43

2017-10-10 15:14:23

BUGiOS 11蘋果

2017-12-14 14:36:54

金融工具敏捷大房間計劃

2017-07-05 15:09:52

密碼token瀏覽器

2020-07-09 18:46:52

物聯(lián)網(wǎng)IIoT技術

2020-10-10 06:21:15

爬蟲互聯(lián)網(wǎng)

2013-06-05 13:27:16

軟件糾錯

2022-05-16 08:42:26

Pandasbug

2022-06-15 08:14:40

Go線程遞歸

2023-03-13 08:09:03

Protobuffeature分割

2019-08-01 12:59:21

Bug代碼程序

2015-08-24 10:07:13

程序員bug

2018-07-03 15:20:36

Promise函數(shù)借錢

2014-10-21 11:11:08

Siri人工智能

2021-07-12 05:01:11

云原生軟件架構

2009-09-01 16:03:32

C#單元測試
點贊
收藏

51CTO技術棧公眾號