MyBatis-Plus整合
- 添加springboot的MP依赖
<!-- springboot的mybatis-plus所需的依赖 -->
<!-- <mybatis-plus.version>3.0.5</mybatis-plus.version> -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>${mybatis-plus.version}</version>
</dependency>
- 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
- 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层使用mapper接口即可。
MyBatis二级缓存使用
- 注意点:
mybatis-plus 版本必须要低于2.0.9才可以使用二级缓存,否则由MP生成接口就算配置了二级缓存也没有用。- 但是最新的3.x版本,实现二级缓存的配置也有了一些改变。
- 建议在service使用缓存,不过如果要缓存的数据不需要service层处理的话,也可以直接在mapper层缓存,这里MP的二级缓存就是直接在Mapper层进行缓存的,个人觉得主要的优点就是方便省事吧。。。
- 下面介绍3.x的配置方法
- 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文件声明缓存,这里3.x只需要这样配置
<?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">
<cache-ref namespace="com.zsy.mapper.CarouselMapper"/>
</mapper>
- Mapper接口使用注解
@Repository
@CacheNamespace(implementation=MybatisRedisCache.class,eviction=MybatisRedisCache.class)
public interface CarouselMapper extends BaseMapper<Carousel> {}