加载配置并初始化
加载配置文件,将SQL的配置信息加载成一个个MappedStatement对象(包括了传入参数映射配置、执行的SQL语句、结果映射配置),存储在内存中。
接受调用请求
调用MyBatis提供的API,传入SQL的id和传入参数对象,将请求传递给下层的请求处理层进行处理。
处理操作请求
MyBatis支持一级缓存和二级缓存
默认开启,不需要额外配置。
基于PerpetualCache的HashMap本地缓存,其存储作用域为session,当session flush或close之后,该session的所有缓存被清空
一级缓存的生命周期
MyBatis在开启一个数据库会话时,会 创建一个新的SqlSession对象,SqlSession对象中会有一个新的Executor对象。Executor对象中持有一个新的PerpetualCache对象;当会话结束时,SqlSession对象及其内部的Executor对象还有PerpetualCache对象也一并释放掉。
如果SqlSession调用了close()方法,会释放掉一级缓存PerpetualCache对象,一级缓存将不可用。
如果SqlSession调用了clearCache(),会清空PerpetualCache对象中的数据,但是该对象仍可使用。
SqlSession中执行了任何一个update操作(update()、delete()、insert()) ,都会清空PerpetualCache对象的数据,但是该对象可以继续使用。
怎么判断某两次查询是完全相同的查询
mybatis认为,对于两次查询,如果以下条件都完全一样,那么就认为它们是完全相同的两次查询。
传入的statementId。
查询时要求的结果集中的结果范围。
这次查询所产生的最终要传递给JDBC java.sql.Preparedstatement的Sql语句字符串(boundSql.getSql() )。
传递给java.sql.Statement要设置的参数值。
需要在SQLMapConfig.xml中设置总开关开启外,还需要在具体的Mapper.xml中开启。同时,resultType的类必须实现Serializable接口。
<setting name="cacheEnabled" value="true" />
<mapper namespace="org.silence.mapper.EmpMapper"> <!--开启二级缓存--> <cache></cache> </mapper>
public class EMP implements Serializable { ... }
与一级缓存机制相同,默认采用PerpetualCache的HashMap本地存储,其作用域为Mapper(namespace),并且可以自定义存储源,如Ehcache等。
映射语句文件中的所有select语句将会被缓存。
映射语句文件中的所有insert、update和delete语句会刷新缓存。
缓存会使用默认的Least Recently Used(LRU,最近最少使用的)算法来收回。
根据时间表,比如No Flush Interval,(CNFI没有刷新间隔),缓存不会以任何时间顺序来刷新。
缓存会存储列表集合或对象(无论查询方法返回什么)的1024个引用。
缓存会被视为是read/write(可读/可写)的缓存,意味着对象检索不是共享的,而且可以安全的被调用者修改,不干扰其他调用者或线程所做的潜在修改。
在Mapper.xml的具体SQL语句中通过 useCahe="false"
可以关闭当前语句的缓存:
<select id="findById" useCahe="false" ... /></select>