Mybatis的一级和二级缓存
2018-11-07 15:10
155 查看
版权声明:本文为博主原创文章,版权归原作者小思所有,转载或者引用本文内容请注明来源及原作者 https://blog.csdn.net/zeal9s/article/details/83823869
作用域
一级缓存:session,当openSession()之后,如果执行相同的sql(相同的语句和参数),Mybatis不执行sql,而是从缓存中返回
二级缓存:mapper的一个namespace,同一个namespace中查询sql可以从缓存中获取,二级缓存可以跨session
一级缓存关闭:
package com.zs.test; import com.zs.dao.ProvinceDao; import com.zs.entity.Province; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import org.junit.After; import org.junit.Before; import org.junit.Test; import java.util.List; /** * @author 小思 * @PackageName:com.zs.test * @ClassName: TestOneToMany * @Description: * @date 2018/10/31 16:42 */ @SuppressWarnings("unused") public class TestOneToMany { SqlSessionFactory sessionFactory; SqlSession session; @Before public void before() { //从mybatis-config.xml mybatis的核心配置文件中获取SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(getClass().getClassLoader().getResourceAsStream("mybatis-config.xml")); //通过工厂获取SqlSession session = sessionFactory.openSession(); } @Test public void testProvince() { // 映射器是一个你创建来绑定你映射的语句的接口,调用合理描述参数和返回值的接口来获取相应的方法 ProvinceDao pd = session.getMapper(ProvinceDao.class); //查询所有的省份 List<Province> list = pd.getAllProvince(); for (Province p : list) { System.out.println(p.getPname()); } session.commit(); session.close(); System.out.println("-----------------------------------------------------------------------------------------"); //通过工厂获取SqlSession session = sessionFactory.openSession(); ProvinceDao pd2 = session.getMapper(ProvinceDao.class); //第二次查询所有的省份 List<Province> list2 = pd2.getAllProvince(); for (Province p : list2) { System.out.println(p.getPname()); } } @After public void after() { //提交session和关闭session(释放无用资源) // session.commit(); // session.close(); } }
两条同样的sql语句,控制台输出了两次语句
一级缓存开启:(session不关闭的情况下查询两次同样的sql)
TestOneToMany.java
package com.zs.test; import com.zs.dao.ProvinceDao; import com.zs.entity.Province; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import org.junit.After; import org.junit.Before; import org.junit.Test; import java.util.List; /** * @author 小思 * @PackageName:com.zs.test * @ClassName: TestOneToMany * @Description: * @date 2018/10/31 16:42 */ @SuppressWarnings("unused") public class TestOneToMany { SqlSessionFactory sessionFactory; SqlSession session; @Before public void before() { //从mybatis-config.xml mybatis的核心配置文件中获取SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(getClass().getClassLoader().getResourceAsStream("mybatis-config.xml")); //通过工厂获取SqlSession session = sessionFactory.openSession(); } @Test public void testProvince() { // 映射器是一个你创建来绑定你映射的语句的接口,调用合理描述参数和返回值的接口来获取相应的方法 ProvinceDao pd = session.getMapper(ProvinceDao.class); //查询所有的省份 List<Province> list = pd.getAllProvince(); for (Province p : list) { System.out.println(p.getPname()); } System.out.println("-------------------------------------------------"); //第二次查询所有的省份 List<Province> list2 = pd.getAllProvince(); for (Province p : list2) { System.out.println(p.getPname()); } } @After public void after() { //提交session和关闭session(释放无用资源) // session.commit(); // session.close(); } }
控制台输出,没有发送两句的sql语句,第二次查询是从缓存中获取的。
二级缓存关闭:
TestOneToMany.java(在同一个sqlSesssionFatory同时开启session,再关闭一次session在开启session)
package com.zs.test; import com.zs.dao.ProvinceDao; import com.zs.entity.Province; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import org.junit.After; import org.junit.Before; import org.junit.Test; import java.util.List; /** * @author 小思 * @PackageName:com.zs.test * @ClassName: TestOneToMany * @Description: * @date 2018/10/31 16:42 */ @SuppressWarnings("unused") public class TestOneToMany { SqlSessionFactory sessionFactory; SqlSession session; @Before public void before() { //从mybatis-config.xml mybatis的核心配置文件中获取SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(getClass().getClassLoader().getResourceAsStream("mybatis-config.xml")); //通过工厂获取SqlSession session = sessionFactory.openSession(); } @Test public void testProvince() { // 映射器是一个你创建来绑定你映射的语句的接口,调用合理描述参数和返回值的接口来获取相应的方法 ProvinceDao pd = session.getMapper(ProvinceDao.class); //查询所有的省份 List<Province> list = pd.getAllProvince(); for (Province p : list) { System.out.println(p.getPname()); } session.commit(); session.close(); System.out.println("-----------------------------------------------------------------------------------------"); //通过工厂获取SqlSession session = sessionFactory.openSession(); ProvinceDao pd2 = session.getMapper(ProvinceDao.class); //第二次查询所有的省份 List<Province> list2 = pd2.getAllProvince(); for (Province p : list2) { System.out.println(p.getPname()); } } @After public void after() { //提交session和关闭session(释放无用资源) // session.commit(); // session.close(); } }
二级缓存开启
(1)实体类的映射文件中开启二级缓存
(2)需要二级缓存的实体类实现序列化
TestOneToMany.java(在同一个sqlSesssionFatory同时开启session,再关闭一次session在开启session)
package com.zs.test; import com.zs.dao.ProvinceDao; import com.zs.entity.Province; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import org.junit.After; import org.junit.Before; import org.junit.Test; import java.util.List; /** * @author 小思 * @PackageName:com.zs.test * @ClassName: TestOneToMany * @Description: * @date 2018/10/31 16:42 */ @SuppressWarnings("unused") public class TestOneToMany { SqlSessionFactory sessionFactory; SqlSession session; @Before public void before() { //从mybatis-config.xml mybatis的核心配置文件中获取SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(getClass().getClassLoader().getResourceAsStream("mybatis-config.xml")); //通过工厂获取SqlSession session = sessionFactory.openSession(); } @Test public void testProvince() { // 映射器是一个你创建来绑定你映射的语句的接口,调用合理描述参数和返回值的接口来获取相应的方法 ProvinceDao pd = session.getMapper(ProvinceDao.class); //查询所有的省份 List<Province> list = pd.getAllProvince(); for (Province p : list) { System.out.println(p.getPname()); } session.commit(); session.close(); System.out.println("-----------------------------------------------------------------------------------------"); //通过工厂获取SqlSession session = sessionFactory.openSession(); ProvinceDao pd2 = session.getMapper(ProvinceDao.class); //第二次查询所有的省份 List<Province> list2 = pd2.getAllProvince(); for (Province p : list2) { System.out.println(p.getPname()); } } @After public void after() { //提交session和关闭session(释放无用资源) // session.commit(); // session.close(); } }
控制台只会输出一条sql语句
说在最后的话:编写实属不易,若喜欢或者对你有帮助记得点赞+关注或者收藏哦~
阅读更多相关文章推荐
- Mybatis一级和二级缓存
- Mybatis一级和二级缓存正确解答
- Mybatis一级、二级缓存
- mybatis--缓存(一级和二级缓存)
- 框架 day66 Mybatis(关联查询映射(1对1/多),延迟加载,一级/二级缓存,与spring整合,逆向工程)
- mybatis中一级缓存和二级缓存的简单介绍
- Mybatis一级、二级缓存
- Mybatis一级、二级缓存
- 关于Mybatis关闭一级二级缓存
- MyBatis 一级、二级缓存
- Mybatis一级、二级缓存
- mybatis 一级 二级缓存的使用
- Mybatis的一级和二级缓存
- Mybatis(五) 延迟加载和缓存机制(一级二级缓存)
- MyBatis 一级和二级缓存
- mybatis--缓存(一级和二级缓存)
- Mybatis一级、二级缓存
- (三)事务:Mybatis的一级和二级缓存
- Mybatis一级、二级缓存
- mybatis 的一级,二级缓存