MyBatis一级缓存
一级缓存
mybatis的缓存大家应该知道、有一级缓存和二级缓存,一级缓存是基于MyBatis自带的HashMap本地缓存,作用范围为session域内。当 session flush或者 close之后,该 session中所有的 cache就会被清空。
在参数和 SQL 完全一样的情况下,我们使用同一个 SqlSession 对象调用同一个 mapper 的方法,往往只执行一次 SQL。因为使用 SqlSession 第一次查询后,MyBatis会将其放在缓存里面去,
再次查询时,如果没有刷新并且缓存没有超时的情况下,SqlSession会取出当前缓存数据,不会再次发送 SQL到数据库执行查询。
由于SqlSession 之间是相互隔离的,所以如果使用不同的SqlSession对象,即使调用相同的 Mapper参数和方法,MyBatis 还是会再次发送 SQL 到数据库执行,返回结果的。
在 WebsiteMapper 类中添加 selectWebsiteById 方法,代码如下。
public Website selectWebsiteById(int id);
WebsiteMapper.xml 中添加相应的映射 SQL 语句,代码如下。
<select id="selectWebsiteById"
resultType="com.po.Website">
SELECT * FROM website
WHERE id=#{id}
</select>
测试代码参考如下。
public class Test {
public static Logger logger = Logger.getLogger(Test.class);
public static void main(String[] args) throws IOException {
InputStream config = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(config);
SqlSession ss = sqlSessionFactory.openSession();
Website site = ss.selectOne("com.mapper.WebsiteMapper.selectWebsiteById", 1);
logger.debug("使用同一个sqlsession再执行一次...");
Website site2 = ss.selectOne("com.mapper.WebsiteMapper.selectWebsiteById", 1);
ss.commit();
logger.debug("现在创建一个新的SqlSeesion对象在执行一次...");
SqlSession ss2 = ssf.openSession();
Website site3 = ss2.selectOne("com.mapper.WebsiteMapper.selectWebsiteById", 1);
ss2.commit();
}
运行结果如下。
DEBUG [main] - ==> Preparing: SELECT * FROM website WHERE id=?
DEBUG [main] - ==> Parameters: 1(Integer)
DEBUG [main] - 使用同一个sqlsession再执行一次
DEBUG [main] - 现在创建一个新的SqlSeesion对象在执行一次
DEBUG [main] - ==> Preparing: SELECT * FROM website WHERE id=?
DEBUG [main] - ==> Parameters: 1(Integer)
从运行结果可以看出,第一个SqlSession只发生过一次查询,
而第二次查询就从缓存中取出了。
大家点赞、收藏、关注、评论啦 、打卡 文章 更新 268/ 365天
- 点赞
- 收藏
- 关注作者
评论(0)