一级缓存
MyBatis的一级缓存是sqlSession级别的缓存,在同一个sqlSession中执行两次相同的sql语句时,会将第一次的执行查询的数据存入一级缓存中,第二次查询就会从缓存中获取数据,而不再用去数据库查询,从而提高了查询性能。但如果sqlSession执行insert,delete,update操作,并提交到数据库,或者sqlSession结束后,这个sqlSession中的一级缓存就不存在了。
下面通过实例演示下。
实例目录结构
UserInfoMapper.java:
package com.mybatis.mapper;
import org.apache.ibatis.annotations.Select;
import com.mybatis.pojo.UserInfo;
public interface UserInfoMapper {
@Select("select * from user_info where id = #{id}")
UserInfo findUserInfoById(int id);
}
MyBatisTest.java
package com.mybatis.test;
import java.io.IOException;
import java.io.InputStream;
import org.apache.ibatis.io.Resources;
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 com.mybatis.mapper.UserInfoMapper;
import com.mybatis.pojo.UserInfo;
public class MyBatisTest {
private SqlSessionFactory sqlSessionFactory;
private SqlSession sqlSession;
@Before
public void init() {
String resource = "mybatis-config.xml";
InputStream inputStream;
try {
inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
sqlSession = sqlSessionFactory.openSession();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//@Test
public void test1() {
UserInfoMapper uim = sqlSession.getMapper(UserInfoMapper.class);
UserInfo ui1 = uim.findUserInfoById(1);
System.out.println(ui1);
UserInfo ui2 = uim.findUserInfoById(1);
System.out.println(ui2);
}
@Test
public void test2() {
UserInfoMapper uim1 = sqlSession.getMapper(UserInfoMapper.class);
UserInfo ui1 = uim1.findUserInfoById(1);
System.out.println(ui1);
sqlSession.commit();
//关闭sqlSession,即关闭一级缓存
sqlSession.close();
//开启一个新的SqlSession
sqlSession = sqlSessionFactory.openSession();
UserInfoMapper uim2 = sqlSession.getMapper(UserInfoMapper.class);
UserInfo ui2 = uim2.findUserInfoById(1);
System.out.println(ui2);
}
@After
public void destory() {
sqlSession.commit();
sqlSession.close();
}
}
测试类中,test1()的执行结果如下:
可见,由于MyBatis开启了 一级缓存,所以,在第二次查询时,并没有发出select语句去数据库里查询,而是直接用了从一级缓存中获取数据。
而test2()的执行结果如下:
可以看出,关闭sqlSession后一级缓存会被清空,所以第二次查询时,一级缓存里查不到数据,发出了第二条select语句。