79.【Mybatis】(十二)

简介: 79.【Mybatis】
(3).缓存失效的情况

(1).查询不同的数据

(2).增删改,可能会改变原来的数据,所以数据必定会刷新

@Test
    public void test(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        User user = mapper.queryById(1);
        System.out.println(user);
        System.out.println("============");
        int i = mapper.updateByID(new User(1, "小傻", "278872"));
        User user2 = mapper.queryById(1);
        System.out.println(user2);
        sqlSession.close();
    }

(3).查询不同的Mapper.xml

(4).手动关闭缓存

sqlSession.clearCache();
@Test
    public void test(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        User user = mapper.queryById(1);
        System.out.println(user);
        System.out.println("============");
        sqlSession.clearCache();
        User user2 = mapper.queryById(1);
        System.out.println(user2);
        sqlSession.close();
    }

5.二级缓存(全局缓存)

要启用全局的二级缓存,只需要在你的 SQL 映射文件中添加一行:

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

基于namespace级别的缓存,一个名称空间,对应一个二级缓存;

  • LRU – 最近最少使用:移除最长时间不被使用的对象。(默认)
  • FIFO – 先进先出:按对象进入缓存的顺序来移除它们。
  • SOFT – 软引用:基于垃圾回收器状态和软引用规则移除对象。
  • WEAK – 弱引用:更积极地基于垃圾收集器状态和弱引用规则移除对象。
    二级缓存的工作机制:
  • 一个 会话查询一条语句,这个数据就会被放在当前会话的而一级缓存里面
  • 如果当前会话关闭,这个会话对应的一级缓存就没了。但是我们想要的是会话关闭了,一级缓存的数据保存到二级缓存中。
  • 新的会话查询信息,就可以从而二级缓存中获取内容
  • 不同的mapper查出的数据会放在自己对应的缓存中去
(1).如何开启二级缓存?

(1).首先开启全局的缓存模式

cacheEnabled  全局性地开启或关闭所有映射器配置文件中已配置的任何缓存。  true | false  true
<setting name="mapUnderscoreToCamelCase" value="true"/>

(2).在要使用二级缓存的mapper.xml配置文件中去

<cache/>

也可以自定义参数

<cache
  eviction="FIFO"
  flushInterval="60000"
  size="512"
  readOnly="true"/>
(2).测试二级缓存的实列(反列)

这里没有添加二级缓存的标签,所以使用的是一级缓存。

接口

package Com.Jsxs.Dao;
import Com.Jsxs.pojo.User;
import org.apache.ibatis.annotations.Param;
public interface UserMapper {
// 通过ID对数据进行修改
    int updateByID(User user);
}

配置文件

<?xml version="1.0" encoding="UTF8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="Com.Jsxs.Dao.UserMapper">
<!--    通过id对数据进行查询-->
    <select id="queryById" parameterType="_int" resultType="Com.Jsxs.pojo.User">
        select *from user where id=#{id}
    </select>
<!--    通过id对数据进行修改-->
    <update id="updateByID" parameterType="Com.Jsxs.pojo.User">
        update user set name=#{name},pwd=#{pwd} where id=#{id}
    </update>
</mapper>

测试

package Com.Jsxs.Dao;
import Com.Jsxs.pojo.User;
import Com.Jsxs.utils.MybatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
public class UserTest {
//    通过ID进行数据的查询
    @Test
    public void test(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        SqlSession sqlSession1 = MybatisUtils.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        UserMapper mapper1 = sqlSession1.getMapper(UserMapper.class);
        User user = mapper.queryById(1);
        User user1 = mapper1.queryById(1);
        System.out.println(user);
        System.out.println("===========================");
        System.out.println(user1);
       sqlSession.close();
       sqlSession1.close();
    }
}

(3).测试二级缓存的实列(正列)

这里会添加成二级缓存的标签

测试

@Test
    public void test(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        SqlSession sqlSession1 = MybatisUtils.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        UserMapper mapper1 = sqlSession1.getMapper(UserMapper.class);
        User user = mapper.queryById(1);
        sqlSession.close();
        System.out.println("已经关闭了会话**********");
        User user1 = mapper1.queryById(1);
        System.out.println(user);
        System.out.println(user1);
       sqlSession1.close();
    }

(4).常见问题:

(1).如果再添加标签的时候,我们没有对数据进行添加参数,需要对实体类进行实列化的接口。

<cache/>

解决方法: 对实体类进行实列化的操作。

package Com.Jsxs.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
@NoArgsConstructor
@Data
@AllArgsConstructor
public class User implements Serializable {
    private int id;
    private String name;
    private String pwd;
}

2.如果再添加标签的时候,对实体类已经进行了参数的操作,那么就不用对实体类进行实列化就能运行

(5).小结

(1).只要开启了二级缓存,在同一个Mapper下就有效;

(2).所有的数据都会最先存储再一级缓存中

(3).只有当会话提交,或则关闭的时候,才会提交到二级缓冲中去

(6).缓存原理

(二十)、自定义缓存(Ehcache)

Ehcache是一种广泛使用的开源Java分布式缓存。

1.准备工作

导包

<!-- https://mvnrepository.com/artifact/org.mybatis.caches/mybatis-ehcache -->
<dependency>
    <groupId>org.mybatis.caches</groupId>
    <artifactId>mybatis-ehcache</artifactId>
    <version>1.1.0</version>
</dependency>

在使用的mapper中导入自定义缓存标签

<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
相关文章
|
8月前
|
SQL 缓存 Java
|
5天前
|
Java 数据库连接 mybatis
|
5天前
|
XML Java 数据库连接
MyBatis入门配置
【2月更文挑战第9天】
MyBatis入门配置
|
5天前
|
缓存 Java 数据库连接
一文彻底搞懂Mybatis系列(十六)之MyBatis集成EhCache
一文彻底搞懂Mybatis系列(十六)之MyBatis集成EhCache
|
5天前
|
SQL 缓存 Java
一文彻底搞懂Mybatis系列(十五)之MyBatis二级缓存
一文彻底搞懂Mybatis系列(十五)之MyBatis二级缓存
255 0
|
5天前
|
SQL Java 关系型数据库
一文彻底搞懂Mybatis系列(一)之mybatis入门
一文彻底搞懂Mybatis系列(一)之mybatis入门
102 0
|
5天前
|
SQL Java 数据库连接
|
5月前
|
Java 数据库连接 Maven
SSM复习之mybatis01:Mybatis简介-第一个Mybatis代码简单实现
SSM复习之mybatis01:Mybatis简介-第一个Mybatis代码简单实现
38 0
|
10月前
|
SQL IDE Java
MyBatis-Plus 的入门案例
MyBatis-Plus 的入门案例
98 2
|
11月前
|
Oracle Java 关系型数据库
MyBatis-Plus入门案例
MyBatis-Plus入门案例