mybatis相关问题
源码
Configuration的作用及创建方式
Configuration是重要的配置类, 主要有4个作用:
- 解释mybatis xml配置为Java语言。(比如:解析
environments节点为environment,settings各种属性的配置等) - 是其他组件的容器。(比如:
mappedStatements管理MappedStatement,resultMaps管理ResultMap,parameterMaps管理ParameterMap) - 提供实例创建的工厂方法。(比如:
newExecutor用于创建执行器,newStatementHandler用于创建StatementHandler) - 提供容器管理的注册器实例。(比如:
jdbcTypeHandlerMap、typeHandlerMap、allTypeHandlersMap、unknownTypeHandler对TypeHandler的管理都是通过typeHandlerRegistry完成的)
XMLConfigBuilder的parse方法解析xml配置后返回一个Configuration对象。
具体而言是:通过创建XMLConfigBuilder实例时,通过new创建Configuration实例,之后通过parse解析xml配置,给Configuration实例赋值,完成构建。
XPathParser
XPathParser是mybatis用于解析xml文件的类。通过实例调用evalNode方法即可。
SqlSession创建过程
- SqlSession使用工厂模式创建,即通过
SqlSessionFactory对象调用openSession。 openSession方法进一步调用了工厂类中的openSessionFromDataSource方法。openSessionFromDataSource方法中通过Configuration对象,执行器,是否自动提交,三个参数实例化DefaultSqlSession获取SqlSession。
openSession方法的介绍
openSession存在多个重载方法,支持在运行过程中修改将要创建的SqlSession的属性:是否自动提交,连接,事务级别,执行器类型。
默认使用的SqlSessionFactory实现为DefaultSqlSessionFactory。
关于事务Transaction
Transaction的创建需要通过TransactionFactory的newTransaction方法。
TransactionFactory工厂可以通过getTransactionFactoryFromEnvironment获取(顾名思义方法参数为Environment)。
- 如果没有在环境中指定事务工厂则默认使用
ManagedTransactionFactory。 - 如果指定事务工厂则使用
environment.getTransactionFactory()获取。
执行器
执行器是Executor接口的实现。它的创建需要通过configuration调用newExecutor(需要将Transaction以及ExecutorType作为参数)。
ExecutorType不同值与之对应的执行器
- BATCH类型对应
BatchExecutor - REUSE类型对应
ReuseExecutor - 其余类型对应
SimpleExecutor
如果允许缓存则使用CachingExecutor,需要注意的是缓存执行器并不是自己去执行sql,而是代理上面的三种执行器。
SqlSessionFactory创建过程
SqlSessionFactory是一个接口,提供了openSession方法的定义,以及getConfiguration用于获取mybatis的配置信息。
SqlSessionFactory的创建需要由SqlSessionFactoryBuilder的build方法来实现。build方法中会解析mybatis配置文件得到Configuration对象。(调用XMLConfigBuilder的parse方法)- 最后将
Configuration作为参数实例化DefaultSqlSessionFactory。
SqlSession如何执行sql
由于可以基于接口和xml配置sql,因此分成两种情况考虑。
- 基于接口的sql执行,可以通过
getMapper获取接口实现实例。这里使用了动态代理。此处按下不表。 - 基于xml方式的sql执行可以通过指定语句命名空间,以及参数的方式执行。比如:
update、delete、selectXXX方法。当然前者也可以通过这种方式实现。
这部分内容详见 SqlSession与sql执行





