Mybatis二级缓存注意事项

版权声明:禁止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基本上已经被弃用了,现在大多都是使用第三方缓存;

猜你喜欢

转载自blog.csdn.net/H44341466/article/details/84997721