mybatis12--一级缓存

验证一级缓存的存在

对应的实体类

/**
 *学生对应的实体类
 */
public class Student {

    private  Integer sId;
    private  String sName;

    public Integer getsId() {
        return sId;
    }
    public void setsId(Integer sId) {
        this.sId = sId;
    }
    public String getsName() {
        return sName;
    }
    public void setsName(String sName) {
        this.sName = sName;
    }
    public Student(Integer sId, String sName) {
        super();
        this.sId = sId;
        this.sName = sName;
    }
    public Student() {
        super();
    }
    //在双向关联的时候    只能一方显示关联信息   否则会出现stackOverflow 异常
    @Override
    public String toString() {
        return "Student [sId=" + sId + ", sName=" + sName +"]";
    }

}

对应的数据库就是上面多对多练习中的student表

创建对应的dao

public interface StudentDao {
    /**
     * 根据学生的编号查询对应的信息
     * 验证一级缓存的存在
     */
    Student selectStudentById(Integer sId);
}
<?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">
<mapper namespace="cn.bdqn.dao.StudentDao">

    <!-- 查询指定学生的信息    验证一级缓存的存在 -->
     <select id="selectStudentById" resultType="Student">
      select  sid,sname from  student where sid=#{xxx}
    </select>

</mapper>

对应的测试类代码

package cn.bdqn.test;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.ibatis.session.SqlSession;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import cn.bdqn.bean.Student;
import cn.bdqn.dao.StudentDao;
import cn.bdqn.util.SessionUtil;

public class TeacherTest {
    StudentDao dao;
    SqlSession session;

    @Before
    public void before() {
        // 因为需要关闭session 需要把session提取出去
        session = SessionUtil.getSession();
        dao = session.getMapper(StudentDao.class);
    }

    @After
    public void after() {
        if (session != null) {
            session.close();
        }
    }

    /**
     * 验证一级缓存的存在
     * myBatis的一级缓存是一直开启的,并且不能关闭!
     */
    @Test
    public void test1() {
        Student student = dao.selectStudentById(1);
        System.out.println(student);
        //再次查询相同的id对象
        Student student2 = dao.selectStudentById(1);
        System.out.println(student2);
    }

}

查询语句的结果是:

验证mybatis缓存查询的依据!

在dao中增加一个方法

public interface StudentDao {
    /**
     *  验证mybatis缓存查询的依据!
     */
    Student selectStudentById(Integer sId);

    Student selectStudentById2(Integer sId);
}

修改mapper文件

<?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">
<mapper namespace="cn.bdqn.dao.StudentDao">

    <!-- 查询指定学生的信息    验证mybatis缓存查询的依据!
          两个查询语句的id不一致,但是sql语句一样-->
     <select id="selectStudentById" resultType="Student">
      select  sid,sname from  student where sid=#{xxx}
    </select>

     <select id="selectStudentById2" resultType="Student">
      select  sid,sname from  student where sid=#{xxx}
    </select>

</mapper>

增加测试代码

  /**
     * 验证查询的依据
     * 两个查询都是查询id为1的学生对象,但是查询语句的id不一致
     */
    @Test
    public void test2() {
        Student student = dao.selectStudentById(1);
        System.out.println(student);
        //再次查询相同的id对象
        Student student2 = dao.selectStudentById2(1);
        System.out.println(student2);
    }

查询的结果是:

/**
     * 得到的结论是:
     *  mybatis的查询依据是  :  mapper文件中sql的id   + sql语句!
     *  hibernate底层查询的依据是: 查询对象的id!
     *
     *  其实缓存的底层是一个map,
     *  map的key就是查询依据,value是查询的结果!
     */

验证增删改查对一级缓存的影响!

在dao中增加一个新增的方法

/**
     * 验证增删改查对一级缓存的影响!
     */
    void addStudent(Student student);

在mapper中新增

<!-- 新增一个学生 -->
    <insert id="addStudent">
      insert into student values(#{sId},#{sName})
      <!--#{sId},#{sName} 对应的是实体类中的属性名  -->
    </insert>

增加测试代码

/**
     * 验证增删改对一级缓存的影响
     * 之前是只有一条查询语句!
     * 但是加上新增语句之后发现出现了再次查询!
     *
     * 因为增删改查操作都要清空缓存,把数据同步到数据库,
     * 保证后续的查询得到正确的结果集!
     */
    @Test
    public void test3() {
        Student student = dao.selectStudentById(1);
        System.out.println(student);
        dao.addStudent(new Student(66, "新增学生"));
        //再次查询相同的id对象
        Student student2 = dao.selectStudentById(1);
        System.out.println(student2);
    }

得到的结果是:

时间: 2024-10-13 13:31:14

mybatis12--一级缓存的相关文章

mybatis12一级缓存

验证一级缓存的存在 对应的实体类 /** *学生对应的实体类 */ public class Student { private Integer sId; private String sName; public Integer getsId() { return sId; } public void setsId(Integer sId) { this.sId = sId; } public String getsName() { return sName; } public void set

hibernate 一级缓存

一级缓存 为什么要用缓存? 目的:减少对数据库的访问次数!从而提升hibernate的执行效率! Hibernate中缓存分类: 一级缓存 二级缓存 概念 1)Hibenate中一级缓存,也叫做session的缓存,它可以在session范围内减少数据库的访问次数!  只在session范围有效! Session关闭,一级缓存失效! 2)当调用session的save/saveOrUpdate/get/load/list/iterator方法的时候,都会把对象放入session的缓存中. 3)S

