Skip to main content

mybatis问答

Q&AmybatisQ&AAbout 3 min

源码

Configuration的作用及创建方式

Configuration是重要的配置类, 主要有4个作用:

  1. 解释mybatis xml配置为Java语言。(比如:解析environments节点为environmentsettings各种属性的配置等)
  2. 是其他组件的容器。(比如:mappedStatements管理MappedStatementresultMaps管理ResultMapparameterMaps管理ParameterMap
  3. 提供实例创建的工厂方法。(比如:newExecutor用于创建执行器,newStatementHandler用于创建StatementHandler
  4. 提供容器管理的注册器实例。(比如:jdbcTypeHandlerMaptypeHandlerMapallTypeHandlersMapunknownTypeHandlerTypeHandler的管理都是通过typeHandlerRegistry完成的)

XMLConfigBuilderparse方法解析xml配置后返回一个Configuration对象。
具体而言是:通过创建XMLConfigBuilder实例时,通过new创建Configuration实例,之后通过parse解析xml配置,给Configuration实例赋值,完成构建。

XPathParser

XPathParser是mybatis用于解析xml文件的类。通过实例调用evalNode方法即可。

SqlSession创建过程

  1. SqlSession使用工厂模式创建,即通过SqlSessionFactory对象调用openSession
  2. openSession方法进一步调用了工厂类中的openSessionFromDataSource方法。
  3. openSessionFromDataSource方法中通过Configuration对象,执行器,是否自动提交,三个参数实例化DefaultSqlSession获取SqlSession
openSession方法的介绍

openSession存在多个重载方法,支持在运行过程中修改将要创建的SqlSession的属性:是否自动提交,连接,事务级别,执行器类型。
默认使用的SqlSessionFactory实现为DefaultSqlSessionFactory

关于事务Transaction

Transaction的创建需要通过TransactionFactorynewTransaction方法。

TransactionFactory工厂可以通过getTransactionFactoryFromEnvironment获取(顾名思义方法参数为Environment)。

  1. 如果没有在环境中指定事务工厂则默认使用ManagedTransactionFactory
  2. 如果指定事务工厂则使用environment.getTransactionFactory()获取。
执行器

执行器是Executor接口的实现。它的创建需要通过configuration调用newExecutor(需要将Transaction以及ExecutorType作为参数)。

ExecutorType不同值与之对应的执行器

  1. BATCH类型对应BatchExecutor
  2. REUSE类型对应ReuseExecutor
  3. 其余类型对应SimpleExecutor

如果允许缓存则使用CachingExecutor,需要注意的是缓存执行器并不是自己去执行sql,而是代理上面的三种执行器。

SqlSessionFactory创建过程

SqlSessionFactory是一个接口,提供了openSession方法的定义,以及getConfiguration用于获取mybatis的配置信息。

  1. SqlSessionFactory的创建需要由SqlSessionFactoryBuilderbuild方法来实现。
  2. build方法中会解析mybatis配置文件得到Configuration对象。(调用XMLConfigBuilderparse方法)
  3. 最后将Configuration作为参数实例化DefaultSqlSessionFactory

SqlSession如何执行sql

由于可以基于接口和xml配置sql,因此分成两种情况考虑。

  1. 基于接口的sql执行,可以通过getMapper获取接口实现实例。这里使用了动态代理。此处按下不表。
  2. 基于xml方式的sql执行可以通过指定语句命名空间,以及参数的方式执行。比如:updatedeleteselectXXX方法。当然前者也可以通过这种方式实现。

这部分内容详见 SqlSession与sql执行

What do you think?
  • 0
  • 0
  • 0
  • 0
  • 0
  • 0
Comments
  • Latest
  • Oldest
  • Hottest
Powered by Waline v3.0.0-alpha.10