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)创建参数对象和结果集映射对象,默认的对象工厂需要做的