Mybatis一级缓存(SqlSession,Mybatis默认开启)
一级缓存图解
测试代码
1)查询过程中没有对数据库进行操作
package com.xieli.liu;
import com.xieli.liu.dao.UserInfoMapper;
import com.xieli.liu.pojo.Role;
import com.xieli.liu.pojo.UserInfo;
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.Test;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
/**
* Created by Administrator on 2019-11-20.
*/
public class test {
@Test
public void test() {
SqlSessionFactory sessionFactory;
//使用MyBatis提供的Resources类加载mybatis的配置文件
try {
InputStream resourceAsStream = Resources.getResourceAsStream("config/sqlMapConfig.xml");
//构建sqlSession的工厂
sessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
SqlSession sqlSession = sessionFactory.openSession();
SqlSession sqlSession2 = sessionFactory.openSession();
SqlSession sqlSession3 = sessionFactory.openSession();
//发起第一次查询
UserInfoMapper mapper = sqlSession.getMapper(UserInfoMapper.class);
List<UserInfo> userInfos = mapper.selectAll();
for (UserInfo userInfo: userInfos) {
System.out.println(userInfo.getUserName());
}
System.out.println("第一次查询结果打印结束-------------------------------------------------------------");
List<UserInfo> userInfos2 = mapper.selectAll();
for (UserInfo userInfo: userInfos2) {
System.out.println(userInfo.getUserName());
}
//写入二级缓存
sqlSession.close();
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
}
2)查询过程中对数据库进行操作
package com.xieli.liu;
import com.xieli.liu.dao.UserInfoMapper;
import com.xieli.liu.pojo.Role;
import com.xieli.liu.pojo.UserInfo;
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.Test;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
/**
* Created by Administrator on 2019-11-20.
*/
public class test {
@Test
public void test() {
SqlSessionFactory sessionFactory;
//使用MyBatis提供的Resources类加载mybatis的配置文件
try {
InputStream resourceAsStream = Resources.getResourceAsStream("config/sqlMapConfig.xml");
//构建sqlSession的工厂
sessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
SqlSession sqlSession = sessionFactory.openSession();
SqlSession sqlSession2 = sessionFactory.openSession();
SqlSession sqlSession3 = sessionFactory.openSession();
//发起第一次查询
UserInfoMapper mapper = sqlSession.getMapper(UserInfoMapper.class);
List<UserInfo> userInfos = mapper.selectAll();
for (UserInfo userInfo: userInfos) {
System.out.println(userInfo.getUserName());
}
System.out.println("对数据进行操作。。。。。。。。。。。。。。。。。。。。");
UserInfo userInfo2=new UserInfo();
userInfo2.setUserState("1");
mapper.updateStatics(userInfo2);
System.out.println("第二次查询结果打印开始-------------------------------------------------------------");
List<UserInfo> userInfos2 = mapper.selectAll();
for (UserInfo userInfo: userInfos2) {
System.out.println(userInfo.getUserName());
}
//写入二级缓存
sqlSession.close();
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
}
总结:
1)Mybatis自动开启
2)同一SqlSession下查询相同的SQL时,第一次查询执行SQL并放入SqlSession缓存,第二次以后直接从缓存取,不再执行SQL
3)如果存在对数据库commit操作,SqlSession会清空,下次读取时重新执行SQL
4)在spring中执行两次service调用相同的SQL,不走一级缓存(弊端)