您的位置:首页 > 其它

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语句

说在最后的话:编写实属不易,若喜欢或者对你有帮助记得点赞+关注或者收藏哦~

阅读更多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: