精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

如何扒開 SqlSession 的外衣

運維 數(shù)據(jù)庫運維
如果我們配置的是MANAGED,會把事務(wù)交給容器來管理,比如JBOSS,Weblogic。因為我們是本地跑的程序,如果配置成MANAGED就會不有任何事務(wù)。

[[360740]]

老規(guī)矩,先上案例代碼,我們按照這個案例一步一步的搞定Mybatis源碼。

  1. public class MybatisApplication { 
  2.     public static final String URL = "jdbc:mysql://localhost:3306/mblog"
  3.     public static final String USER = "root"
  4.     public static final String PASSWORD = "123456"
  5.  
  6.     public static void main(String[] args) { 
  7.         String resource = "mybatis-config.xml"
  8.         InputStream inputStream = null
  9.         SqlSession sqlSession = null
  10.         try { 
  11.             inputStream = Resources.getResourceAsStream(resource); 
  12.             SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); 
  13.             sqlSession = sqlSessionFactory.openSession(); 
  14.             UserMapper userMapper = sqlSession.getMapper(UserMapper.class); 
  15.             System.out.println(userMapper.selectById(1)); 
  16.  
  17.         } catch (Exception e) { 
  18.             e.printStackTrace(); 
  19.         } finally { 
  20.             try { 
  21.                 inputStream.close(); 
  22.             } catch (IOException e) { 
  23.                 e.printStackTrace(); 
  24.             } 
  25.             sqlSession.close(); 
  26.         } 
  27.     } 

由于很多小伙伴在催,說Mybatis源碼系列好像何時才有下文了,為此老田熬夜寫了這篇。

 

繼續(xù)開擼~~

  1. SqlSession sqlSession = sqlSessionFactory.openSession(); 

前面那篇文章已經(jīng)分析了,這里的sqlSessionFactory其實就是DefaultSqlSessionFactory。

