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

Mybatis是如何解析配置文件的?看完終于明白了

開發(fā) 前端
在以前文章中,我們把Mybatis源碼閱讀的整個(gè)流程梳理了一遍。今天,我們來詳細(xì)聊聊,Mybatis是如何解析配置文件的。

[[357645]]

在以前文章中,我們把Mybatis源碼閱讀的整個(gè)流程梳理了一遍。今天,我們來詳細(xì)聊聊,Mybatis是如何解析配置文件的。

這是今天分析的流程圖:

 

還是從案例開始。

demo案例

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

見證奇跡

從SqlSessionFactoryBuilder開始。

SqlSessionFactoryBuilder類

  1. org.apache.ibatis.session.SqlSessionFactoryBuilder 

該類里全是build方法各種重載。

  1. //這個(gè)方法啥也沒干   
  2. public SqlSessionFactory build(InputStream inputStream) { 
  3.     return build(inputStream, nullnull); 
  4.  } 

最終來到另外一個(gè)build方法里:

  1. public SqlSessionFactory build(InputStream inputStream, String environment, Properties properties) { 
  2.    try { 
  3.      //創(chuàng)建一個(gè)XMLConfigBuilder對(duì)象   
  4.      XMLConfigBuilder parser = new XMLConfigBuilder(inputStream, environment, properties); 
  5.      return build(parser.parse()); 
  6.    } catch (Exception e) { 
  7.      throw ExceptionFactory.wrapException("Error building SqlSession.", e); 
  8.    } finally { 
  9.      ErrorContext.instance().reset(); 
  10.      try { 
  11.        inputStream.close(); 
  12.      } catch (IOException e) { 
  13.        // Intentionally ignore. Prefer previous error. 
  14.      } 
  15.    } 
  16.  } 

XMLConfigBuilder類

該類的構(gòu)造方法重載:

 

