本篇文章我们首先解析 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);【Mybatis核心类SqlSessionFactory,看完我悟了】是的 , 那只是你以为的两行代码 , 其实......

文章插图
话不多说 , 指北君就来给大家揭秘这冰山下面的东西 。
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);}
推荐阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 当大厂程序员已开始用AI写代码 人类会被AIGC淘汰吗?
- 绝对干货,超全的 MyBatis 动态代理原理讲解!
- 粒粒香照样子写词语;吃的很欢、急的直哭类似的词语
- 声波远探测;谁知道人类学习了动物的什么发明了别的东西,比如飞机了、雷达了……
- 紫米是糯米吗
- 央视春晚|2023年央视春晚节目单公布,40个节目歌舞类最重,语言类紧贴时代
- 小龙虾属于什么类
- 富含益生菌的10类食物
- 黄金分类有几种简称……黄金的种类有几种
- 火星温度适合人类吗
