Mybatis的缓存主要有两种:
在这里主要记录系统缓存的一些简单概念, 并没有涉及原理。其中会涉及Mybatis的相关配置以及生命周期等。 主要参考资料:《深入浅出Mybatis基础原理与实战》,http://www.mybatis.org/mybatis-3/zh/index.html
本文介绍的是基于XML的配置,并不是关于注解的Mybatis配置。当然复杂SQL情况下都建议使用XML配置。
这里记录的只是Myabtis的简单配置,并没有证整合Spring等框架,所以相对简单。我开始学的时候也是反复记不住,不知道为什么要这么配置,这么配置的作用是什么。之后经过研读《深入浅出Mybatis基础原理与实战》(我这里只有PDF电子版本,有需要的朋友可以评论或者私信我),总结并画图让我对整个配置过程有了全新的认识。
简单来说,Mybatis的配置主要分为以下几步(整合Spring之后有些就不需要了,但是一开始学习不建议直接整合Spring):
注意:以上的配置并没有严格的前后顺序;
image
可以这么总结Mybatis或者帮助理解Mybatis的配置,我总结了以下三点提供参考:
正确理解SqlSessionFactory、SqlSessionFactoryBuilder、SqlSession和Mapper的生命周期对于优化Mybatis尤为重要,这样可以使Mybatis高效正确完成;同为重要时Mybatis的生命周期对于理解Myabtis缓存的配置也尤为重要,我这里只做简单的文字介绍(其实也好理解):
(1)SqlSessionFactoryBuilder:作用就是创建一个构建器,一旦创建了SqlSessionFactory,它的任务就算完成了,可以回收。
(2)SqlSessionFactory:作用是创建SqlSession,而SqlSession相当于JDBC的一个Connection对象,每次应用程序需要访问数据库,我们就要通过SqlSessionFactory创建一个SqlSession,所以SqlSessionFactory在整Mybatis整个生命周期中(每个数据库对应一个SqlSessionFactory,是单例产生的)。
(3)SqlSession:生命周期是存在于请求数据库处理事务的过程中,是一个线程不安全的对象(在多线程的情况下,需要特别注意),即存活于一个应用的请求和申请,可以执行多条SQL保证事务的一致性。
(4)Mapper:是一个接口,并没有实现类它的作用是发送SQL,返回我们需要的结果,或者发送SQL修改数据库表,所以它存活于一个SqlSession内,是一个方法级别的东西。当SqlSession销毁的时候,Mapper也会销毁。
(1)系统缓存:包括一级缓存与二级缓存
一级缓存:默认情况下Myabtis对于同一个SqlSession开启一级缓存
二级缓存:这里可以结合SqlSessionFactory等的生命周期能加深理解
缓存的配置只需要在XML配置<cache/>即可,或者指定算法,刷新时间间隔,缓存状态,大小等
<pre style="margin: 0px; padding: 0px; white-space: pre-wrap; overflow-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;"> <cache eviction="LRU" readOnly="true" flushInterval="100000" size="1024"></cache></pre>
A. 映射语句文件中所有select语句将会被缓存;
B. 映射语句文件中所有insert、update和delete语句会被刷新缓存;
C. 缓存使用默认的LRU最近最少使用算法回收;
D. 根据时间表,缓存不会任何时间顺序刷新;
E. 缓存会存储列表集合或对象的1024个引用
F. 缓存被视为可read/write的缓存,意味着是不可以被共享的,而可以被安全地修改。
(2)自定义缓存:结合Redis等主流缓存配置
我们可以使用比如现在比较火的Redis缓存,需要实现Myabtis为我们提供的接口org.apache.ibatis.cache.Cache。虽然现在主流Mybatis用的都是自定义缓存,但是这里先不过多介绍,我一步一步来学习记录!
(1)作为新手很大可能在配置过程中会遇到很多坑(我就是其中之一),比如Mybatis的日志配置。这里可以主要参考:http://www.mybatis.org/mybatis-3/zh/configuration.html
(2)mybatis的相关配置文件(没有myabtis-config.xml)可以使用eclipse中的插件生成(具体网上有很多教程),但还要进行适当修改!