- 将Redis缓存进行简单封装,新的方式可以很方便的对列表对象进行序列化,在数据存取的时候使用json格式进行转换. 这里使用分钟作为单位来设定数据在Redis中保存的时间.
这里为了对比,新增了一个实体类Book,之前的的缓存在User
- 增加了druid为数据库连接池以及连接池控制台 说明
- 开发环境:Win7
- ide:Intellij 2017.2
- jdk:1.8
- Spring-Boot:1.5.3.RELEASE
- Redis:3.2.9
- Mysql:5.7
pom.xml中已经引入了spring-boot-starter-data-redis库,所以Spring Boot会帮我们自动加载Redis的连接, 具体的配置类org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration。通过该配置类, 我们可以发现底层默认使用Jedis库,并且提供了开箱即用的redisTemplate和stringTemplate。
Mybatis的二级缓存可以自动地对数据库的查询做缓存,并且可以在更新数据时同时自动地更新缓存。
实现Mybatis的二级缓存很简单,只需要新建一个类实现org.apache.ibatis.cache.Cache接口即可。
该接口共有以下五个方法:
- String getId():mybatis缓存操作对象的标识符。一个mapper对应一个mybatis的缓存操作对象。
- void putObject(Object key, Object value):将查询结果塞入缓存。
- Object getObject(Object key):从缓存中获取被缓存的查询结果。
- Object removeObject(Object key):从缓存中删除对应的key、value。只有在回滚时触发。 一般我们也可以不用实现,具体使用方式请参考:org.apache.ibatis.cache.decorators.TransactionalCache。
- void clear():发生更新时,清除缓存。
- int getSize():可选实现。返回缓存的数量。
- ReadWriteLock getReadWriteLock():可选实现。用于实现原子性的缓存操作。
<!-- 开启基于redis的二级缓存 -->
<cache type="cn.rivamed.springbootmybatiswithredis.util.RedisCache"/>
logging:
level:
cn.rivamed.springbootmybatiswithredis.dao.mapper: TRACE
这里我们使用的是 Cache Aside 策略,从三个维度:(摘自 耗子叔叔博客) 失效:应用程序先从cache取数据,没有得到,则从数据库中取数据,成功后,放到缓存中。 命中:应用程序从cache中取数据,取到后返回。 更新:先把数据存到数据库中,成功后,再让缓存失效。 大致流程如下: 获取商品详情举例 a. 从商品 Cache 中获取商品详情,如果存在,则返回获取 Cache 数据返回。 b. 如果不存在,则从商品 DB 中获取。获取成功后,将数据存到 Cache 中。则下次获取商品详情,就可以从 Cache 就可以得到商品详情数据。 c. 从商品 DB 中更新或者删除商品详情成功后,则从缓存中删除对应商品的详情缓存
<!--配置一个resultMap 指定返回的类型 -->
<resultMap id="departMent" type="Department">
<id column="dp_id" property="dp_id" />
<result column="dp_name" property="dp_name" />
<result column="cost_center" property="cost_center" />
</resultMap>
<!-- 返回一个list的写法 ,这里是resultMap 不是resultType-->
<select id="queryAllDepartment" resultMap="departMent" >
select * from t_department
</select>
不懂的都可以在这里面找到,有问题第一时间到这个里面找
demo:
package cn.yy.dao;
@Mapper
public interface UserDao {
@SelectProvider(type=UserDao .class,method="selectPersonLike")
public List<Person> selectPerson(String id,String firstName,String lastName);
public String selectPersonLike(final String id, final String firstName, final String lastName) {
return new SQL() {{
SELECT("P.ID, P.USERNAME, P.PASSWORD, P.FIRST_NAME, P.LAST_NAME");
FROM("PERSON P");
if (id != null) {
WHERE("P.ID like #{id}");
}
if (firstName != null) {
WHERE("P.FIRST_NAME like #{firstName}");
}
if (lastName != null) {
WHERE("P.LAST_NAME like #{lastName}");
}
ORDER_BY("P.LAST_NAME");
}}.toString();
}
}