所以這里,我們就從DefaultSqlSessionFactory里的openSession方法開始。

  1. public class DefaultSqlSessionFactory implements SqlSessionFactory { 
  2.  
  3.   private final Configuration configuration; 
  4.  
  5.   public DefaultSqlSessionFactory(Configuration configuration) { 
  6.     this.configuration = configuration; 
  7.   } 
  8.   //創(chuàng)建session,這個方法直接調(diào)用本類中的另外一個方法 
  9.   @Override 
  10.   public SqlSession openSession() { 
  11.     return openSessionFromDataSource(configuration.getDefaultExecutorType(), nullfalse); 
  12.   } 
  13.   //其實是調(diào)用這個方法 
  14.   private SqlSession openSessionFromDataSource(ExecutorType execType, TransactionIsolationLevel level, boolean autoCommit) { 
  15.     Transaction tx = null
  16.     try { 
  17.       //對應(yīng)xml標(biāo)簽<environments> ,這個在配置文件解析的時候就已經(jīng)存放到configuration中了。 
  18.       final Environment environment = configuration.getEnvironment(); 
  19.       final TransactionFactory transactionFactory = getTransactionFactoryFromEnvironment(environment); 
  20.       tx = transactionFactory.newTransaction(environment.getDataSource(), level, autoCommit); 
  21.       //創(chuàng)建一個executor來執(zhí)行SQL   
  22.       final Executor executor = configuration.newExecutor(tx, execType); 
  23.       //這里也說明了,為什么我們代碼里的SqlSession是DefaultSqlSession 
  24.       return new DefaultSqlSession(configuration, executor, autoCommit); 
  25.     } catch (Exception e) { 
  26.       closeTransaction(tx); // may have fetched a connection so lets call close() 
  27.       throw ExceptionFactory.wrapException("Error opening session.  Cause: " + e, e); 
  28.     } finally { 
  29.       ErrorContext.instance().reset(); 
  30.     } 
  31.   } 
  32.    
  33.     private TransactionFactory getTransactionFactoryFromEnvironment(Environment environment) { 
  34.     if (environment == null || environment.getTransactionFactory() == null) { 
  35.       return new ManagedTransactionFactory(); 
  36.     } 
  37.     return environment.getTransactionFactory(); 
  38.   } 

這個方法中的主要內(nèi)容有:

 

下面我們就來逐個攻破。

創(chuàng)建事務(wù)Transaction

事務(wù)工廠類型可以配置為JDBC類型或者MANAGED類型。

JdbcTransactionFactory生產(chǎn)JdbcTransaction。

ManagedTransactionFactory生產(chǎn)ManagedTransaction。

如果配置的JDBC,則會使用Connection對象的commit()、rollback()、close()方法來管理事務(wù)。

如果我們配置的是MANAGED,會把事務(wù)交給容器來管理,比如JBOSS,Weblogic。因為我們是本地跑的程序,如果配置成MANAGED就會不有任何事務(wù)。

但是,如果我們項目中是Spring集成Mybatis,則沒有必要配置事務(wù),因為我們會直接在applicationContext.xml里配置數(shù)據(jù)源和事務(wù)管理器,從而覆蓋Mybatis的配置。

創(chuàng)建執(zhí)行器Executor

調(diào)用configuration的newExecutor方法創(chuàng)建Executor。

  1. final Executor executor = configuration.newExecutor(tx, execType); 
  2. //Configuration中 
  3. public Executor newExecutor(Transaction transaction, ExecutorType executorType) { 
  4.     executorType = executorType == null ? defaultExecutorType : executorType; 
  5.     executorType = executorType == null ? ExecutorType.SIMPLE : executorType; 
  6.     Executor executor; 
  7.     //第一步 
  8.     if (ExecutorType.BATCH == executorType) { 
  9.       executor = new BatchExecutor(this, transaction); 
  10.     } else if (ExecutorType.REUSE == executorType) { 
  11.       executor = new ReuseExecutor(this, transaction); 
  12.     } else { 
  13.       executor = new SimpleExecutor(this, transaction); 
  14.     } 
  15.     //第二步 
  16.     if (cacheEnabled) { 
  17.       executor = new CachingExecutor(executor); 
  18.     } 
  19.     //第三步 
  20.     executor = (Executor) interceptorChain.pluginAll(executor); 
  21.     return executor; 
  22.   } 

此方法分三個步驟。

第一步:創(chuàng)建執(zhí)行器

Executor的基本類型有三種:

  1. public enum ExecutorType { 
  2.   SIMPLE, REUSE, BATCH 

SIMPLE為默認類型。

 

為什么要讓抽象類BaseExecutor實現(xiàn)Executor接口,然后讓具體實現(xiàn)類繼承抽象類呢?

這就是模板方法模式的實現(xiàn)。

模板方法模式就是定義一個算法骨架,并允許子類為一個或者多個步驟提供實現(xiàn)。模板方法是得子類可以再不改變算法結(jié)構(gòu)的情況下,重新定義算法的某些步驟。

抽象方法是在子類匯總實現(xiàn)的,每種執(zhí)行器自己實現(xiàn)自己的邏輯,BaseExecutor最終會調(diào)用到具體的子類中。

抽象方法

  1. protected abstract int doUpdate(MappedStatement ms, Object parameter) throws SQLException; 
  2.  
  3. protected abstract List<BatchResult> doFlushStatements(boolean isRollback) throws SQLException; 
  4.  
  5. protected abstract <E> List<E> doQuery(MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql) throws SQLException; 
  6.  
  7. protected abstract <E> Cursor<E> doQueryCursor(MappedStatement ms, Object parameter, RowBounds rowBounds, BoundSql boundSql)  throws SQLException; 

第二步:緩存裝飾

在上面代碼中的第二步

  1. if (cacheEnabled) { 
  2.       executor = new CachingExecutor(executor); 

如果cacheEnabled=true,會用裝飾器設(shè)計模式對Executor進行裝飾。

第三步:插件代理緩存裝飾完后,就會執(zhí)行

  1. executor = (Executor) interceptorChain.pluginAll(executor); 

這里會對Executor植入插件邏輯。

比如:分頁插件中就需要把插件植入的Executor

 

好了,到此,執(zhí)行器創(chuàng)建的就搞定了。

創(chuàng)建DefaultSqlSession對象

把前面解析配置文件創(chuàng)建的Configuration對象和創(chuàng)建的執(zhí)行器Executor賦給DefaultSqlSession中的屬性。

  1. public DefaultSqlSession(Configuration configuration, Executor executor, boolean autoCommit) { 
  2.   this.configuration = configuration; 
  3.   this.executor = executor; 
  4.   this.dirty = false
  5.   this.autoCommit = autoCommit; 

到這里,SqlSession(DefaultSqlSession)對象就創(chuàng)建完畢。

總結(jié)

本文我們講了如何創(chuàng)建SqlSession的幾個步驟,最后我們獲得一個DefaultSqlSession對象,里面包含了執(zhí)行器Executor和配置對象Configuration。Executor是SQL的實際執(zhí)行對象。Configuration里保存著配置文件內(nèi)容。

本文源碼分析的整個流程如下圖:

本文轉(zhuǎn)載自微信公眾號「Java后端技術(shù)全棧」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請聯(lián)系Java后端技術(shù)全棧公眾號。

 

責(zé)任編輯:武曉燕 來源: Java后端技術(shù)全棧
相關(guān)推薦

2025-04-28 01:22:45

2018-12-29 16:40:29

c語言編程語言指針

2021-05-25 07:59:59

Linux運維Linux系統(tǒng)

2012-08-30 09:17:28

Win 7Win 8操作系統(tǒng)

2021-08-10 12:05:19

Linuxworkqueue內(nèi)核

2021-03-28 20:44:34

Kafka中間件MQ

2015-11-02 16:42:26

2020-12-01 10:27:39

區(qū)塊鏈比特幣

2013-10-10 09:24:34

2010-06-29 16:36:27

間諜木馬惡意程序卡巴斯基

2020-12-09 09:22:53

GETPOSTWeb

2023-08-14 07:19:23

2025-09-16 00:31:23

2009-05-27 08:44:24

2017-09-07 07:20:10

2014-11-13 17:48:21

2012-09-06 09:57:34

Saas云安全云計算

2020-02-06 10:20:19

硬件黑客技術(shù)

2022-11-26 10:14:48

Zookeepermybatisspring

2018-02-26 12:55:00

點贊
收藏

51CTO技術(shù)棧公眾號

狠狠色丁香久久婷婷综合丁香| 91九色国产在线| 精品久久一区二区三区蜜桃| 国产精品国产三级国产专业不 | 神马午夜伦理影院| 亚洲黄色三级视频| 欧美国产中文高清| 国产日产欧产精品推荐色| 色综合久久久久久中文网| 成人性做爰aaa片免费看不忠| 日本中文字幕第一页| 欧美片网站免费| 午夜精品免费在线| 成人欧美视频在线| 中国一级片在线观看| 免费污视频在线一区| 91女人视频在线观看| 久久久久久久网站| 国产伦理在线观看| 久草资源在线观看| 午夜先锋成人动漫在线| 亚洲一区在线观看免费观看电影高清 | 99久久免费国产精精品| 国产一区毛片| 一本大道av一区二区在线播放| 日本乱人伦a精品| 呦呦视频在线观看| 999福利在线视频| 成人激情校园春色| 欧美激情videos| 欧美老女人bb| 丁香婷婷久久| 中文字幕欧美日本乱码一线二线| 久久久精品视频成人| 91网址在线播放| 成全电影播放在线观看国语| 男女性色大片免费观看一区二区| 日韩一区二区在线观看视频 | 亚洲系列第一页| 精品久久精品| 欧美日韩精品久久久| 亚洲综合av一区| 国产又粗又猛又黄| 日韩黄色网络| 日韩亚洲欧美高清| 免费看涩涩视频| 成年人黄视频在线观看| 国产成人在线视频网站| 国外成人在线播放| 美女被到爽高潮视频| 成人在线不卡| 色综合网站在线| 国产97在线 | 亚洲| 国产中文字幕在线| 国产综合一区二区| 欧美肥婆姓交大片| 国产67194| 日韩影视在线观看| 亚洲福利精品在线| 天堂在线资源视频| 91在线成人| 欧美三级中文字| 国产精品无码免费专区午夜| 水中色av综合| 国产精品一区二区黑丝| 欧美在线视频免费| 丝袜美腿小色网| 66视频精品| 亚洲欧美日本另类| 香蕉视频xxx| 亚洲黄色免费av| 亚洲手机成人高清视频| 久久免费视频1| hs视频在线观看| 日本午夜一本久久久综合| 欧美国产日韩中文字幕在线| 欧美高清视频一区二区三区| 精品国产乱码久久久| 亚洲视频一区二区三区| 白嫩情侣偷拍呻吟刺激| 婷婷久久综合九色综合99蜜桃| 国产精品免费看片| 成人三级视频在线观看一区二区| 日本中文字幕在线观看视频| 中文字幕免费精品| 尤物九九久久国产精品的分类| 超碰在线播放91| av蜜臀在线| 欧美性猛交xxxx乱大交| 欧美国产综合在线| 涩涩涩在线视频| 日韩毛片一二三区| 五月婷婷综合色| 日韩毛片在线一区二区毛片| 国产99久久久精品| 91情侣偷在线精品国产| 欧美亚洲精品在线观看| 国产一区高清在线| 国产尤物99| av手机免费看| 91污在线观看| 中文字幕黄色大片| 一级日本在线| 国产三级三级三级精品8ⅰ区| 国产亚洲二区| av中文字幕在线| 亚洲成va人在线观看| 国产乱人伦精品一区二区三区| 天天摸天天干天天操| 国产福利视频一区二区三区| 精品无人区一区二区三区| 91在线播放网站| 国产精品第四页| 日韩欧美电影一区二区| 免费在线观看污视频| www.久久精品| 麻豆一区区三区四区产品精品蜜桃| 中文字幕 日韩有码| 久久亚洲国产精品一区二区| 91超碰中文字幕久久精品| 日韩精品视频免费看| 亚洲精品美女91| 97人洗澡人人免费公开视频碰碰碰| 91l九色lporny| 欧美日韩调教| 久久久亚洲国产天美传媒修理工| 欧美精品99久久久| 极品少妇一区二区三区| 久久久女人电视剧免费播放下载| 国产亚洲精品久久久久久打不开| 国产在线日韩精品| 色综合视频一区中文字幕| 中文字幕二区三区| 久久久久成人黄色影片| 色姑娘综合av| 性国裸体高清亚洲| 日韩成人黄色av| 亚洲成人黄色av| 国产精品美女久久久| 国产成人91久久精品| 中文字幕第一页在线播放| 久久先锋影音av| 一区精品在线| 国产电影一区二区三区爱妃记| 欧美群妇大交群中文字幕| 公侵犯人妻一区二区三区| 成人激情开心网| 久久亚洲春色中文字幕| 亚洲男人第一av| 欧美a级一区二区| 欧洲国产精品| 污污网站在线观看| 色菇凉天天综合网| 天堂av2020| 免费福利视频一区| 色妞久久福利网| 国产无套粉嫩白浆内谢| 日韩电影在线观看一区| 99三级在线| 你懂的在线视频| 色综合久久88色综合天天6| 日本黄色片在线播放| 99热在线成人| 欧美做爰性生交视频| 欧洲毛片在线| 欧美亚州韩日在线看免费版国语版| 日本黄色三级大片| 精品国产亚洲一区二区三区大结局| 日韩视频在线一区二区| 欧美精品色哟哟| 成人午夜电影小说| 亚洲人成网站在线观看播放| 国产精品久久久久久妇女| 欧美一区二区三级| www.黄色在线| 捆绑调教美女网站视频一区| 精品视频在线观看| 亚洲成人短视频| 亚洲激情视频在线观看| 亚洲最大的黄色网址| 国v精品久久久网| 亚洲中文字幕无码专区| 欧美日韩精品在线一区| 成人久久18免费网站图片| 青青草在线视频免费观看| 欧美亚洲日本一区| 日韩女优一区二区| 99精品久久久久久| www成人免费| 日韩电影在线观看完整免费观看| 欧美美女操人视频| 图片区 小说区 区 亚洲五月| av在线不卡电影| 激情六月丁香婷婷| 97视频热人人精品免费| 国产精品99久久久久久久久久久久 | 黄视频在线观看免费| 欧美顶级少妇做爰| 欧美三级视频网站| 国模一区二区三区白浆 | 最新精品国产| 国产精品美女久久久免费| 青青青草原在线| 欧美夫妻性生活| 天天操天天操天天操天天| 不卡电影一区二区三区| 宅男噜噜噜66国产免费观看| 午夜欧美视频| 日韩精品国内| 亚洲精品18| 欧美极品在线播放| yes4444视频在线观看| 亚洲精品www久久久| 一二三四区视频| 日韩欧美在线观看| 久久这里只有精品国产| 国产精品久久久久久久久动漫| 国产高清视频网站| 亚洲国产一区二区三区a毛片| 国产欧美日韩综合一区在线观看 | 最新亚洲精品| 992tv在线成人免费观看| 毛片在线不卡| 7777精品伊人久久久大香线蕉最新版 | 日韩欧美一区二区久久婷婷| 久久免费看少妇高潮v片特黄| 久久91精品国产91久久小草| 一本久久a久久精品vr综合| 欧美黄色录像| 国产经品一区二区| 欧美h版在线观看| 91亚洲精品视频| 美女久久久久久| 国产精品电影观看| 欧美另类极品| 中文字幕v亚洲ⅴv天堂| 国产不卡av在线播放| 欧美日韩国产电影| 中文字幕 亚洲视频| 色94色欧美sute亚洲线路一久| 国产精品成人在线视频| 国产综合久久久久久鬼色| 激情网站五月天| 国产精品99视频| 亚洲精品一区二区三区四区五区| 在线高清av| 97精品视频在线观看| 成人日韩欧美| 久久av在线看| 日韩三级免费| 欧美精品激情在线观看| 欧美日韩经典丝袜| 亚洲伦理中文字幕| 污视频在线免费观看| 亚洲精品动漫100p| 深夜视频在线免费| 亚洲欧美激情另类校园| 免费在线一级视频| 在线国产精品播放| 麻豆网站在线免费观看| 另类图片亚洲另类| 欧美1234区| 91av视频在线免费观看| 亚洲欧美一区二区三区| 国产不卡精品视男人的天堂| 黄色精品视频| 亚洲中国色老太| 午夜无码国产理论在线| 国产精品嫩草视频| 国产一区二区三区| 国产精品91久久久| 成人亚洲综合| 亚洲www视频| 女一区二区三区| 日本在线观看一区| **女人18毛片一区二区| 国产aaa免费视频| 98精品久久久久久久| 水蜜桃在线免费观看| 亚洲天堂偷拍| 性生活免费观看视频| 国产成人精品免费视| 亚洲高清精品中出| 欧美日韩一区二区国产| 久章草在线视频| 久久99精品视频| 国产chinese中国hdxxxx| 国产亚洲女人久久久久毛片| 日本中文在线视频| 精品人伦一区二区三区蜜桃网站 | 成人免费视频在线观看| 九九热视频精品| 一道本成人在线| jlzzjlzz亚洲女人18| 亚洲老司机av| 超碰在线caoporen| 欧美野外猛男的大粗鳮| 韩国日本一区| 九九热这里只有在线精品视| 白浆在线视频| 国模叶桐国产精品一区| 成人片免费看| 日韩av片免费在线观看| 二区三区精品| 欧美日韩综合久久| 国内成人精品| av在线com| 蜜臀精品久久久久久蜜臀| 小毛片在线观看| 亚洲欧美激情小说另类| 天天看片中文字幕| 在线一区二区视频| 中文字幕在线视频免费| 亚洲大胆人体视频| 亚洲s色大片| 国产z一区二区三区| 激情亚洲另类图片区小说区| 国产精品免费一区二区三区在线观看 | 露出调教综合另类| 992tv快乐视频| 久久激五月天综合精品| 久久精品—区二区三区舞蹈| 亚洲国产精品天堂| 国产毛片一区二区三区va在线| 3d动漫精品啪啪一区二区竹菊| 国产麻豆精品一区| 亚洲免费高清视频| av中文字幕在线观看第一页| 3d动漫啪啪精品一区二区免费 | 亚洲成人激情综合网| 亚洲天堂2021av| 伊人久久男人天堂| 国产精品扒开腿做爽爽爽视频软件| 国产精品91在线观看| 蜜桃久久久久| 日韩在线观看a| 国产精品一级黄| www欧美com| 日韩一区二区免费在线观看| 精品国产丝袜高跟鞋| 国产精品视频公开费视频| 欧美亚洲国产激情| 亚洲高清在线免费观看| 国产视频在线观看一区二区三区| 看免费黄色录像| 欧美理论片在线| 久久久久久国产精品免费无遮挡| 久久久久久久爱| 成人知道污网站| 欧美日韩免费观看一区| 日韩一级不卡| 国产精品视频中文字幕| 日本一区二区三区四区| 久久网中文字幕| 日韩欧美在线影院| 人交獸av完整版在线观看| 国产精品二区二区三区| 99xxxx成人网| 成年人网站免费在线观看| 亚洲手机成人高清视频| 99在线观看免费| 国产+人+亚洲| 亚洲+变态+欧美+另类+精品| 伊人色综合影院| 九九**精品视频免费播放| 欧美黑吊大战白妞| 亚洲第一网站免费视频| 在线成人av观看| 色涩成人影视在线播放| 精品亚洲国产成人av制服丝袜| 国产伦精品一区二区三区妓女| 亚洲欧洲综合另类在线| 国内精品久久久久久久久久| 欧美伦理91i| 日韩高清电影免费| 欧美午夜aaaaaa免费视频| 亚洲少妇最新在线视频| 好吊色在线观看| 色噜噜狠狠狠综合曰曰曰| 久久视频免费| 妞干网在线视频观看| 国产高清久久久久| 天天爽夜夜爽夜夜爽精品| 一区二区三区 在线观看视| 国产精品一区二区三区四区在线观看 | 免费91在线视频| 日韩精品99| 国产综合欧美在线看| 久久久蜜桃一区二区人| 日本五十肥熟交尾| 在线观看网站黄不卡| av网站在线免费看推荐| 成人av在线天堂| 黄色国产精品| 精品人体无码一区二区三区| 色屁屁一区二区| 国产精品刘玥久久一区| 久久精品欧美| 国产麻豆精品theporn| 天堂а√在线中文在线新版|