MyBatis 一级缓存,二级缓存

来源:互联网 发布:python explode 编辑:程序博客网 时间:2024/05/01 20:44

  一级缓存:   

一级缓存是基于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查询 一级缓存存在性的证明@Testpublic 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查询 增删改对一级缓存的影响@Testpublic 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>
原创粉丝点击