一、MySQL缓存
- 一级缓存:一次访问数据库的请求会建立一个sqlSession,这个sqlSession会有多条sql语句,MyBatis会将执行过后的数据放到一级缓存,如果该sqlSession执行范围内,前后出现了相同的sql语句,后面的可以直接从缓存拿到数据。
注意:同一个事务中的sql语句属于同一个sqlSession,当期间执行了数据库的update操作后,之前的一级缓存会被清空。
- 二级缓存:一次数据库访问请求结束后sqlSession不会被清理,每个nameSpace下都会保留有一份sqlSession缓存,后端多次访问数据库时可以共用这些session缓存( 多个事务可以共享同一份缓存,但是每个事务执行期间更新了数据库也会刷新缓存)
二、MyBatis执行sql语句全过程
结合下图
MyBatis执行sql语句的过程中处处体现着动态代理的思想
- 首先后端程序调用service接口方法;
- service接口被 动态代理拦截指向serviceMapper的xml文件;
- mapperProxy代理会执行它的invoke方法调用sqlSession的Executor;
- Executor分为两种情况: 第一种情况:未被代理时先执行cacheExecutor,如果是update操作直接更新数据库,如果是查询操作会先 查询缓存(一级二级缓存)命中缓存直接返回,未命中则被代理statementHandler拦截执行preparedStatementHandler方法;
第二种情况就是Executor直接被代理statementHandler拦截;- preparedStatementHandler在执行查询操作前可以被自定义拦截器拦截( MyBatis原生不支持分页查询功能,此处可以代理实现分页查询);
- 设置handler的参数;
- 执行sql查询语句具体操作,得到数据库返回数据;
- ResultSetHandler处理查询到的数据(此处也可以 被代理拦截,写入自定义的服务端数据处理操作);
- 返回数据到前端;