一级缓存:
一级缓存是基于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>