精品欧美一区二区三区在线观看 _久久久久国色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ù)棧公眾號

亚洲黄色影片| 9999久久久久| 樱花影视一区二区| 国产精品一码二码三码在线| 久久久久久久久黄色| 欧美国产一区二区三区激情无套| 亚洲第一精品夜夜躁人人躁| 簧片在线免费看| 爱福利在线视频| 国产精品片aa在线观看| 禁断一区二区三区在线| 欧美性极品xxxx娇小| 亚洲一区二区三区色| 日本成人动漫在线观看| 麻豆专区一区二区三区四区五区| 高清视频欧美一级| 最新av电影网站| 国产99久久久国产精品成人免费 | 自拍偷拍第八页| 欧美精品一线| 久久精彩免费视频| 亚洲精品一区二区三区影院忠贞| 成人h动漫精品一区二区器材| 欧美手机在线视频| 国产中文字幕视频在线观看| aaa大片在线观看| 中文一区二区在线观看| 精品久久久久久一区二区里番| 夜夜嗨av禁果av粉嫩avhd| 亚洲免费在线| 久久久之久亚州精品露出| 欧美色视频一区二区三区在线观看| 天海翼亚洲一区二区三区| 精品日韩在线观看| 国模大尺度视频| japansex久久高清精品| 欧美日韩一区二区三区高清 | 亚洲精品久久久久久久久久久| 日日干日日操日日射| 久久久一本精品| 狠狠躁天天躁日日躁欧美| www.av片| а√天堂资源官网在线资源| 亚洲日韩欧美一区二区在线| 亚洲一卡二卡三卡四卡无卡网站在线看| 精品电影在线| 久久看人人爽人人| 欧美成人在线免费观看| 在线观看xxx| 99久久久久久| 91在线小视频| 国产精华一区二区三区| 国内爆初菊对白视频| 国产精品99久久久久久久女警| 成人av色在线观看| 国产又粗又猛又黄又爽无遮挡| 免费一级欧美片在线观看| 国产精品99久久久久久久久久久久| 欧美国产成人精品一区二区三区| 国产欧美欧美| 日本a级片电影一区二区| 国产美女激情视频| 久久精品动漫| 国产欧美日韩免费看aⅴ视频| 亚洲天堂中文字幕在线| 精品一区二区日韩| 3d动漫啪啪精品一区二区免费 | 亚洲成人蜜桃| 免费a级在线播放| 亚洲精品伦理在线| 欧美国产日韩激情| 午夜激情电影在线播放| 欧美在线综合视频| 女人高潮一级片| 视频精品国内| 亚洲欧美另类人妖| 国产一区在线观看免费| 欧美精选在线| 欧美在线免费视频| 中文在线免费观看| 国产福利91精品一区二区三区| 国产精品推荐精品| 精品视频二区| 亚洲激情综合网| 精品国产免费av| 成人1区2区| 精品日本一线二线三线不卡| 一本加勒比北条麻妃| 午夜av一区| 97色在线播放视频| 成人一级免费视频| 国产福利电影一区二区三区| 欧美一区二区三区在线播放 | 波多野结衣办公室33分钟| 久操成人av| 萌白酱国产一区二区| 可以在线观看av的网站| 久久99国内精品| 精品乱码一区二区三区| 美女羞羞视频在线观看| 亚洲1区2区3区视频| 天天爽夜夜爽一区二区三区| a看欧美黄色女同性恋| 亚洲桃花岛网站| 毛片a片免费观看| 免费在线观看一区二区三区| 国产另类自拍| 久草中文在线观看| 一本大道久久精品懂色aⅴ| av地址在线观看| 成人羞羞网站入口免费| 97福利一区二区| 国产毛片久久久久| 欧美国产精品一区二区| av动漫在线看| 日韩一区二区三区精品视频第3页| 亚洲欧美另类国产| 日本在线视频免费| 国产最新精品免费| 色综合666| 九色porny自拍视频在线播放| 日韩一级精品视频在线观看| 香蕉久久久久久久| 日韩中文欧美在线| 久久综合福利| 女人高潮被爽到呻吟在线观看| 欧美一区二区三区日韩视频| 亚洲欧美另类日本| 日韩不卡免费视频| 欧美三级网色| 天堂av中文在线观看| 精品剧情在线观看| 欧美日韩在线视频免费播放| 国内一区二区在线| 中文字幕成人一区| 国产成+人+综合+亚洲欧美| 亚洲区中文字幕| 亚洲黄色小说图片| 99九九99九九九视频精品| 美女黄色免费看| 超碰地址久久| 久久久久一本一区二区青青蜜月| 精品久久无码中文字幕| 亚洲欧美激情视频在线观看一区二区三区 | 日韩av中文| 欧美日韩在线精品一区二区三区激情| 九色porny自拍视频| 久久伊人亚洲| 亚洲 日韩 国产第一区| 91伊人久久| www国产91| 国产乱叫456在线| 亚洲免费av高清| 精品久久久久久无码人妻| 国内精品久久久久久久97牛牛| 成人区精品一区二区| jizz一区二区三区| 亚洲精品福利在线观看| 久久久久99精品成人片三人毛片| 2020国产精品自拍| 韩国日本在线视频| 欧美在线色图| 91日本视频在线| 黄页在线观看免费| 日韩激情在线视频| 中文字幕一区在线播放| 国产精品全国免费观看高清| xxx中文字幕| 99精品福利视频| 日本一区免费看| 日韩黄色碟片| 欧美激情xxxx| 嫩草研究院在线| 8x福利精品第一导航| 国产亚洲精品成人| 久久精品日产第一区二区三区高清版| 污版视频在线观看| 欧美日韩中文| 欧美一区二区综合| 日韩三级精品| 日本精品一区二区三区在线播放视频 | 精品国产一区二区三区四| 国产精品素人一区二区| 涩视频在线观看| 日本不卡一区二区三区高清视频| 无码毛片aaa在线| 国产aⅴ精品一区二区三区久久| 91精品视频大全| 色在线免费观看| 久久精品成人欧美大片古装| 日本美女一级视频| 欧美日韩精品福利| 国产成人在线播放视频| 国产精品美女久久久久aⅴ国产馆| 中文写幕一区二区三区免费观成熟| 小嫩嫩精品导航| 成人在线观看毛片| 国产一区日韩| 国产精品三区在线| 色综合久久久| 欧美综合在线第二页| h片在线免费| 一个色综合导航| 欧美 日韩 国产 在线| 欧美日精品一区视频| 欧美另类一区二区| 曰韩精品一区二区| 激情五月深爱五月| 91蝌蚪porny九色| 中文在线字幕观看| 精品亚洲国内自在自线福利| 欧美成人xxxxx| 欧美视频四区| 在线免费观看成人| 操欧美老女人| 蜜桃麻豆91| 精品网站aaa| av免费精品一区二区三区| 欧美视频免费看| 国产成人鲁鲁免费视频a| 国产精选在线| 欧美精品福利在线| 超碰人人在线| 精品国偷自产在线| jizz在线观看| 国产一区二区三区久久精品 | 日本福利视频一区| 久久久久久影院| 亚洲欧洲另类精品久久综合| 亚洲电影一级片| 精品一区2区三区| 丁香婷婷成人| 国产66精品久久久久999小说| 国产在线不卡一区二区三区| 国产在线精品一区免费香蕉| 78精品国产综合久久香蕉| 欧美一级高清免费播放| 日韩欧美精品一区二区三区| 97在线视频免费看| 国产乱码午夜在线视频| 久久久亚洲成人| 成av人片在线观看www| 久久久女人电视剧免费播放下载| 欧美性video| 久久久久久91| 激情黄产视频在线免费观看| 97人人模人人爽人人喊中文字 | 国产一卡二卡三卡四卡| 成人网页在线观看| 国产精品扒开腿做爽爽爽a片唱戏 亚洲av成人精品一区二区三区 | 欧美日韩在线精品一区二区三区激情综| 欧美精品一区二区在线观看| 黑人乱码一区二区三区av| 亚洲成人久久久久| 天堂中文在线看| 亚洲欧美制服中文字幕| www亚洲人| 久久夜色精品国产| 日本aa在线| 26uuu久久噜噜噜噜| 日韩电影免费观看高清完整版| 国产精品久久久久免费a∨| 欧美高清免费| 成人免费视频网站入口| 偷拍视屏一区| 亚洲一区三区| 欧美精品啪啪| 无码人妻丰满熟妇区五十路百度| 麻豆视频观看网址久久| 超碰在线超碰在线| 成人黄页毛片网站| xxxx日本黄色| 亚洲精品日韩综合观看成人91| 亚洲一区 视频| 91精品91久久久中77777| ,亚洲人成毛片在线播放| 欧美成人a在线| 九色视频成人自拍| 久久综合九色九九| 中文在线资源| 91精品在线看| 亚洲综合福利| avove在线观看| 久久国产精品久久久久久电车 | jlzzjlzz国产精品久久| 免费看日本黄色片| 亚洲综合激情网| 精品国产青草久久久久96| 欧美一区日本一区韩国一区| 欧美人体大胆444www| 久久精品欧美视频| 筱崎爱全乳无删减在线观看| 91欧美日韩一区| 国产一区二区区别| 国产精彩视频一区二区| 奇米色777欧美一区二区| 成年女人免费视频| 国产精品理伦片| 中日韩黄色大片| 日韩视频一区在线观看| 国产精品天堂| 97视频在线观看视频免费视频| 91精品国产色综合久久不卡粉嫩| 久久99热只有频精品91密拍| 欧美国产精品| 中文字幕在线综合| 久久只精品国产| 免费日韩在线视频| 91精品国产综合久久久久久| 毛片在线免费| 91高清视频免费观看| 天堂av一区| 在线一区高清| 日韩精品亚洲一区| 中文在线永久免费观看| 亚洲精品国产一区二区精华液| 在线播放精品视频| 亚洲久久久久久久久久久| a级大胆欧美人体大胆666| 91久久极品少妇xxxxⅹ软件 | 中文字幕欧美国产| 国产成人一级片| 亚洲国产精品视频在线观看| 亚洲电影视频在线| 国产自摸综合网| 热久久天天拍国产| 成人羞羞国产免费网站| 99国产精品99久久久久久| 久热这里只有精品在线| 欧美一区二区三区啪啪| 青青影院在线观看| 国产日韩av在线播放| 北条麻妃国产九九九精品小说| 99视频热这里只有精品免费| 精品一区二区三区四区五区六区| 一区二区三区四区国产精品| 国产伦理吴梦梦伦理| 中文字幕久久久| 成人1区2区| 中文字幕不卡每日更新1区2区| 久久精品二区亚洲w码| 女人黄色一级片| 欧美军同video69gay| 日韩毛片久久久| 亚洲在线第一页| 欧美日本精品| 无码精品一区二区三区在线播放| 精品色蜜蜜精品视频在线观看| 午夜av免费在线观看| 欧美亚洲激情视频| 国产成人精品一区二区免费看京| 人妻熟女一二三区夜夜爱| 久久久不卡影院| 中文字幕视频一区二区| 久久精品国产99国产精品澳门| 国产亚洲字幕| 男人添女人荫蒂免费视频| 成人午夜精品在线| 国产成人无码精品| 亚洲人成在线一二| 欧美风情在线视频| 91网站在线观看免费| 成+人+亚洲+综合天堂| 久久夜靖品2区| 国产亚洲成av人片在线观看桃| 日日夜夜精品| 被灌满精子的波多野结衣| 2021国产精品久久精品| 中文字幕久久久久| 欧美大片在线看| 日韩电影不卡一区| 孩娇小videos精品| 亚洲精品久久久久久国产精华液| 五月天激情婷婷| 国产精品免费小视频| 久久精品影视| 日本五十肥熟交尾| 欧美综合一区二区| 色av手机在线| 欧美中日韩免费视频| 国模少妇一区二区三区| 日韩免费不卡视频| 尤物yw午夜国产精品视频明星| 麻豆一区在线| 欧美极品欧美精品欧美图片| 亚洲乱码中文字幕综合| 色在线免费视频| 91免费国产网站| 另类国产ts人妖高潮视频| 538精品在线视频| 精品小视频在线| 精品中文视频| 国产熟女高潮视频| 亚洲综合图片区| av每日在线更新| 久久亚洲免费| 国产福利91精品一区二区三区| 天天干天天操天天操| 欧美黑人巨大精品一区二区| 色999日韩|