MyBatis二级缓存使用以及MyBatis-Plus整合(SpringBoot版)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/madonghyu/article/details/81672843

MyBatis-Plus整合

1.添加springboot的MP依赖

        <!-- springboot的mybatis-plus所需的依赖 -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>${mybatis-plus.version}</version>
        </dependency>

2.SpringBoot配置文件中MP配置,经过测试,只需配置mybatis-plus即可,如果原来项目存在mybatis,也只需要配置mybatis-plus

mybatis-plus:
  configuration:
    cache-enabled: true
    map-underscore-to-camel-case: true
  mapper-locations: classpath:mapper/*.xml
  type-aliases-package: com.zsy.domain

3.MP使用
首先在数据库建完表后,新建对应的JavaBean类
样例

//这些注解的具体参数这里就不一一列举,用到的话可以直接去源码查看,有中文注释
//表名
@TableName("carousel")
public class Carousel implements Serializable {

    //主键,自动增长
    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;
    @TableField("content")
    private String content;
    @TableField("url")
    private String url;

    public Carousel() {}

    public Carousel(String content,String url) {
        this.content = content;
        this.url = url;
    }

}

接下来新建一个mapper类以及对应的mapper.xml
样例
CarouselMapper.class

@Repository
//继承BaseMapper接口即可,里面包含了数据库操作的常用操作,具体也可以看源码
public interface CarouselMapper extends BaseMapper<Carousel> {

}

CarouselMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.zsy.mapper.CarouselMapper">

</mapper>

最后只要在service层导入mapprt接口即可。


MyBatis二级缓存使用

注意点:
mybatis-plus 版本必须要低于2.0.9才可以使用二级缓存
mybatis-plus 版本必须要低于2.0.9才可以使用二级缓存
mybatis-plus 版本必须要低于2.0.9才可以使用二级缓存
否则由MP生成接口就算配置了二级缓存也没有用。
Mybatis的二级缓存实现也十分简单,只要在springboot的配置文件打开二级缓存,即

mybatis-plus:
  configuration:
    cache-enabled: true

接下来实现缓存接口
样例

public class MybatisRedisCache implements Cache {


    // 读写锁
    private final ReadWriteLock readWriteLock = new ReentrantReadWriteLock(true);

    //这里使用了redis缓存,使用springboot自动注入
    @Autowired
    private RedisTemplate<String, Object> redisTemplate;

    private String id;

    public MybatisRedisCache(final String id) {
        if (id == null) {
            throw new IllegalArgumentException("Cache instances require an ID");
        }
        this.id = id;
    }

    @Override
    public String getId() {
        return this.id;
    }

    @Override
    public void putObject(Object key, Object value) {
        if (redisTemplate == null) {
        //由于启动期间注入失败,只能运行期间注入,这段代码可以删除
            redisTemplate = (RedisTemplate<String, Object>) ApplicationContextRegister.getApplicationContext().getBean("RedisTemplate");
        }
        if (value != null) {
            redisTemplate.opsForValue().set(key.toString(), value);
        }
    }

    @Override
    public Object getObject(Object key) {
        try {
            if (key != null) {
                return redisTemplate.opsForValue().get(key.toString());
            }
        } catch (Exception e) {
            log.error("缓存出错 ");
        }
        return null;
    }

    @Override
    public Object removeObject(Object key) {
        if (key != null) {
            redisTemplate.delete(key.toString());
        }
        return null;
    }

    @Override
    public void clear() {
        log.debug("清空缓存");
        if (redisTemplate == null) {
            redisTemplate = (RedisTemplate<String, Object>) ApplicationContextRegister.getApplicationContext().getBean("functionDomainRedisTemplate");
        }
        Set<String> keys = redisTemplate.keys("*:" + this.id + "*");
        if (!CollectionUtils.isEmpty(keys)) {
            redisTemplate.delete(keys);
        }
    }

    @Override
    public int getSize() {
        Long size = redisTemplate.execute((RedisCallback<Long>) RedisServerCommands::dbSize);
        return size.intValue();
    }

    @Override
    public ReadWriteLock getReadWriteLock() {
        return this.readWriteLock;
    }
}

最后在mapper.xml文件配置缓存接口就可以了

    <cache type="com.zsy.cache.MybatisRedisCache">
        <property name="eviction" value="LRU" />
        <property name="flushInterval" value="6000000" />
        <property name="size" value="1024" />
        <property name="readOnly" value="false" />
    </cache>

猜你喜欢

转载自blog.csdn.net/madonghyu/article/details/81672843