首先進(jìn)入:

  1. public XMLConfigBuilder(InputStream inputStream, String environment, Properties props) { 
  2.     this(new XPathParser(inputStream, true, props, new XMLMapperEntityResolver()), environment,      
  3.          props); 
  4. private XMLConfigBuilder(XPathParser parser, String environment, Properties props) { 
  5.     super(new Configuration()); 
  6.     ErrorContext.instance().resource("SQL Mapper Configuration"); 
  7.     this.configuration.setVariables(props); 
  8.     this.parsed = false
  9.     this.environment = environment; 
  10.     this.parser = parser; 

build(parser.parse());中的parser.parse();

mybatis-config.xml在哪里解析的呢?

請(qǐng)看下面這個(gè)方法:

  1. //該方法返回一個(gè)Configuration對(duì)象 
  2. public Configuration parse() { 
  3.   if (parsed) { 
  4.     throw new BuilderException("Each XMLConfigBuilder can only be used once."); 
  5.   } 
  6.   parsed = true
  7.   //關(guān)鍵點(diǎn) 
  8.   parseConfiguration(parser.evalNode("/configuration")); 
  9.   return configuration; 

parseConfiguration(parser.evalNode("/configuration"));

終于看到開始解析配置文件了:

 

進(jìn)入方法parseConfiguration。

  1. private void parseConfiguration(XNode root) { 
  2.   try { 
  3.     //issue #117 read properties first 
  4.     propertiesElement(root.evalNode("properties")); 
  5.     Properties settings = settingsAsProperties(root.evalNode("settings")); 
  6.     loadCustomVfs(settings); 
  7.     loadCustomLogImpl(settings); 
  8.     typeAliasesElement(root.evalNode("typeAliases")); 
  9.     pluginElement(root.evalNode("plugins")); 
  10.     objectFactoryElement(root.evalNode("objectFactory")); 
  11.     objectWrapperFactoryElement(root.evalNode("objectWrapperFactory")); 
  12.     reflectorFactoryElement(root.evalNode("reflectorFactory")); 
  13.     settingsElement(settings); 
  14.     // read it after objectFactory and objectWrapperFactory issue #631 
  15.     environmentsElement(root.evalNode("environments")); 
  16.     databaseIdProviderElement(root.evalNode("databaseIdProvider")); 
  17.     typeHandlerElement(root.evalNode("typeHandlers")); 
  18.     mapperElement(root.evalNode("mappers")); 
  19.   } catch (Exception e) { 
  20.     throw new BuilderException("Error parsing SQL Mapper Configuration. Cause: " + e, e); 
  21.   } 

這里就是把mybatis-config.xml內(nèi)容解析,然后設(shè)置到Configuration對(duì)象中。

那么我們定義的Mapper.xml是在哪里解析的呢?

我們的Mapper.xml在mybatis-config.xml中的配置是這樣的:

 

使用方式有以下四種:

  1. //1使用類路徑 
  2. <mappers> 
  3.     <mapper resource="org/mybatis/builder/AuthorMapper.xml"/> 
  4.       <mapper resource="org/mybatis/builder/BlogMapper.xml"/> 
  5.    <mapper resource="org/mybatis/builder/PostMapper.xml"/> 
  6. </mappers> 
  7. //2使用絕對(duì)url路徑 
  8. <mappers> 
  9.    <mapper url="file:///var/mappers/AuthorMapper.xml"/> 
  10.    <mapper url="file:///var/mappers/BlogMapper.xml"/> 
  11.    <mapper url="file:///var/mappers/PostMapper.xml"/> 
  12. </mappers> 
  13. //3使用java類名 
  14. <mappers> 
  15.    <mapper class="org.mybatis.builder.AuthorMapper"/> 
  16.    <mapper class="org.mybatis.builder.BlogMapper"/> 
  17.    <mapper class="org.mybatis.builder.PostMapper"/> 
  18. </mappers> 
  19.  
  20. //4自動(dòng)掃描包下所有映射器 
  21. <mappers> 
  22.    <package name="org.mybatis.builder"/> 
  23. </mappers> 

繼續(xù)源碼分析,我們?cè)谏厦鎚ybatis-config.xml解析中可以看到:

 

我們不妨進(jìn)入這個(gè)方法看看:

  1. private void mapperElement(XNode parent) throws Exception { 
  2.    if (parent != null) { 
  3.      for (XNode child : parent.getChildren()) { 
  4.        //自動(dòng)掃描包下所有映射器 
  5.        if ("package".equals(child.getName())) { 
  6.          String mapperPackage = child.getStringAttribute("name"); 
  7.          //放   
  8.          configuration.addMappers(mapperPackage); 
  9.        } else { 
  10.          String resource = child.getStringAttribute("resource"); 
  11.          String url = child.getStringAttribute("url"); 
  12.          String mapperClass = child.getStringAttribute("class"); 
  13.          //使用java類名 
  14.          if (resource != null && url == null && mapperClass == null) { 
  15.            ErrorContext.instance().resource(resource); 
  16.             //根據(jù)文件存放目錄,讀取XxxMapper.xml 
  17.            InputStream inputStream = Resources.getResourceAsStream(resource); 
  18.             //映射器比較復(fù)雜,調(diào)用XMLMapperBuilder 
  19.            //注意在for循環(huán)里每個(gè)mapper都重新new一個(gè)XMLMapperBuilder,來解析 
  20.            XMLMapperBuilder mapperParser = new XMLMapperBuilder(inputStream, configuration, resource, configuration.getSqlFragments()); 
  21.            mapperParser.parse(); 
  22.          //使用絕對(duì)url路徑 
  23.          } else if (resource == null && url != null && mapperClass == null) { 
  24.            ErrorContext.instance().resource(url); 
  25.            InputStream inputStream = Resources.getUrlAsStream(url); 
  26.            //映射器比較復(fù)雜,調(diào)用XMLMapperBuilder 
  27.            XMLMapperBuilder mapperParser = new XMLMapperBuilder(inputStream, configuration, url, configuration.getSqlFragments()); 
  28.            mapperParser.parse(); 
  29.          //使用類路徑     
  30.          } else if (resource == null && url == null && mapperClass != null) { 
  31.            Class<?> mapperInterface = Resources.classForName(mapperClass); 
  32.            //直接把這個(gè)映射加入配置 
  33.            configuration.addMapper(mapperInterface); 
  34.          } else { 
  35.            throw new BuilderException("A mapper element may only specify a url, resource or class, but not more than one."); 
  36.          } 
  37.        } 
  38.      } 
  39.    } 
  40.  } 

這里剛剛和我們的上面說的使用的方式完全是一模一樣的。

到這里,配置文件mybatis-config.xml和我們定義映射文件XxxMapper.xml就全部解析完成。

回到SqlSessionFactoryBuilder類

前面講到了XMLConfigBuilder中的parse方法,并返回了一個(gè)Configuration對(duì)象。

build(parser.parse());

這個(gè)build方法就是傳入一個(gè)Configuration對(duì)象,然后構(gòu)建一個(gè)DefaultSqlSession對(duì)象。

  1. public SqlSessionFactory build(Configuration config) { 
  2.   return new DefaultSqlSessionFactory(config); 

繼續(xù)回到我們的demo代碼中這一行代碼里:

  1. SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); 

這一行代碼就相當(dāng)于:

  1. SqlSessionFactory sqlSessionFactory = new new DefaultSqlSessionFactory(); 

 

到這里,我們的整個(gè)流程就搞定了。

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

 

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

2021-07-08 21:19:04

BashLinux

2021-11-09 06:49:20

WiFi 6WiFi 5通信網(wǎng)絡(luò)

2021-06-28 21:04:09

顯示器花屏電腦

2020-01-06 08:40:11

阿里場(chǎng)景服務(wù)

2021-07-26 05:00:16

算法DfsBfs

2022-02-25 07:07:04

擴(kuò)展塢電腦筆記本

2022-12-31 08:17:02

2021-06-04 07:13:43

Logger TRACEDEBUG

2022-08-08 20:23:14

一網(wǎng)統(tǒng)管企業(yè)協(xié)商

2021-06-13 12:03:46

SaaS軟件即服務(wù)

2022-03-27 20:32:28

Knative容器事件模型

2021-10-09 00:02:04

DevOps敏捷開發(fā)

2011-03-28 09:07:26

Nagios配置文件

2010-02-03 09:19:31

Python模塊

2018-03-09 10:02:23

iPhone X下巴蘋果

2021-09-26 15:58:05

MySQL SQL 語句數(shù)據(jù)庫

2022-05-01 22:09:27

數(shù)據(jù)模型大數(shù)據(jù)

2021-09-16 12:10:24

物聯(lián)網(wǎng)互聯(lián)網(wǎng)應(yīng)用

2020-10-21 14:33:01

接口主流顯示器

2021-06-29 11:21:41

數(shù)據(jù)安全網(wǎng)絡(luò)安全黑客
點(diǎn)贊
收藏

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

欧美黄色免费| 欧美男男激情videos| 久久99精品久久久久久动态图| 中文国产成人精品| 久久久久无码国产精品一区李宗瑞| 91精品国产黑色瑜伽裤| 久久精品视频网| 成人做爰www免费看视频网站| 久久久久久激情| 久久av综合| 日韩一区二区三区免费看 | 永久免费av片在线观看全网站| 国内精品伊人久久久久av影院| 久久久人成影片一区二区三区观看 | 成人一区二区三区| 国产精品视频网址| 国产真实的和子乱拍在线观看| av亚洲免费| 精品区一区二区| 国产精品视频分类| 都市激情国产精品| 日韩毛片视频在线看| 久久99精品久久久久子伦| 夜夜狠狠擅视频| 久久久久看片| 九九精品在线观看| 中文字幕第24页| 日韩啪啪网站| 欧美一级二级三级蜜桃| 手机在线看福利| 美女在线视频免费| 亚洲激情成人在线| 午夜精品福利一区二区| 同心难改在线观看| 国产盗摄女厕一区二区三区| 国产精品永久免费| 国产欧美一区二区三区在线看蜜臂| 女生裸体视频一区二区三区| 一个人www欧美| 波多野结衣福利| av成人资源| 日韩一区二区免费在线观看| 国产一二三区av| 欧美xxxxxx| 欧美日韩国产在线| 少妇av一区二区三区无码| 性欧美ⅴideo另类hd| 中文字幕色av一区二区三区| 日韩色妇久久av| 黄色在线小视频| 久久综合一区二区| 久草一区二区| 婷婷婷国产在线视频| 99精品国产91久久久久久| 国产精品v欧美精品∨日韩| av加勒比在线| 国产麻豆成人精品| 99电影在线观看| 国产激情无套内精对白视频| 国产乱码精品一区二区三区av| 成人黄色网免费| 国产农村妇女毛片精品| 国精产品一区一区三区mba视频| 国产精品午夜一区二区欲梦| 九九热最新视频| 蜜臀久久久99精品久久久久久| 国产精品美女网站| 夜夜嗨aⅴ一区二区三区| 精品一区二区在线免费观看| 91理论片午午论夜理片久久| 国产福利第一页| 国产iv一区二区三区| 国产精品国模大尺度私拍| 亚洲av无码乱码国产精品| 不卡的看片网站| 精品国产一区二区三区免费| 四虎在线免费观看| 国产亚洲精品资源在线26u| 日韩视频专区| 91cn在线观看| 午夜天堂影视香蕉久久| 精品99在线视频| 日本一区二区电影| 欧美一区二区视频网站| 国产亚洲精品成人a| 网曝91综合精品门事件在线| 一个人看的www久久| tube国产麻豆| 欧美欧美天天天天操| 欧美亚洲成人免费| 亚洲无码精品国产| 国产成人av一区二区三区在线| 精品国产一区二区三区免费| 91在线视频免费看| 亚洲自拍偷拍网站| 激情视频综合网| 91欧美精品| 精品久久久久久久一区二区蜜臀| 久久无码人妻精品一区二区三区| 久久精品高清| 午夜精品久久久久久久白皮肤| 日日夜夜狠狠操| 国产成人综合在线| 日本成人黄色免费看| av理论在线观看| 色综合久久九月婷婷色综合| 黄色片子免费看| 亚洲区小说区图片区qvod| 久久精品免费播放| 亚洲日本视频在线观看| 狠狠色狠狠色综合系列| 蜜桃av噜噜一区二区三区| 搞黄网站在线观看| 在线观看亚洲精品| 国产高潮视频在线观看| 四季av在线一区二区三区| 欧美亚洲国产精品| 性做久久久久久久| 国产精品视频在线看| 国产深夜男女无套内射| 96视频在线观看欧美| 亚洲欧美资源在线| 日本亚洲欧美在线| 国产精品正在播放| 一级二级三级欧美| 高清av不卡| 亚洲国产精品专区久久| 欧美三级日本三级| 九色综合国产一区二区三区| 欧洲在线视频一区| 国模精品视频| 欧美成人精精品一区二区频| 国产美女网站视频| 日本视频一区二区三区| 欧美成人蜜桃| 色多多在线观看| 天海翼亚洲一区二区三区| 黄网站在线观看| 久久精品嫩草影院| 欧美剧情片在线观看| 亚洲欧美日本一区| 亚洲三级免费| 成人精品一二区| 精品美女在线观看视频在线观看| 精品视频免费在线| 在线免费看视频| 奇米影视一区二区三区小说| 欧美激情第一页在线观看| av在线播放资源| 亚洲国产成人爱av在线播放| 免费一级片视频| 国产成人鲁色资源国产91色综| 大地资源第二页在线观看高清版| 免费视频成人| 北条麻妃在线一区二区| 在线免费观看中文字幕| 国产精品美女久久福利网站| 欧美婷婷精品激情| 久久一区91| 成人网在线免费看| 日本一区二区免费视频| 农村老熟妇乱子伦视频| 久久精品欧美一区二区| 一二三区中文字幕| 国产精品一品视频| 亚洲中文字幕无码一区二区三区| av一级久久| 国产亚洲一二三区| 一本一本a久久| 成人51免费| 欧美成人中文字幕在线| 亚洲高清视频在线播放| 午夜久久久久久| 国产免费看av| 理论电影国产精品| 在线观看污视频| 国产一区二区三区亚洲| 日韩av观看网址| 色网站在线看| 精品国产麻豆免费人成网站| 波多野结衣国产| 欧美国产精品v| 久久成年人网站| 亚洲黄色影院| 视频一区二区在线| 亚洲精品在线国产| 日本aⅴ大伊香蕉精品视频| 永久免费av在线| 精品国产髙清在线看国产毛片| 天天干天天干天天干天天| 亚洲国产精品黑人久久久| ass极品水嫩小美女ass| 亚洲欧美日韩综合国产aⅴ| 视频在线观看成人| 岛国精品一区| 国产精品美女av| 55av亚洲| 日韩专区在线观看| 少妇一区二区三区四区| 欧美少妇bbb| 日本一二三区视频| 国产精品情趣视频| 少妇户外露出[11p]| 国产在线麻豆精品观看| 青青草成人免费在线视频| 青青草成人影院| 国产一区二区不卡视频在线观看 | 久久午夜影院| 国产综合久久久久| 日本美女一区| 欧美精品videofree1080p| 成年人免费在线视频| 亚洲电影免费观看高清完整版在线| 免费看av在线| 精品国产乱码久久久久久婷婷| 国产精品suv一区二区88| 91色视频在线| 在线观看欧美一区二区| 免费欧美在线视频| av动漫在线观看| 亚洲午夜精品久久久久久app| 亚洲美女搞黄| 深爱激情久久| 精品一区二区不卡| 久久久久九九精品影院| 国产女人18毛片水18精品| 国产日韩电影| 久久久视频在线| 91精品久久| 久久久久www| 日韩黄色影院| 国产一区二区三区欧美| 深夜福利免费在线观看| 精品国产91乱码一区二区三区| 国产精品人妻一区二区三区| 91黄色小视频| 国产午夜无码视频在线观看| 欧美日韩午夜视频在线观看| 国产一级中文字幕| 一区二区三区四区在线播放 | 日本黄色不卡视频| 日韩精品一区二区三区三区免费| 91麻豆成人精品国产免费网站| 欧美中文字幕亚洲一区二区va在线| 中文字幕亚洲高清| 天天综合色天天综合| 日韩精品一区二区三区国语自制| 亚洲免费av在线| 在线观看美女av| 亚洲另类一区二区| 免费中文字幕在线观看| 一区二区三区产品免费精品久久75| www深夜成人a√在线| 亚洲图片欧美激情| 岛国毛片在线观看| 亚洲最新视频在线观看| 国产精品30p| 午夜激情久久久| 久久99精品波多结衣一区| 欧美视频国产精品| 国产suv精品一区二区33| 在线免费av一区| 亚洲视频久久久| 在线成人av网站| 国产chinasex对白videos麻豆| 日韩欧美视频一区| 欧美一级片免费| 日韩av影视在线| 国产视频第一页在线观看| 中文日韩在线观看| 婷婷在线播放| 18久久久久久| 欧洲成人一区| 91在线网站视频| 豆花视频一区二区| 欧美久久综合性欧美| 日韩综合网站| 国产av熟女一区二区三区| 99这里有精品| 一本色道久久亚洲综合精品蜜桃| 国产一区二区三区免费播放| 97精品人人妻人人| 久久久不卡网国产精品一区| 亚洲欧美另类日本| 亚洲一区二区av电影| 伊人手机在线视频| 欧美日韩国产色站一区二区三区| 国产高潮流白浆喷水视频| 亚洲精品xxxx| 免费a级毛片在线播放| 韩国v欧美v日本v亚洲| 成人视屏在线观看| 99视频日韩| 国产一区二区亚洲| 无码人妻精品一区二区蜜桃百度| 在线一区免费观看| 成年人三级黄色片| 91网上在线视频| 精品人妻伦九区久久aaa片| 精品福利一区二区| 国产精品日韩无码| 亚洲图片制服诱惑| 欧美v亚洲v| 国产在线视频2019最新视频| 日韩伦理一区二区三区| 在线视频福利一区| 久久精品女人| 成年人看片网站| 日本一区二区成人| 日本免费观看视| 欧美精品久久99久久在免费线| 亚洲欧美综合在线观看| 久久香蕉国产线看观看av| 免费观看亚洲| 肥熟一91porny丨九色丨| 日韩视频在线观看| 国产主播在线看| 成人免费视频一区二区| 男人av资源站| 在线观看免费一区| 日韩美女一级视频| 欧美极品美女视频网站在线观看免费| 国产美女久久| 精品在线观看一区二区| 国产精品v亚洲精品v日韩精品| 91欧美视频在线| 久久久亚洲高清| 日本一级一片免费视频| 日韩你懂的在线观看| 免费在线午夜视频| 国产精品视频内| 精品欧美激情在线观看| 夫妻免费无码v看片| 成人国产电影网| 国产女人被狂躁到高潮小说| 欧美日韩三级在线| 久久精品蜜桃| 国产成人精品久久久| 亚洲第一论坛sis| www.com毛片| 99热这里都是精品| 国产精品19乱码一区二区三区| 日韩亚洲欧美成人一区| 日韩 欧美 视频| 在线免费观看黄| 海角国产乱辈乱精品视频| 婷婷综合国产| 人妻无码一区二区三区四区| 国产美女视频一区| 亚洲精品卡一卡二| 欧美精品色综合| 黄色av免费在线| 成人精品视频99在线观看免费| 久久人人99| 日韩欧美理论片| 亚洲乱码国产乱码精品精可以看| 国产熟女一区二区丰满| 美女精品视频一区| 香蕉成人app| 国产免费黄色小视频| 91丨porny丨中文| 国产成人一区二区三区影院在线| 日韩电影第一页| 成人影院大全| 日韩精品国内| 久久精品国产99久久6| 五月天婷婷色综合| 欧美成人一区二区三区片免费 | 人妻精品无码一区二区三区| 久久毛片高清国产| 在线观看亚洲一区二区| 大胆人体色综合| 国产精品久久久久久久久久白浆 | 日本一区二区三区播放| 丁香五月网久久综合| 一区二区在线| 国产精品99精品无码视亚| 亚洲大片精品永久免费| 国产一卡二卡在线播放| 综合视频在线| 美女性感视频久久久| 一级免费黄色录像| 欧美日韩激情视频8区| 国产一级免费在线观看| 成人福利网站在线观看11| av中文资源在线资源免费观看| 欧美精品18videos性欧| 午夜精品福利影院| 亚洲天堂av一区二区| 亚洲综合无码一区二区| 欧美高清电影在线| 成人有码在线播放| 在线观看一区| 亚洲av熟女国产一区二区性色| 91精品欧美综合在线观看最新| 啊啊啊久久久| 超碰成人在线免费观看| 91偷拍与自偷拍精品| 国产乱码精品一区二区| 国产91av在线|