mybatis缓存之一级缓存

mybatis缓存之一级缓存,第1张

概述一级缓存:与数据库同一次会话期间查询到的数据会放在本地缓存中,以后如果需要获取相同的数据,直接从缓存中拿,没必要再去查询数据库。 package com.gong.mybatis.test; impo

 

 

 一级缓存:与数据库同一次会话期间查询到的数据会放在本地缓存中,以后如果需要获取相同的数据,直接从缓存中拿,没必要再去查询数据库。

package com.gong.mybatis.test;import java.io.IOException; java.io.inputStream; java.util.ArrayList; java.util.Arrays; java.util.HashMap; java.util.List; java.util.Map; org.apache.ibatis.io.Resources; org.apache.ibatis.session.sqlSession; org.apache.ibatis.session.sqlSessionFactory; org.apache.ibatis.session.sqlSessionFactoryBuilder; org.junit.Test; com.gong.mybatis.bean.Department; com.gong.mybatis.bean.Employee; com.gong.mybatis.dao.EmployeeMapper; com.gong.mybatis.mapper.EmployeeMapperDynamicsql;public class TestMybatis4 {        public sqlSessionFactory getsqlSessionFactory() throws IOException {        String resource = "mybatis-config.xml";        inputStream is = Resources.getResourceAsstream(resource);        return new sqlSessionFactoryBuilder().build(is);    }    @Test    voID test()  IOException {        sqlSessionFactory sqlSessionFactory = getsqlSessionFactory();        sqlSession openSession = sqlSessionFactory.openSession();        try {            EmployeeMapper mapper = openSession.getMapper(EmployeeMapper.);            Employee em = mapper.getEmpByID(1);            System.out.println(em);            Employee em2 = mapper.getEmpByID(1);            System.out.println(em2);            System.out.println(em == em2);            openSession.commit();        } finally {            // Todo: handle finally clause            openSession.close();        }                    }    }

输出结果:

DEBUG 01-22 10:18:00,037 ==>  Preparing: select ID,last_name lastname,email,gender from tbl_employee where ID = ?   (BaseJdbcLogger.java:145) DEBUG 01-22 10:18:00,108 ==> Parameters: 1(Integer)  (BaseJdbcLogger.java:145) DEBUG 01-22 10:18:00,175 <==      Total: 1  (BaseJdbcLogger.java:145) Employee [ID=1,lastname=dema,1)">genderemail=dema@qq.com,1)">dept=null]Employee [IDtrue

说明:一级缓存的作用:在一次会话中,使用了相同的查询方法,所以系统只会发送一次sql请求,同时可以看到,em和em2是同一个对象,说明em2并不是重新发送sql请求得到的,而是直接从缓存中获得的。

一级缓存失效的四种情况:

1、使用不同的sqlSession对象

);            Employee em = mapper.getEmpByID(1);            System.out.println(em);                        sqlSession openSession2 = sqlSessionFactory.openSession();            EmployeeMapper mapper2 = openSession2.getMapper(EmployeeMapper.class);            Employee em2 = mapper2.getEmpByID(1);            System.out.println(em2);                        System.out.println(em == em2);            openSession.commit();        }             openSession.close();        }                            }    }

结果:

DEBUG 01-22 10:23:05,279 ==>  Preparing: select ID,gender from tbl_employee where ID = ?   (BaseJdbcLogger.java:145) DEBUG 01-22 10:23:05,323 ==> Parameters: 1(Integer)  (BaseJdbcLogger.java:145) DEBUG 01-22 10:23:05,367 ==>  Preparing: select ID,gender from tbl_employee where ID = ?   (BaseJdbcLogger.java:145) DEBUG 01-22 10:23:05,388 ==> Parameters: 1(Integer)  (BaseJdbcLogger.java:145) DEBUG 01-22 10:23:05,393 <==      Total: 1  (BaseJdbcLogger.java:145) Employee [IDfalse

2、同一个sqlSession对象,但查询条件不一样:

);            System.out.println(em);                        sqlSession openSession2 = sqlSessionFactory.openSession();            EmployeeMapper mapper2 = openSession2.getMapper(EmployeeMapper.class);            Employee em2 = mapper.getEmpByID(3            openSession.close();        }                            }    }

输出:

DEBUG 01-22 10:25:29,976 ==>  Preparing: select ID,gender from tbl_employee where ID = ?   (BaseJdbcLogger.java:145) DEBUG 01-22 10:25:30,021 ==> Parameters: 1(Integer)  (BaseJdbcLogger.java:145) DEBUG 01-22 10:25:30,086 DEBUG 01-22 10:25:30,088 (BaseJdbcLogger.java:145) DEBUG 01-22 10:25:30,093 Parameters: 3(Integer)  (BaseJdbcLogger.java:145) DEBUG 01-22 10:25:30,096 <=3,1)">=小红,1)">=0,1)">=xiaohong@qq.com,1)">false

3、同一个sqlSession,但在两次查询之间执行了增删改 *** 作

            EmployeeMapper mapper2 = openSession2.getMapper(EmployeeMapper.class);            mapper.deleteEmp(5);            Employee em2 = mapper.getEmpByID(1DEBUG 01-22 10:27:54,536 ==>  Preparing: select ID,gender from tbl_employee where ID = ?   (BaseJdbcLogger.java:145) DEBUG 01-22 10:27:54,586 ==> Parameters: 1(Integer)  (BaseJdbcLogger.java:145) DEBUG 01-22 10:27:54,636 Preparing: delete from tbl_employee where ID=?   (BaseJdbcLogger.java:145) DEBUG 01-22 10:27:54,640 Parameters: 5(Integer)  (BaseJdbcLogger.java:145) DEBUG 01-22 10:27:54,700 <==    Updates: 1  (BaseJdbcLogger.java:145) DEBUG 01-22 10:27:54,702 Parameters: 1(Integer)  (BaseJdbcLogger.java:145) DEBUG 01-22 10:27:54,712 <false

4、同一个sqlSession,但手动清除了一级缓存

即在两次查询之间使用了:

openSession.clearCache();
总结

以上是内存溢出为你收集整理的mybatis缓存之一级缓存全部内容,希望文章能够帮你解决mybatis缓存之一级缓存所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1218954.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-05
下一篇2022-06-05

发表评论

登录后才能评论

评论列表(0条)

    保存