简单实现MyBatis
一. 简单实现MyBatis
MyBatis简单来说就是通过SqlSessionFactory工厂对象创建SqlSession对象 , 再通过SqlSession对象创建代理 , 例如将UserMapper接口传给SqlSession对象的代理创建方法 , 返回一个UserMapper对象 , 该对象就是代理对象 , 而调用UserMapper对象相应的方法就可以执行对应的sql语句 , 最终执行Sql语句对象其实是Executor对象 , 下面我画一个简单类图配合理解:
我自己简单实现的MyBatis源码地址: https://gitee.com/w_rabbiter/rabbiter_mycode/tree/master/create-mybatis
二. 一级缓存和二级缓存
1. 一级缓存
SqlSession
一级缓存是Mybatis对数据库查询语句的优化缓存,在同一个SqlSession中,会对应一个缓存区,如果在这个SqlSession会话中同时发送相同的SQL语句(执行相同的条件和方法),那么第一次会向数据库发送语句,第二次开始就可以在一级缓存中直接读取。
当SqlSession关闭或者刷新了session(手动刷新,插入修改数据),一级缓存区的数据将会被清空。
引入Spring框架
引入Spring框架后,每次执行Mapper中的语句都会打开一个新的SqlSession,所以不支持一级缓存,如果需要支持一级缓存,则可以开启事务,如下通过注解的方式开启了声明式事务,这样就支持一级缓存了。
@Transactional
@Override
public User getUserByTel(Long tel) {
User user = userDAO.getUserByTel(tel); //第一次查询发送sql语句,可以自己根据日志测试,这里就省略了
User user2 = userDAO.getUserByTel(tel); //第二次查询从一级缓存中获取结果
log.info(user2.toString());
log.info("#####查询到tel={}的用户信息", tel);
return user;
}
2. 二级缓存
一级缓存的作用域是SqlSession,而二级缓存的作用域是mapper和namespace。也就是对于若干SqlSession是共享的缓存。
二级缓存默认是关闭的,我们可以通过xml文件配置二级缓存。
0 条评论
登陆后才能评论哦~