MyBatis源码解析——获取SqlSession

上一篇讲解了SqlSessionFactory的获取过程,那接下来我们就来说一说如何从SqlSessionFactory中拿到SqlSession。还是写一个测试方法,一步步debug,跟踪源码,看看SqlSessionFactory到底做了什么。

首先进入DefaultSqlSessionFactory中,调用它的openSession()方法,openSession()方法有很多重载,我们这里什么参数都没有。有兴趣的朋友,可以详细看一下每一个参数代表什么含义,这里就不再讲述。接着调用openSessionFromDataSource(execType, level,autoCommit),这三个参数是什么意思呢?第一个参数execType是指执行器类型,如果没有配置,默认是SIMPLE,还有两个是REUSE,BATCH,顾名思义,一个代表可重复使用,一个代表批量处理。第二个参数是level,代表的是事务的隔离级别,我们知道mysql有四种隔离级别,如果没有配置,默认为null。第三个参数是autoCommit,代表自动提交,配置以后,事务会自动提交,这里没有配置,所以默认为false。在这个方法里,先是从configuration中获取environment信息,再从environment获取transactionFactory事务工厂,调用transactionFactory.newTransaction()得到事务tx(是一个JdbcTransaction类型),然后调用configuration的newExecutor(tx,execType)得到一个Executor(执行器)。在这里,根据执行器类型,我们可以获取一个SimpleExector,另外,如果配置了二级缓存并开启,则会new一个CachingExecutor对象。然后调用interceptorChain.pluginAll(executor)方法,interceptorChain拦截器链,实际上这里是mybatis提供给开发者一个接口Interceptor,用来拦截目标对象,动态的增加mybatis的功能,mybatis插件的开发就跟这息息相关。这里我们没有写拦截器,所以就直接返回了executor。接着就new了一个DefaultSqlSession(configuration,executor,autoCommit)对象,到这里我们就明白了SqlSession的是如何获得的了,返回给我们的是一个DefaultSqlSession,如图所示。

好了,mybatis获取SqlSession的过程就大致讲完了,接下来我会继续讲解Mapper的获取过程。

猜你喜欢

转载自blog.csdn.net/rz_0212/article/details/81170336