MyBatis学习(四)MyBatis缓存

MyBatis 缓存
1、缓存(Cache)简介
  • 缓存的概念
存在内存中的临时数据;将用户经常查询的数据放在缓存中,用户去查询数据就不用从磁盘上(关系型数据库数据文件)查询,从缓存中查询,从而提高查询效率,解决了高并发系统的性能问题。
  • 为什么使用缓存?
减少和用户和数据库的交互次数,减少系统的系统内存和资源的开销,极大地提高数据库查询的效率。
  • 什么样的数据可以使用缓存?
经常查询并且不经常修改的数据。
2、MyBatis 缓存
  • MyBatis包含一个非常强大的查询缓存特性,它可以非常方便地定制和配置缓存。缓存可以极大的提升查询效率。
  • MyBatis系统中默认定义了两级缓存:一级缓存和二级缓存
默认情况下:一级缓存开启,SqlSession 级别的缓存,也叫本地缓存。
二级缓存需要手动开启和配置,基于namespace级别的缓存。MyBatis中定义了缓存接口,我们可以通过Cache接口来实现二级缓存。
3、一级缓存
一级缓存也叫作本地缓存,是SqlSession层面实现的缓存;
实现: 和数据库同一次会话期间查询到的用户数据会放在本地缓存中;以后如果需要获取相同的数据,直接就从缓存中获取,没必要再去查询数据库。

测试:

数据库:
在这里插入图片描述
实体类:

package com.zyh.pojo;

import lombok.Data;

@Data
public class User {
    private int id;
    private String name;
    private String pwd;
}

接口:

package com.zyh.mapping;

import com.zyh.pojo.User;
import org.apache.ibatis.annotations.*;

import javax.naming.Name;
import java.util.List;

/**
 * 使用注解进行开发
 */
public interface UserMapper {
    //根据id查询用户
    User getUserById(@Param("id") int id);
}

接口的xml配置:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--namespace的作用:和你编写的持久层的接口关联起来-->
<mapper namespace="com.zyh.mapping.UserMapper">
    <select id="getUserById" parameterType="int" resultType="user">
        select * from user where id=#{id}
    </select>
</mapper>

测试:

package com.zyh.mapping;

import com.zyh.pojo.User;
import com.zyh.utils.MyBatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.jupiter.api.Test;

public class MyTest {
    @Test
    public void test1(){
        SqlSession session = MyBatisUtils.getSession();
        UserMapper mapper = session.getMapper(UserMapper.class);
        User user1 = mapper.getUserById(1);
        System.out.println(user1);

        User user2 = mapper.getUserById(1);
        System.out.println(user2);

        System.out.println(user1 == user2);
        session.close();
    }
}

执行结果:
在这里插入图片描述
我们可以看到SQL只执行了一次,在这一次Sqlsession会话中。

可能会导致缓存失效的情况:

  • 进行数据增删改的时候;
  • 查询不同的数据
  • 手动清除缓存
4、二级缓存

二级缓存也叫全局缓存,一级缓存作用域太低了,所以诞生了二级缓存。

  • 基于namespace级别的缓存,一个名称空间,对应一个二级缓存;
  • 工作机制
    • 一个会话查询一条数据,这个数据就会被放在当前会话的一级缓存中;
    • 如果当前会话关闭了,这个会话对应的一级缓存就没了;但是我们想要的是,会话关闭了,一级缓存中的数据被保存到二级缓存中;
    • 新的会话查询信息,就可以从二级缓存中获取内容;
    • 不同的mapper查出的数据会放在自己对应的缓存(map)中。

开启二级缓存的步骤:

  1. 开启全局缓存
<!--显示的开启全局缓存-->
<setting name="cacheEnabled" value="true"/>

  1. 在要使用二级缓存的Mapper中开启
<!--在当前Mapper.xml中使用二级缓存-->
<cache/>
  1. 对应的实体类实现Serializable接口

测试:
在这里插入图片描述

SQL语句执行一次,存在缓存。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
电子图书资源服务系统是一款基于 Java Swing 的 C-S 应用,旨在提供电子图书资源一站式服务,可从系统提供的图书资源中直接检索资源并进行下载。.zip优质项目,资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松copy复刻,拿到资料包后可轻松复现出一样的项目。 本人系统开发经验充足,有任何使用问题欢迎随时与我联系,我会及时为你解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(若有),项目具体内容可查看下方的资源详情。 【附带帮助】: 若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步。 【本人专注计算机领域】: 有任何使用问题欢迎随时与我联系,我会及时解答,第一时间为你提供帮助,CSDN博客端可私信,为你解惑,欢迎交流。 【适合场景】: 相关项目设计中,皆可应用在项目开发、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面中 可借鉴此优质项目实现复刻,也可以基于此项目进行扩展来开发出更多功能 【无积分此资源可联系获取】 # 注意 1. 本资源仅用于开源学习和技术交流。不可商用等,一切后果由使用者承担。 2. 部分字体以及插图等来自网络,若是侵权请联系删除。积分/付费仅作为资源整理辛苦费用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值