Mybatis二级缓存注意事项

    虽然说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基本上已经被弃用了,现在大多都是使用第三方缓存;

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值