执行过程
SqlSession有三个实现类,当然,你也可以自己实现。DefaultSqlSession是它的默认实现类,当然,还有我们熟悉的SqlSessionTemplate/SqlSessionManager实现类。
- SqlSession,数据库的C、R、U、D及事务处理接口
- SqlSessionFactory获取SqlSession的工厂类
- SqlSessionManager里面集成了SqlSessionFactory,所以可以直接使用来创建session,不用理会factory,但似乎是废弃不使用的了。
过程:
SqlSessionFactoryBuilder -> builder ->
SqlSessionFactory = new DefaultSqlSessionFactory() -> openSession() - >
SqlSession = new DefaultSqlSession( configuration.newExecutor(tx, execType) ) ->
selectOne(String) -> 执行查询方法
-> getMappedStatement 、executor.query ->
根据opsession时选择的执行器执行;
在newExecutor(tx, execType)中,默认是SimpleExecutor,如果开启了二级缓存,则CachingExecutor装饰器再装饰SimpleExecutor。
原理图:
缓存:
- 一级缓存,保存在executor(executor在opensession时创建)的localCache中,你可以配置flushCache,让每次查询前把缓存清空,但是无法阻止查询后MyBabtis把数据缓存起来,他的key由id和完整的sql组成。
- 二级缓存:保存的MappedStatement中(mappedStatement是在解析配置文件时创建的),每次查询CachingExecutor从mappedStatement中获取Chahe。