MyBatis 一级缓存,二级缓存

  一级缓存:   

一级缓存是基于PerpetualCache(MyBatis自带)的HashMap本地缓存,作用范围为session域内,当session  flush或者close之后,该session中所有的cache就会被清空。

   二级缓存:

二级缓存就是global  caching,它超出session范围之外,可以被所有SqlSession共享,开启它只需要在MyBatis的核心配置文件(mybatis-config.xml)settings中设置即可。

二级缓存的配置:

(1) MyBatis的全局cache配置,需要在mybatis-config.xml的settings中设置,代码如下:


Student类:
private  Integer  sid;
private  String sname;

Teacher类:
private  Integer tid;
private  String  tname;
private List<Student> tudent=new ArrayList<Student>();
先将以上的实体类进行封装。


然后续写以下的接口并写出一个实现方法:
public interface TeacherDao {
        //书写一个根据 老师编号  获取 所教的学生集合
    public Teacher getstudentteacherid(int tid);  //多对多sql

}
 
然后就该在小配置中SQL语句了
<?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.TeacherDao">
      <resultMap id="teachermapper" type="Teacher">
          <id column="tid" property="tid"></id>
          <result column="tname" property="tname"></result>
    <collection property="tudent" ofType="Student">
        <id column="sid" property="sid"></id>
        <result column="sname" property="sname"></result>
    </collection>
      </resultMap>

    <select id="getstudentteacherid" resultMap="teachermapper">
        select student.sid,sname,teacher.tid,tname
        from student,teacher_student,teacher
        where student.sid=teacher_student.sid
        and teacher.tid=teacher_student.sid
        AND  teacher.tid=#{tid}
    </select>


</mapper>

之后就又到了测试类了噢
package cn.bdqn.test;

import cn.bdqn.dao.TeacherDao;
import cn.bdqn.entity.Student;
import cn.bdqn.entity.Teacher;
import cn.bdqn.util.Userinfoutil;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;

import java.io.IOException;

/**
 * Created by java on 2017/7/16.
 */
public class TeacherTest {
    //多对多
    @Test
    public  void  testteacher() throws IOException {
        Userinfoutil  u=new Userinfoutil();
        SqlSession  session=u.sqls();
        TeacherDao  dao=session.getMapper(TeacherDao.class);
        Teacher  teacher=dao.getstudentteacherid(1);
        System.out.println(teacher.getTname());
        for (Student stu:teacher.getTudent()) {
            System.out.println(stu.getSname());
        }
    }
}

   那么多对多的测试结束之后,就来到了重点的一二级缓存了
   首先写一个实现方法,我们就按照ID来进行查询。
      
  public   StudentINfo  stud(int  id);//根据id查询
  
  之后在小配置中书写SQL语句
    
    <!--  根据id查询-->

  <select id="stud" resultType="StudentINfo">
      select *  from studentinfo where stuId=#{stuId}
  </select>
      
      
//根据id查询 一级缓存存在性的证明
@Test
public void fout() {
    String path = "userinfo-config.xml";
    InputStream inputStream = null;
    try {
        inputStream = Resources.getResourceAsStream(path);
        SqlSessionFactory ss = new SqlSessionFactoryBuilder().build(inputStream);
        SqlSession session = ss.openSession();
        StudentINfo stu = session.selectOne("stud", 3);
        System.out.println(stu.getStuName());
        System.out.println("1====================================1");
        StudentINfo stu2 = session.selectOne("stud", 3);
        System.out.println(stu2.getStuName());
        session.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
} 
//根据id查询 增删改对一级缓存的影响
@Test
public void four() {
    String path = "userinfo-config.xml";
    InputStream inputStream = null;
    try {
        inputStream = Resources.getResourceAsStream(path);
        SqlSessionFactory ss = new SqlSessionFactoryBuilder().build(inputStream);
        SqlSession session = ss.openSession();
        StudentINfoDao  dent=session.getMapper(StudentINfoDao.class);
        StudentINfo stu = session.selectOne("stud", 3);
        System.out.println(stu.getStuName());

        StudentINfo  s=new StudentINfo();
        s.setStuAge(23);
        s.setStuName("轩轩");
        s.setStuDate(new Date());
         dent.add(s);

        System.out.println("1====================================1");
        StudentINfo stu2 = session.selectOne("stud", 3);
        System.out.println(stu2.getStuName());
        session.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

    @Test  //二级缓存
    public void Sendfive() throws IOException {
        SqlSession session=Userinfoutil.sqls();
            StudentINfoDao  stu=session.getMapper(StudentINfoDao.class);
            StudentINfo stu1=stu.stud(3);
        System.out.println(stu1.getStuName());
        session.close();
        System.out.println("2==============================================2");
        SqlSession  session1=Userinfoutil.sqls();
        StudentINfoDao  stt=session1.getMapper(StudentINfoDao.class);

        StudentINfo  stu2=stt.stud(3);
        System.out.println(stu2.getStuName());
    }
}

二级缓存的关闭:
   
<settings>
    <setting name="cacheEnabled" value="false"/>  //全局关闭
</settings>

 在mapper文件配置支持cache后,局部关闭:
    
<select id="stud" resultType="StudentINfo"  useCache=""false >
    ......
 </select>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值