如果代码在事务里,一次请求的SqlSession一样,否则每次都会创建一个SqlSession。
一级缓存(默认开启):作用域:SqlSession级别。存放在SqlSession中的Excutor里。在执行增、删、改操作以后,缓存会删除。
二级缓存(需要在xml手动开启):作用域:namesapce(也就是同一个mapper),二级缓存优于一级缓存。(通过装饰器模式实现)
二级缓存跨mapper:可以使用Cache ref,让ClassMapper引用StudenMapper命名空间,这样两个映射文件对应的SQL操作都使用的是同一块缓存了
缓存的key:mapper+方法名+参数信息+翻页信息
还可以指定某些方法不使用二级缓存。
创建解析器->
解析xml->
实现类是DefaultSqlSessionFactory
openSession:创建事务、创建执行器(BATCH、REUSER、SIMPLE默认)、二级缓存包装执行器、加载插件、返回DefaultSqlSession
sqlsession.getMapper(xxxMapper.class)。
为何获取mapper,通过mapper解耦,保证代码的鲁棒性。
之前有将bindType将 <接口类型、代理工厂类>放在map里,这里去拿出来,通过工厂类newInstance方法创建新的代理mapper对象。
只需要将mapper.方法 和xml中的namespace.sqlId映射起来即可。不需要基础实现,所以没有实现类。
绑定是通过接口+方法名
代理对象invoke方法,调用MapperMethod.excute(sqlSession),先找到MapperStatement,然后获取Configuration,创建一些handler和连接,处理好参数以后执行。
配置文件只初始化一次,SqlSessionFactory -> SqlSession -> Executor -> StatementHandler默认PREPARE(预编译) (parameterHandler处理参数)-> 执行查询 -> 处理结果(ResultSetHandler)
Executor、StatementHandler、ParameterHandler、ResultSetHandler
原文:https://www.cnblogs.com/fcb-it/p/13269764.html