一级缓存和二级缓存:https://blog.csdn.net/Yang_Hui_Liang/article/details/88291752
mybatis其他:https://www.cnblogs.com/lingqin/p/10232548.html
缓存:存在内存的临时数据。
用了缓存就有缓存和数据库不同步得问题。
----------------------------------------------------------05----------------------------------------------------------------
一级缓存?
代码:G:\CODE_MY\heimabase\mybatis\04\day04_eesy_02cache
@Test
public void testFirstLevelCache(){
User user1 = userDao.findById(41);
System.out.println(user1);
// sqlSession.close();
//再次获取SqlSession对象
// sqlSession = factory.openSession();
sqlSession.clearCache();//此方法也可以清空缓存
userDao = sqlSession.getMapper(IUserDao.class);
User user2 = userDao.findById(41);
System.out.println(user2);
System.out.println(user1 == user2);
}
测试1:第一次是查询第二次是在缓存中取值。
测试2:
结果:
测试3:
----------------------------------06---------------------------------
/**
* 测试缓存的同步
*/
@Test
public void testClearlCache(){
//1.根据id查询用户
User user1 = userDao.findById(41);
System.out.println(user1);
//2.更新用户信息
user1.setUsername("update user clear cache");
user1.setAddress("北京市海淀区");
userDao.updateUser(user1);
//3.再次查询id为41的用户
User user2 = userDao.findById(41);
System.out.println(user2);
System.out.println(user1 == user2);
}
---------------------------------------------------------------------07-----------------------------------------------------------------
我们先看下自己定义的SqlSessionFactory和SqlSession
public class DefaultSqlSessionFactory implements SqlSessionFactory{
private Configuration cfg;
public DefaultSqlSessionFactory(Configuration cfg){
this.cfg = cfg;
}
/**
* 用于创建一个新的操作数据库对象
* @return
*/
public SqlSession openSession() {
return new DefaultSqlSession(cfg);
}
}
public class DefaultSqlSession implements SqlSession {
private Configuration cfg;
private Connection connection;
public DefaultSqlSession(Configuration cfg){
this.cfg = cfg;
connection = DataSourceUtil.getConnection(cfg);
}
/**
* 用于创建代理对象
* @param daoInterfaceClass dao的接口字节码
* @param <T>
* @return
*/
public <T> T getMapper(Class<T> daoInterfaceClass) {
return (T) Proxy.newProxyInstance(daoInterfaceClass.getClassLoader(),
new Class[]{daoInterfaceClass},new MapperProxy(cfg.getMappers(),connection));
}
/**
* 用于释放资源
*/
public void close() {
if(connection != null) {
try {
connection.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
代码演示:
第一步:
第二步:
第三步:
@Test
public void testFirstLevelCache(){
SqlSession sqlSession1 = factory.openSession();
IUserDao dao1 = sqlSession1.getMapper(IUserDao.class);
User user1 = dao1.findById(41);
System.out.println(user1);
sqlSession1.close();//一级缓存消失
SqlSession sqlSession2 = factory.openSession();
IUserDao dao2 = sqlSession2.getMapper(IUserDao.class);
User user2 = dao2.findById(41);
System.out.println(user2);
sqlSession2.close();
System.out.println(user1 == user2);
}
存的数据谁来了拿去填充自己的新对象,不是原来的老的了。
配置完了为什么打印还是false,是因为二级缓存存放的是数据不是对象。每次拿都创建一个新的对象。
----------------------------------08---------------------------------