[转] Hibernate一级缓存、二级缓存

缓存是介于应用程序和物理数据源之间,其作用是为了降低应用程序对物理数据源访问的频次,从而提高了应用的运行性能.缓存内的数据是对物理数据源中的数据的复制,应用程序在运行时从缓存读写数据,在特定的时刻或事件会同步缓存和物理数据源的数据. 缓存的介质一般是内存,所以读写速度很快.但如果缓存中存放的数据量非常大时,也会用硬盘作为缓存介质.缓存的实现不仅仅要考虑存储的介质,还要考虑到管理缓存的并发访问和缓存数据的生命周期. hibernate的缓存包括Session的缓存和SessionFactory的缓

26Mybatis_一级缓存及其测试

这篇文章讲解一级缓存: 先介绍一级缓存的原理: 1.我们先不看虚线部分: 第一次发起查询用户id为1的用户信息,先去找缓存中是否有id为1的用户信息,如果没有,从数据库查询用户信息. 得到用户信息,将用户信息存储到一级缓存中. 第二次发起查询用户id为1的用户信息,先去找缓存中是否有id为1的用户信息,缓存中有,直接从缓存中获取用户信息. 2.我们带上虚线部分一起看: 第一次发起查询用户id为1的用户信息,先去找缓存中是否有id为1的用户信息,如果没有,从数据库查询用户信息. 得到用户信息,将用

hibernate一级缓存和二级缓存的区别

缓存是介于应用程序和物理数据源之间,其作用是为了降低应用程序对物理数据源访问的频次,从而提高了应用的运行性能.缓存内的数据是对物理数据源中的数据的复制,应用程序在运行时从缓存读写数据,在特定的时刻或事件会同步缓存和物理数据源的数据. 缓存的介质一般是内存,所以读写速度很快.但如果缓存中存放的数据量非常大时,也会用硬盘作为缓存介质.缓存的实现不仅仅要考虑存储的介质,还要考虑到管理缓存的并发访问和缓存数据的生命周期. Hibernate的缓存包括Session的缓存和SessionFactory的缓

hibernate 一级缓存和二级缓存

hibernate一级缓存:session缓存即事务级缓存,session关闭,缓存自动销毁,开发人员不用管理,由hibernate管理,save.update.saveoOrUpdate.lock.load.list会自动向一级缓存中存放数据,get,load,list会自动从一级缓存中取数据,可调用evict(Object object)和clear()清除缓存. hibernate二级缓存:sessionFactory缓存即进程级别缓存,由缓存插件实现,如OSCache,对hibernat

Hibernate的一级缓存

Hibernate的一级缓存其实就是Session内置的一个Map,用来缓存它操作过的实体对象,对象的主关键字ID是Map的key,实体对 象就是对应的值.所以,一级缓存是以实体对象为单位进行存储的,访问时也是以实体为单位的(直接访问属性是不能使用缓存的),并且要求使用主关键字ID来 进行访问. 一级缓存是由Session提供的,所以它只存在于Session的生命周期中,当程序调用 save(),update(),saveorupdate()等方法以及调用查询接口list,filter,iter

Hibernate的session一级缓存

一级缓存是Session周期的,当session创建的时候就有,当session结束的时候,缓存被清空 当缓存存在的时候,每次查询的数据,都会放在缓存中,如果再次查询相同的数据,则不会再次查询数据库,可以有效的减少数据库的访问量. 但是,session的生命周期很短,当session创建,进行数据库操作后,就会被关闭,同样的,缓存就会被清空.如果是在javaweb中,session的生命周期,就是浏览器向服务器的一次请求.所以,后面hibernate会有相应的二级缓存 操作缓存的几个方法介绍 一

Hibernate一级缓存和二级缓存深度比较

1.什么是缓存 缓存是介于应用程序和物理数据源之间,其作用是为了降低应用程序对物理数据源访问的频次,从而提高了应用的运行性能.缓存内的数据是对物理数据源中的数据的复制,应用程序在运行时从缓存读写数据,在特定的时刻或事件会同步缓存和物理数据源的数据. 缓存的介质一般是内存,所以读写速度很快.但如果缓存中存放的数据量非常大时,也会用硬盘作为缓存介质.缓存的实现不仅仅要考虑存储的介质,还要考虑到管理缓存的并发访问和缓存数据的生命周期. Hibernate的一级缓存是内置的,不能被卸载. Hiberna

Hibernate学习笔记(三) — Hibernate 的一级缓存意义

什么是缓存? 缓存说白了,就是应用程序向数据库要数据,然后把一些数据,临时的放在了内存的区域中,第二次再要数据的时候,直接从内存中拿即可. 缓存需要解决的事情: 1.能把数据放入缓存 2.能把数据从缓存中取出来 3.如果缓存中的数据发生变化,需要把数据同步到数据库中 4.把数据库中的数据同步到缓存中 5.hits命中率低的对象应该及时从缓存中移走 分布式缓存: 为什么会有分布式缓存? 应用程序运行在服务器上,并发访问时,服务器压力过大,分布式缓存就是来分担服务器压力的. 分布式缓存之间的数据是同