Mybatis 所有的力量来自 SqlSession 接口,DefaultSqlSession 是它的一个实现类。
DefaultSqlSession 中包括了 Configuration 和 Executor。
Configuration 在 SqlSessionFactory 的初始化中通过 XMLMapperBuilder 来生成 MappedStatement,并放入 Configuraion 中。
执行任何 SQL 语句,都是从 SqlSession 进入,从 Configuration 获取 MappedStatement,然后放入 Executor。
sqlSource 在 MappedStatement 中会变成 boundSql。
在 Executor 中 MappedStatement 和其他一些条件会生成 StatementHandler。
在 StatementHandler 中实际执行 JDBC 的操作,然后通过 ResultSetHandler 包装好结果回传。
Configuration ---> MappedStatement ---> Executor ---> StatementHandler ---> ResultSetHandler
* JDBC 中没有 Transaction 接口,只是通过 Connection 体现了这个概念;Mybatis 中有 Transaction 接口。
* JDBC 中有 DataSource 接口,用于管理 Connnection,比如连接池。
* 一级缓存在 BaseExecutor 内使用
* 二级缓存在 CachingExecutor 内使用
* 如果要延迟加载(LazyLoad)千万记得用 resultMap,否则就不行。
--------------------------------
顺便说下mybatis-spring
public class ClassPathMapperScanner extends ClassPathBeanDefinitionScanner
ClassPathMapperScanner 类的 processBeanDefinitions 方法里把所有的 GenericBeanDefinition 的 beanClass 设置成 MapperFactoryBean。
之后有 SqlSessionTemplate,里面用 proxy 创建 SqlSession,而 SqlSessionInterceptor 实现了 InvocationHandler。
还涉及到了 SqlSessionUtils 里的 getSqlSession 方法。
SqlSessionHolder holder = (SqlSessionHolder) TransactionSynchronizationManager.getResource(sessionFactory); SqlSession session = sessionHolder(executorType, holder); if (session != null) { return session; }
通过 TransactionSynchronizationManager 可以拿到绑定到当前线程的 SqlSession。
来源:oschina
链接:https://my.oschina.net/bxnet/blog/4273822