版权声明:禁止CV操作 https://blog.csdn.net/H44341466/article/details/84997721
虽然说Mybatis的一级缓存在spring中失效,二级缓存又是一个鸡肋,但是在我们没有第三方缓存的时候(Redis等...),有时候我们还想用一下缓存,来对简单的数据进行处理,这时候我们可能会用到二级缓存;下面来谈谈它的用法;
使用二级缓存在这个其实很简单,这里我是使用注解讲解(和spring有关的,我都习惯于使用注解,因为注解真的比xml方便呀)
来上代码,二级缓存使用只需要一个注解@CacheNamespace,它后面有个Namespace,什么意思呢,是说Mybatis的二级缓存是基于命名空间的;比如我有这样一个Mapper,使用二级缓存单纯的做查找工作没有什么问题;
表结构:
package com.mapper;
import org.apache.ibatis.annotations.CacheNamespace;
import org.apache.ibatis.annotations.Select;
import java.util.List;
import java.util.Map;
/**
* @author Ant
* @ClassName: CityMapper
* @Description: TODO
* @datetime 2018/10/24 11:52
* @Version 1.0
*/
//@Mapper
@CacheNamespace
public interface CityMapper {
@Select("select * from city where id = 1")
List<Map<String, Object>> query();
}
但是如果我有一个修改,我新建一个修改的Mapper1,来修改城市名称,由"Shenzhen"改成"Beijing"
package com.mapper;
import org.apache.ibatis.annotations.CacheNamespace;
import org.apache.ibatis.annotations.Update;
/**
* @author Ant
* @ClassName: CityMapper1
* @Description: TODO
* @datetime 2018/12/14 9:02
* @Version 1.0
*/
@CacheNamespace
public interface CityMapper1 {
@Update("update city set cityname = 'Beijing' where id = 1")
void update();
}
然后我分别调用查询,修改,查询,我们来看下结果:
public static void main(String[] args) {
// CityMapper mapper = (CityMapper) Proxy.newProxyInstance(MybatisTest.class.getClassLoader(), new Class[]{CityMapper.class}, new MyInvocationHandler());
// mapper.query();
AnnotationConfigApplicationContext act = new AnnotationConfigApplicationContext(AppConfig.class);
//第一次查询
CityService service = act.getBean(CityService.class);
service.query();
//修改
CityService service1 = act.getBean(CityService.class);
service1.update();
//第二次查询
CityService service2 = act.getBean(CityService.class);
service2.query();
}
来看下结果:
你会发现我已经把cityname有 ‘Shenzhen’改成 ‘Beijing’,但还是输出了两次北京,说明修改那次没有修改缓存;这个就是二级缓存的一个不好的地方(基于命名空间),怎么解决这个问题呢!?
package com.mapper;
import org.apache.ibatis.annotations.CacheNamespace;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;
import java.util.List;
import java.util.Map;
/**
* @author Ant
* @ClassName: CityMapper
* @Description: TODO
* @datetime 2018/10/24 11:52
* @Version 1.0
*/
//@Mapper
@CacheNamespace
public interface CityMapper {
@Select("select * from city where id = 1")
List<Map<String, Object>> query();
@Update("update city set cityname = 'Beijing' where id = 1")
void update();
}
只能把对同一个对象所有的操作语句放到同一个Mapper中,我们再来运行一次看下结果;
完美解决!!!
不过Mybatis基本上已经被弃用了,现在大多都是使用第三方缓存;