MyBatis 源码学习5——SqlSession创建过程

SqlSession的创建过程

SqlSession对象表示MyBaits框架与数据库建立的会话,我们通过SqlSession实例完成对数据库的增删改查操作。

下面开始了解SqlSession实例的创建过程,主要分为3个阶段:

1.Configuration实例的创建过程

2.SqlSessionFactory实例的创建过程

3.SqlSession实例化的过程

一、XPath方式解析XML文件

MyBatis的主配置文件和Mapper配置都使用的是XML格式,框架在启动时会解析XML配置,将配置信息转换为Configuration对象

JDK API中提供了3种方式解析XML,分别为DOM、SAX和XPath。API最易于使用的就是XPath方式,MyBatis框架中也采用XPath方式解析XML文件中的配置信息。

下面演示下通过XPath方式解析XML文件。假设我们有如下XML文件:
在这里插入图片描述

XML文件中的配置信息可以通过一个Java类来描述:
在这里插入图片描述

使用JDK提供的XPath相关API解析XML
在这里插入图片描述

1.创建表示XML文档的Document对象(无论通过哪种方式解析XML,都要先创建表示XML文档的Document对象)
先调用DocumentBuilderFactory类的newInstance()方法创建DocumentBuilderFactory对象,
然后调用BuilderFactory对象的newDocumentBuilder()方法创建DocumentBuilder对象,
最后调用DocumentBuilder对象的parse()方法创建Document对象。

2.创建用于执行XPath表达式的XPath对象
首先调用XPathFactory工厂类的newInstance()方法获取XPathFactory工厂实例,
然后调用XPathFactory对象的newXPath()方法获取XPath实例。

3.使用XPath对象执行表达式,获取XML内容
XPath表达式的执行结果为XML节点对象(例如Node、Element、NodeList等)或者字符串、数值类型等。

为了简化XPath解析操作,MyBatis通过XPathParser工具类封装了对XML的解析操作,省去了Document对象和XPath对象的创建过程,同时使用XNode类(方便获取节点的属性、子节点等信息)增强了对XML节点的操作。
依然是前面的案例,使用XPathParser工具类
在这里插入图片描述

二、Configuration实例创建过程

Configuration的3个主要作用

1.描述MyBatis配置信息,例如<settings>标签配置的参数信息。

2.作为容器注册MyBatis其他组件,例如TypeHandler、MappedStatement等。

3.提供工厂方法,创建ResultSetHandler、StatementHandler、Executor、ParameterHandler等组件实例。

Configuration对象的构建过程

1.首先以MyBatis主配置文件输入流作为参数,创建了一个XMLConfigBuilder对象,

2.接着调用XMLConfigBuilder对象的parse()方法创建Configuration对象。

详细看下XMLConfigBuilder类parse()方法的实现:
在这里插入图片描述
1.调用XPathParser对象的evalNode()方法获取XML配置文件中节点对应的XNode对象,

2.调用parseConfiguration()方法通过该XNode对象获取更多配置信息。

详细看下XMLConfigBuilder类中parseConfiguration()方法的实现:
在这里插入图片描述
在parseConfiguration()方法中,对于<configuration>标签的子节点,都有一个单独的方法处理,例如使用propertiesElement()方法解析<properties>标签,使用pluginElement()方法解析<plugin>标签。

MyBatis主配置文件中常用标签

<properties>:用于配置属性信息,这些属性的值可以通过${…}方式引用。
<settings>:通过一些属性来控制MyBatis运行时的一些行为。例如,指定日志实现、默认的Executor类型等。
<typeAliases>:用于配置类型别名,目的是为Java类型设置一个更短的名字。它存在的意义仅在于用来减少类完全限定名的冗余。
<plugins>:用于注册用户自定义的插件信息。

<objectFactory>:MyBatis通过对象工厂(ObjectFactory)创建参数对象和结果集映射对象,默认的对象工厂需要做的仅仅是实例化目标类,要么通过默认构造方法,要么在参数映射存在的时候通过参数构造方法来实例化。
<objectFactory>标签用于配置用户自定义的对象工厂。
<objectWrapperFactory>:MyBatis通过ObjectWrapperFactory创建ObjectWrapper对象,通过ObjectWrapper对象能够很方便地获取对象的属性、方法名等反射信息。
<objectWrapperFactory>标签用于配置用户自定义的ObjectWrapperFactory。
<reflectorFactory>:MyBatis通过反射工厂(ReflectorFactory)创建描述Java类型反射信息的Reflector对象,通过Reflector对象能够很方便地获取Class对象的Setter/Getter方法、属性等信息。
<reflectorFactory>标签用于配置自定义的反射工厂。
<environments>:用于配置MyBatis数据连接相关的环境及事务管理器信息。通过该标签可以配置多个环境信息,然后指定具体使用哪个。
<typeHandlers>:用于注册用户自定义的类型处理器(TypeHandler)。
<mappers>:用于配置MyBatis Mapper信息。

三、SqlSession实例创建过程

SqlSession实例创建过程
在这里插入图片描述

1.获取mybatis配置文件输入流Reader

2.创建了一个SqlSessionFactoryBuilder对象,调用SqlSessionFactoryBuilder对象的build(Reader reader)
方法,获得DefaultSqlSessionFactory的实例。

3.调用SqlSessionFactory对象的openSession()方法即可创建SqlSession对象
在这里插入图片描述

其中SqlSessionFactoryBuilder对象的build(Reader reader)方法的实现:
在这里插入图片描述

1.创建一个XMLConfigBuilder对象

2.然后调用XMLConfigBuilder对象的parse()方法对主配置文件进行解析,生成Configuration对象。

3.以Configuration对象作为参数,调用重载的build()方法,其方法内容为new DefaultSqlSessionFactory(Configuration config);
在这里插入图片描述

其中SqlSessionFactory对象的openSession()方法中直接调用openSessionFromDataSource()方法,下面是openSessionFromDataSource()方法的实现
在这里插入图片描述

1.通过Configuration对象获取MyBatis主配置文件中通过标签配置的环境信息,

2.根据配置的事务管理器类型创建对应的事务管理器工厂。MyBatis提供了两种事务管理器,分别为JdbcTransaction和ManagedTransaction。

其中,JdbcTransaction是使用JDBC中的Connection对象实现事务管理的,而ManagedTransaction表示事务由外部容器管理。这两种事务管理器分别由对应的工厂类JdbcTransactionFactory和ManagedTransactionFactory创建。

3.调用Configuration对象的newExecutor()方法,根据MyBatis主配置文件中指定的Executor类型创建对应的Executor对象

4.最后以Executor对象和Configuration对象作为参数,通过Java中的new关键字创建一个DefaultSqlSession对象。DefaultSqlSession对象中持有Executor对象的引用,真正执行SQL操作的是Executor对象。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值