首页 > 软件开发 > Java > 简单实现MyBatis

简单实现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文件配置二级缓存。

猜你喜欢

Shiro框架的基本使用及问题解决

Shiro框架的基本使用及问题解决

Java常用API

Java常用API

Java工具类整理

Java工具类整理

脚本分享-打印Spring Mvc容器中的所有接口

脚本分享-打印Spring Mvc容器中的所有接口

关于 CSharp 中调用非托管代码的方法

关于 CSharp 中调用非托管代码的方法

0 条评论

img 登陆后才能评论哦~