基于这段时间折腾redis遇到了各种问题,想着整理一下。本文主要介绍基于Spring+Mybatis以注解的形式整合Redis。废话少说,进入正题。
首先准备Redis,我下的是Windows版,下载后直接启动redis-server就行了,见下图:
一,先上jar包
二,创建实体类
package com.sl.user.vo;import java.io.Serializable;import com.fasterxml.jackson.databind.PropertyNamingStrategy;import com.fasterxml.jackson.databind.annotation.JsonNaming;import com.fasterxml.jackson.databind.annotation.JsonSerialize;@JsonSerialize @JsonNaming(PropertyNamingStrategy.LowerCaseWithUnderscoresStrategy.class) public class UserVO implements Serializable{private static final long serialVersionUID = 1L;private int id;private String username;private String password;private int age;public UserVO(){super(); }public UserVO(int id, String username, String password, int age) {super();this.id = id;this.username = username;this.password = password;this.age = age;}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic String toString() {return "UserVO [id=" + id + ", username=" + username + ", password="+ password + ", age=" + age + "]";}}
三,dao接口
package com.sl.user.dao;import com.sl.user.vo.UserVO;public interface UserDao {public void addUser(UserVO user);public void deleteUser(UserVO user);public void updateUser(UserVO user);public UserVO getUserById(int id);public UserVO getUser(int id);}
四,UserMapper
<?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.sl.user.dao.UserDao" ><resultMap id="userResult" type="User"><result column="id" property="id"/><result column="userame" property="userame"/><result column="password" property="password"/><result column="age" property="age"/></resultMap><insert id="addUser" parameterType="User">insert into t_user(username,password,age) values(#{username},#{password},#{age})</insert><update id="deleteUser" parameterType="User">delete * from t_user where id = #{id}</update><update id="updateUser" parameterType="User">update t_user set<if test="username != null and username != ''"> username = #{username},</if><if test="password != null and password != ''"> password = #{password},</if><if test="age != null and age != ''"> age = #{age}</if>where 1=1<if test="id != null and id != ''">and id = #{id}</if></update><select id="getUser" parameterType="int" resultType="User" >select * from t_user where id = #{id}</select><select id="getUserById" parameterType="int" resultType="java.lang.String" >select username from t_user where id = #{id}</select></mapper>
五,Service接口
package com.sl.user.service;import com.sl.user.vo.UserVO;public interface UserService {public void addUser(UserVO user);public void deleteUser(UserVO user);public void updateUser(UserVO user);public UserVO getUserById(int id);public UserVO getUser(int id);}
六,Service实现
package com.sl.user.service.impl;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.cache.annotation.CacheEvict;import org.springframework.cache.annotation.Cacheable;import org.springframework.stereotype.Service;import org.springframework.transaction.annotation.Propagation;import org.springframework.transaction.annotation.Transactional;import com.sl.user.dao.UserDao;import com.sl.user.service.UserService;import com.sl.user.vo.UserVO;@Service("userService")@Transactional(propagation=Propagation.REQUIRED, rollbackFor=Exception.class) public class UserServiceImpl implements UserService{@Autowiredprivate UserDao userDao;@Override@CacheEvict(value="User",key="addUser",allEntries=true) public void addUser(UserVO user) {userDao.addUser(user);}@Override@CacheEvict(value = {"getUser", "getUserById"}, allEntries = true) public void deleteUser(UserVO user) {userDao.deleteUser(user);}@Override@CacheEvict(value = {"getUser", "getUserById"}, allEntries = true) public void updateUser(UserVO user) {userDao.updateUser(user);}@Override@Cacheable(value="User",key="getUserById")public UserVO getUserById(int id) {return userDao.getUserById(id);}@Override@Cacheable(value="User",key="'getUser'")public UserVO getUser(int id) {return userDao.getUser(id);}}
七,Ctrl层
package com.sl.user.web;import java.util.HashMap;import java.util.Map;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.ResponseBody;import com.sl.user.service.UserService;import com.sl.user.vo.UserVO;@Controller@RequestMapping("/userCtrl")public class UserCtrl {@Autowiredprivate UserService userService;@RequestMapping("/addUser")public void addUser(UserVO user){userService.addUser(user);}@RequestMapping("/deleteUser")public void deleteUser(UserVO user){userService.deleteUser(user);}@RequestMapping("/updateUser")public void updateUser(UserVO user){userService.updateUser(user);}@ResponseBody@RequestMapping("/getUserById")public Map<String,Object> getUserById(UserVO user){Map<String,Object> map = new HashMap<String,Object>();map.put("msg",userService.getUserById(4));return map;}@ResponseBody@RequestMapping("/getUser")public Map<String,Object> getUser(UserVO vo){Map<String,Object> map = new HashMap<String,Object>();Object user = userService.getUser(4);map.put("msg",user.toString());return map;}}
八,Redis关键类,用于CRUD操作
package com.sl.user.redis;import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import org.springframework.cache.Cache; import org.springframework.cache.support.SimpleValueWrapper; 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;public class RedisUtil implements Cache{private RedisTemplate<String, Object> redisTemplate; private String name; public RedisTemplate<String, Object> getRedisTemplate() { return redisTemplate; } public void setRedisTemplate(RedisTemplate<String, Object> redisTemplate) { this.redisTemplate = redisTemplate; } public void setName(String name) { this.name = name; } @Override public String getName() { return this.name; } @Override public Object getNativeCache() { return this.redisTemplate; } /*** 从缓存中获取key*/@Override public ValueWrapper get(Object key) { System.out.println("get key"); final String keyf = key.toString(); Object object = null; object = redisTemplate.execute(new RedisCallback<Object>() { public Object doInRedis(RedisConnection connection) throws DataAccessException { byte[] key = keyf.getBytes(); byte[] value = connection.get(key); if (value == null) { return null; } return toObject(value); } }); return (object != null ? new SimpleValueWrapper(object) : null); } /*** 将一个新的key保存到缓存中* 先拿到需要缓存key名称和对象,然后将其转成ByteArray*/@Override public void put(Object key, Object value) { System.out.println("put key"); final String keyf = key.toString(); final Object valuef = value; final long liveTime = 86400; redisTemplate.execute(new RedisCallback<Long>() { public Long doInRedis(RedisConnection connection) throws DataAccessException { byte[] keyb = keyf.getBytes(); byte[] valueb = toByteArray(valuef); connection.set(keyb, valueb); if (liveTime > 0) { connection.expire(keyb, liveTime); } return 1L; } }); } private byte[] toByteArray(Object obj) { byte[] bytes = null; ByteArrayOutputStream bos = new ByteArrayOutputStream(); try { ObjectOutputStream oos = new ObjectOutputStream(bos); oos.writeObject(obj); oos.flush(); bytes = bos.toByteArray(); oos.close(); bos.close(); }catch (IOException ex) { ex.printStackTrace(); } return bytes; } private Object toObject(byte[] bytes) { Object obj = null; try { ByteArrayInputStream bis = new ByteArrayInputStream(bytes); ObjectInputStream ois = new ObjectInputStream(bis); obj = ois.readObject(); ois.close(); bis.close(); } catch (IOException ex) { ex.printStackTrace(); } catch (ClassNotFoundException ex) { ex.printStackTrace(); } return obj; } /*** 删除key*/@Override public void evict(Object key) { System.out.println("del key"); final String keyf = key.toString(); redisTemplate.execute(new RedisCallback<Long>() { public Long doInRedis(RedisConnection connection) throws DataAccessException { return connection.del(keyf.getBytes()); } }); } /*** 清空key*/@Override public void clear() { System.out.println("clear key"); redisTemplate.execute(new RedisCallback<String>() { public String doInRedis(RedisConnection connection) throws DataAccessException { connection.flushDb(); return "ok"; } }); } @Override public <T> T get(Object key, Class<T> type) { return null; } @Override public ValueWrapper putIfAbsent(Object key, Object value) { return null; } }
九,Spring整合mybatis和redis配置文件
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://e-file-list></web-app>
十四,测试,已查询为例(getUser()方法),jsp测试页面整的比较丑就不贴出来了,自己写一个吧。。。
查询前:
执行第一次查询:
执行第二次查询操作:
上图可见,没有再执行sql,直接从redis中获取数据。
以上所述是小编给大家介绍的Spring与Mybatis基于注解整合Redis的方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!