Mybatis 原理

…衆ロ難τιáo~ 提交于 2020-08-12 20:27:06

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。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!