Mybatis核心类SqlSessionFactory,看完我悟了
本篇文章我们首先解析 SqlSessionFactory 的创建过程。 1、实例代码
在实例代码中,我们在测试类中写了一个 init() 方法,里面包括了 SqlSessionFactory 的构建,分为两步。
第一步:读取配置文件 mybatis-config.xml 输入流
第二步:根据输入流构建 SqlSessionFactory; public void init() { //定义mybatis全局配置文件 String resource = "mybatis-config.xml"; //加载 mybatis 全局配置文件 InputStream inputStream = null; try { inputStream = Resources.getResourceAsStream(resource); } catch (IOException e) { e.printStackTrace(); } //构建sqlSession的工厂 sessionFactory = new SqlSessionFactoryBuilder().build(inputStream); }
没什么难的,去掉 try-catch,也就两行代码。 InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml"); SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
是的,那只是你以为的两行代码,其实......
话不多说,指北君就来给大家揭秘这冰山下面的东西。 2、代码剖析
根据上面的时序图,我们分析根据源码分析每个步骤。
①、获取配置文件输入流 InputStream inputStream = Resources.getResourceAsStream("mybatis.config.xml");
这里没什么好说的,就是获取配置文件的输入流。
②、build(in)
这里的 in 就是上一步获取的输入流 inputStream。 public SqlSessionFactory build(InputStream inputStream) { return build(inputStream, null, null); }
在进入到 build 方法: public SqlSessionFactory build(InputStream inputStream, String environment, Properties properties) { try { XMLConfigBuilder parser = new XMLConfigBuilder(inputStream, environment, properties); return build(parser.parse()); } catch (Exception e) { throw ExceptionFactory.wrapException("Error building SqlSession.", e); } finally { ErrorContext.instance().reset(); try { inputStream.close(); } catch (IOException e) { // Intentionally ignore. Prefer previous error. } } }
③、XMLConfigBuilder(in)
这一段代码是为了解析我们的配置文件,配置文件是 XML形式 ,我在之前的博客介绍过解析 XML 的几种方式。
一种是基于树的结构来解析的称为DOM;另一种是基于事件流的形式称为SAX和(StAX)
两者各有优缺点,我这里不做详细说明,想了解的可以看我之前的文章。
而 Mybatis 使用的是 DOM 形式,并结合 XPath 来解析配置文件。
④、parse() public Configuration parse() { if (this.parsed) { throw new BuilderException("Each XMLConfigBuilder can only be used once."); } else { this.parsed = true; this.parseConfiguration(this.parser.evalNode("/configuration")); return this.configuration; } }
从 /configuration 标签处开始解析。然后我们进入到 this.parseConfiguration() 方法中: private void parseConfiguration(XNode root) { try { this.propertiesElement(root.evalNode("properties")); Properties settings = this.settingsAsProperties(root.evalNode("settings")); this.loadCustomVfs(settings); this.loadCustomLogImpl(settings); this.typeAliasesElement(root.evalNode("typeAliases")); this.pluginElement(root.evalNode("plugins")); this.objectFactoryElement(root.evalNode("objectFactory")); this.objectWrapperFactoryElement(root.evalNode("objectWrapperFactory")); this.reflectorFactoryElement(root.evalNode("reflectorFactory")); this.settingsElement(settings); this.environmentsElement(root.evalNode("environments")); this.databaseIdProviderElement(root.evalNode("databaseIdProvider")); this.typeHandlerElement(root.evalNode("typeHandlers")); this.mapperElement(root.evalNode("mappers")); } catch (Exception var3) { throw new BuilderException("Error parsing SQL Mapper Configuration. Cause: " + var3, var3); } }
看到这是不是很熟悉了,这不就是mybatis-config.xml 配置文件里面的各个标签名嘛,是的,这就是解析该文件,然后全部放在 configuration 对象中。需要注意的是,这里的 configuration 对象不仅包括 mybatis-config.xml 文件内容,也包括 xxxMapper.xml 文件内容。
⑤、build(configuration) public SqlSessionFactory build(Configuration config) { return new DefaultSqlSessionFactory(config); }
就是去 new 了一个 DefaultSqlSessionFactory 对象,将 configuration 作为参数。
⑥、DefaultSqlSessionFactory(configuration) public DefaultSqlSessionFactory(Configuration configuration) { this.configuration = configuration; } 3、总结
自此,SqlSessionFactory 的创建过程就讲完了,总的来说就是一个封装了配置文件的工厂类。那么得到了 SqlSessionFactory 这个工厂对象,接下来干嘛?生产 SqlSession,然后通过 SqlSession 进行数据库的增删改查操作
没错,接下来,指北君将给大家介绍 SqlSession 的交互过程,这也是 Mybatis 里面最重要的一个对象。
前三季度销量超过特斯拉,比亚迪蜕变完成?近期,比亚迪发布公告称,10月新能源汽车销量21。78万辆今年前三季度,比亚迪乘用车销量达到了118。5万辆,同比大增160,超过了国外电动车巨头特斯拉同期的90。9万辆。以如此高
果链飓风代工厂的宿命与远方来源锦缎(IDjinduan006)作者愚老头苹果链上的公司,境外某大客户但凡有个风吹草动,在供应商那就是一场飓风。飓风起于青萍之末。本文将从现象入手,拆解整场飓风的缘起当下与未来
骁龙8Gen2测试,网友有835那味,天玑9200有点难了天玑9200和骁龙8Gen2发布后,很多网友都关心二者的实际表现,而厂商为了宣传自家的芯片,提供了工程机给相关媒体测试,而最近极客湾已经完成了二者的测试,从目前的测试情况来看,高通
资讯允许前排无人,百度小马智行在京获自动驾驶测试许可文懂车帝原创常思玥懂车帝原创行业11月21日,北京市智能网联汽车政策先行区颁发自动驾驶无人化第二阶段测试的许可,百度Apollo小马智行成为首批获准在北京开启前排无人,后排有人的自
关注麒麟电池将供货给特斯拉?宁德时代合作信息保密文懂车帝原创邢秋鸿懂车帝原创行业11月22日,针对麒麟电池是否有计划供货给特斯拉的问题,宁德时代在投资者互动平台表示,公司的供应链合作信息属于商业保密范畴。麒麟电池今年6月,宁德时
朝鲜能看到哪些中国产品?淘汰的国货最受欢迎改革开放之后我国加紧了与世界各国的交流和沟通,同时也促成了和多个国家的外交关系。我国凭借着人口众多的优势成为了世界上的制造大国,中国产品也逐渐流向世界市场,其中就包括朝鲜。我国的产
中国惊艳的10个县城,去过一半,不枉此生!你去过几个?无论大城市多么耀眼,也不要小看县域的光芒。在县城,家人朋友都在身边,上下班不用挤地铁,周末可以去田里呼吸新鲜空气今天,就为大家介绍10个独具风貌的中国县城(含县级市)。浙江桐庐桐庐
江苏盐城值得推荐的九个旅游景点盐镇水街百河之城再现繁华,感受最盐城魅力盐镇水街,紧邻串场河,位于东进路和世纪大道之间,是海盐历史文化风貌区的主景区,为国家AAAA级旅游景区。其以水街建筑为主体,形成了仿古建筑街
摩洛哥,一个令人费解的非洲国家在大部分人眼里,非洲国家都是一个以黑人为主,但是有这么一个国家却恰恰相反。它就是位于非洲西北角的摩洛哥,摩洛哥不仅以白人为主,而且还与欧洲人长得特别相像,那么摩洛哥是一个怎样的国家
济北旅游大道为什么要封上呢?难道为了防控就不给走大路了?今天有事去汶上北,要走济北旅游大道。但是刚到了汶上界,因疫情原因去汶上的旅游大道给封上了。既没有留个出口或检查站之类的,也没有小路可以绕过去。只能走去汶上的105国道,看了下导航多
宋朝的旅游博主驴友鼻祖徐霞客现如今到各个名胜古迹名山大川打卡旅游,领略风土民情,撰写旅游日记和攻略成了年轻人的潮流。殊不知这都是宋朝徐霞客玩剩下的。搁现代,老徐绝对是旅游大V。少年立志徐霞客绝对是素质教育成功