在昨天写过的文章中:SpringMVC + Spring-data-redis整合完整示例 ,进行改版,使用BaseDao的方式,将通用的方法进行统一管理
改版内容如下
第一步:删除了 RedisGeneratorDao.java
第二步:新增 RedisBaseDao.java 和 RedisBaseDaoImpl.java 实现类,(用到了Gson.jar)
第三步:更新 MemberDaoImpl.java
RedisBaseDao.java
/** * 设置一个Redis基类,根据泛型+反射整理,实现通用方法 * <br> * keyId代表Class类名全路径 + "_" + keyId 例如:key为id,那么到实现类中,就是 com.youcl.demo.User_id * <br> * 两个方法没有提供 * 一:没有提供修改方法,set中key相同替换相当于更新 * 二:没有提供添加集合方法,因为 T 不能确定某一个参数值,所以集合可以在自定义的dao中实现 * @param <T> */ public interface RedisBaseDao<T>{ /** * 根据keyId查询实体 * @param cls * @param keyId 以什么参数作为keyid * @return */ public T getEntityByKey(final Class<T> cls, final String keyId); /** * 新增实体 * @param entity * @param keyId */ public void addEntity(final T entity, final String keyId); /** * 根据keyId删除实体 * @param cls * @param keyId */ public void deleteEntityByKey(final Class<T> cls, final String keyId); }
RedisBaseDaoImpl.java
import java.io.Serializable; import javax.annotation.Resource; import org.springframework.dao.DataAccessException; import org.springframework.data.redis.connection.RedisConnection; import org.springframework.data.redis.core.RedisCallback; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.serializer.RedisSerializer; import org.springframework.util.Assert; import com.google.gson.Gson; /** * 实现Redis通用基类 * * @author http://www.youcl.com * @param <T> */ public class RedisBaseDaoImpl<T> implements RedisBaseDao<T> { @Resource protected RedisTemplate<Serializable, Serializable> redisTemplate; /** * 获取 RedisSerializer */ protected RedisSerializer<String> getStringSerializer() { return redisTemplate.getStringSerializer(); } @Override public T getEntityByKey(final Class<T> cls, String keyId) { return redisTemplate.execute(new RedisCallback<T>() { @Override public T doInRedis(RedisConnection connection) throws DataAccessException { byte[] key = getStringSerializer().serialize(cls.getName() + "_" + keyId); if (connection.exists(key)) { byte[] value = connection.get(key); String json = getStringSerializer().deserialize(value); return new Gson().fromJson(json, cls); } return null; } }); } @Override public void addEntity(final T entity, final String keyId) { Assert.notNull(entity); redisTemplate.execute(new RedisCallback<Object>() { @Override public Object doInRedis(RedisConnection connection) throws DataAccessException { byte[] key = getStringSerializer().serialize(entity.getClass().getName() + "_" + keyId); byte[] name = getStringSerializer().serialize(new Gson().toJson(entity)); connection.set(key,name); return null; } }); } @Override public void deleteEntityByKey(final Class<T> cls, String keyId) { redisTemplate.delete(cls.getName() + "_" + keyId); } }
MemberDaoImpl.java
import java.util.List; import org.springframework.dao.DataAccessException; import org.springframework.data.redis.connection.RedisConnection; import org.springframework.data.redis.core.RedisCallback; import org.springframework.stereotype.Repository; import org.springframework.util.Assert; import com.google.gson.Gson; import com.youcl.wechat.redis.dao.RedisBaseDaoImpl; @Repository(value = "memberDao") public class MemberDaoImpl extends RedisBaseDaoImpl<Member> implements MemberDao { /** * 添加对象 */ @Override public void add(final Member member) { addEntity(member, member.getId()); } /** * 添加集合 */ @Override public void add(final List<Member> list) { Assert.notEmpty(list); redisTemplate.execute(new RedisCallback<Object>() { @Override public Object doInRedis(RedisConnection connection) throws DataAccessException { for (Member m : list) { byte[] key = getStringSerializer().serialize(m.getClass().getName() + "_" + m.getId()); byte[] name = getStringSerializer().serialize(new Gson().toJson(m)); connection.set(key, name); } return null; } }); } /** * 删除对象 ,依赖key */ @Override public void delete(String keyId) { deleteEntityByKey(Member.class, keyId); } /** * 根据key获取对象 */ @Override public Member get(final String keyId) { return getEntityByKey(Member.class, keyId); } }
测试效果图同上一节博文内容:SpringMVC + Spring-data-redis整合完整示例
关于RedisConnection中set和get方法,如何设置过期等内容,请看持续关注下一篇文章