mybatis的缓存机制
一级缓存:
MyBatis的一级缓存指的是在一个Session域内,session为关闭的时候执行的查询会根据SQL为key被缓存(跟mysql缓存一样,修改任何参数的值都会导致缓存失效)
package cn.itcast.mybatis.dao; import static org.junit.Assert.*; import java.io.IOException; import java.io.InputStream; import java.util.Date; import java.util.HashMap; import java.util.List; 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.Before; import org.junit.Test; import cn.itcast.mybatis.pojo.User; public class UserDAOTest2 { private static IUser userDAO = null; private static SqlSession sqlSession = null; @Before public void init() { try { // 构造SqlSessionFactory // 定义配置文件路径 String resource = "mybatis-config.xml"; // 读取配置文件 InputStream inputStream = Resources.getResourceAsStream(resource); // 通过SqlSessionFactoryBuilder构建一个SqlSessionFactory SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream,"test"); this.sqlSession = sqlSessionFactory.openSession(false);//设为false时,必须手动提交:sqlSession.commit(); // this.sqlSession.close(); this.userDAO = sqlSession.getMapper(IUser.class); } catch (IOException e) { e.printStackTrace(); } } static{ // 构造SqlSessionFactory // 定义配置文件路径 String resource = "mybatis-config.xml"; // 读取配置文件 InputStream inputStream; try { inputStream = Resources.getResourceAsStream(resource); // 通过SqlSessionFactoryBuilder构建一个SqlSessionFactory SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream,"test"); sqlSession = sqlSessionFactory.openSession(false);//设为false时,必须手动提交:sqlSession.commit(); // this.sqlSession.close();//当关闭的时候,在下面的方法中都会报错 userDAO = sqlSession.getMapper(IUser.class); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } @Test public void testQueryUserByUserName() { User user = this.userDAO.queryUserByUserName("zhangsan"); System.out.println(user); } @Test public void testQueryByTabkeName() { List <HashMap<String, Object>> list2= this.userDAO.queryByTabkeName("tb_order"); for (HashMap<String, Object> hashMap : list2) { System.out.println(hashMap); } } @Test public void testQueryUserByUserNameAndPassword() { HashMap<String, Object> map = new HashMap<String, Object>(); map.put("userName", "zhangsan"); map.put("password", "123456"); // User user = this.userDAO.queryUserByUserNameAndPassword(map); User user = this.userDAO.queryUserByUserNameAndPassword("zhangsan","123456"); System.out.println(user); } @Test public void testSaveUser() { User user = new User(); user.setAge(20); user.setBirthday(new Date()); user.setName("test_name_9"); user.setPassword("123456"); user.setSex(true); user.setUserName("test_username_9"); this.userDAO.saveUser(user); System.out.println(user); // 提交 this.sqlSession.commit(); } @Test public void testUpdateUser() { User user = new User(); user.setAge(20); user.setBirthday(new Date()); user.setName("test_name_1"); user.setPassword("123qwe"); user.setSex(true); user.setId(6L); this.userDAO.updateUser(user); this.sqlSession.commit(); } @Test public void testDeleteUserById() { this.userDAO.deleteUserById(6L); } }
二级缓存:
Mybatis的二级缓存的作用域是一个mapper的namespace,同一个namespace中查询sql可以从缓存中命中。
二级缓存是可以跨session的。
开启二级缓存:
在mapper.xml文件中加入 <cache /> 。
无为而治