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对象。