![66ca235f8cfd3a80f06629cd0b0b58c8.png](https://i-blog.csdnimg.cn/blog_migrate/a1749965ba5dcdffd8f18f9bc1d021d7.jpeg)
作者|搜l搜|简书
一、什么是缓存
![53840ad6d065d444298b5ccca8948073.png](https://i-blog.csdnimg.cn/blog_migrate/8617644f461b222f87c61e992d5f05a3.jpeg)
对于JDBC操作,如果需要连续请求id=1的用户数据,那么就需要进行两次的数据库连接,获取数据库中的数据。相同的数据,进行两次数据库连接,这肯定会造成资源的浪费。基于面向对象,可以把第一次获取的数据保存到一个对象中,下一次直接从对象中获取就行了,也就是下面这个样子:
![68cf3bbc26021335a01cd8c75903e802.png](https://i-blog.csdnimg.cn/blog_migrate/7c17e5a882408de25d17d351c711b134.jpeg)
获取的内容保存在对象中,在一个请求期间,直接使用或者传递对象就可以了。对于JDBC的操作,可以自己定义类或者集合来保存数据库中的数据,来避免连续请求数据库的问题。这里用来保存数据的对象或者集合,也能称之为缓存。
但是使用了三层架构之后,Dao层和Dao层之间有可能互相是不清楚的。如果有一个复杂的业务要在Service层中进行处理,需要分别调用不同Dao层中的数据,那这样简单的缓存还是不够看。
![4eadd2556dcd1e76110f923744ad1995.png](https://i-blog.csdnimg.cn/blog_migrate/8606d81f51dbe892a186105aa5a5db01.jpeg)
这种情况,要再去处理缓存问题,就会花费过多的精力,得不偿失。在这种层面上的缓存处理MyBatis框架已经做好了,就叫做一级缓存。
MyBatis的一级缓存就是基于数据库会话(SqlSession)的。
二、MyBatis的主要层次结构
使用MyBatis对数据库操作的代码,能够看见的就是这个SqlSession对象。实际上,这只是MyBatis对外暴露的接口,整个MyBatis核心部件是下面的这么一堆接口和类:
1️⃣SqlSession:MyBatis工作的主要顶层API,表示和数据库交互的会话,完成必要数据库增删改查功能。
2️⃣Executor:MyBatis执行器,整个MyBatis调度的核心,负责SQL语句的生成和查询缓存的维护。
3️⃣StatementHandler:封装了JDBC Statement操作,负责对JDBC statement 的操作,如设置参数、将Statement结果集转换成List集合。
4️⃣ParameterHandler:负责对用户传递的参数转换成JDBC Statement 所需要的参数。
5️⃣ResultSetHandler:负责将JDBC返回的ResultSet结果集对象转换成List类型的集合。
6️⃣TypeHan