作用域
一级缓存: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语句
说在最后的话:编写实属不易,若喜欢或者对你有帮助记得点赞+关注或者收藏哦~