你的位置:首页 > 数据库

[数据库]Spring+Mybatis基于注解整合Redis


  基于这段时间折腾redis遇到了各种问题,想着整理一下。本文主要介绍基于Spring+Mybatis以注解的形式整合Redis。废话少说,进入正题。

  首先准备Redis,我下的是Windows版,下载后直接启动redis-server就行了,见下图:

  

一,先上jar包

  

二,创建实体类     

 1 package com.sl.user.vo; 2  3 import java.io.Serializable; 4  5 import com.faster 6 import com.faster 7 import com.faster 8  9 @JsonSerialize 10 @JsonNaming(PropertyNamingStrategy.LowerCaseWithUnderscoresStrategy.class) 11 public class UserVO implements Serializable{12 13   private static final long serialVersionUID = 1L;14   15   private int id;16   private String username;17   private String password;18   private int age;19   20   public UserVO(){21     super(); 22   }23   24   public UserVO(int id, String username, String password, int age) {25     super();26     this.id = id;27     this.username = username;28     this.password = password;29     this.age = age;30   }31 32   public int getId() {33     return id;34   }35 36   public void setId(int id) {37     this.id = id;38   }39 40   public String getUsername() {41     return username;42   }43 44   public void setUsername(String username) {45     this.username = username;46   }47 48   public String getPassword() {49     return password;50   }51 52   public void setPassword(String password) {53     this.password = password;54   }55 56   public int getAge() {57     return age;58   }59 60   public void setAge(int age) {61     this.age = age;62   }63 64   @Override65   public String toString() {66     return "UserVO [id=" + id + ", username=" + username + ", password="67         + password + ", age=" + age + "]";68   }69 70 }

三,dao接口

 1 package com.sl.user.dao; 2  3 import com.sl.user.vo.UserVO; 4  5 public interface UserDao { 6    7   public void addUser(UserVO user); 8    9   public void deleteUser(UserVO user);10   11   public void updateUser(UserVO user);12   13   public UserVO getUserById(int id);14   15   public UserVO getUser(int id);16   17 }

四,UserMapper

 1 <? 2 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >  3 <mapper namespace="com.sl.user.dao.UserDao" > 4    5   <resultMap id="userResult" type="User"> 6     <result column="id" property="id"/> 7     <result column="userame" property="userame"/> 8     <result column="password" property="password"/> 9     <result column="age" property="age"/>10   </resultMap>11   12   <insert id="addUser" parameterType="User">13     insert into t_user(username,password,age) values(#{username},#{password},#{age})14   </insert>15   16   <update id="deleteUser" parameterType="User">17     delete * from t_user where id = #{id}18   </update>19   20   <update id="updateUser" parameterType="User">21     update t_user set22     <if test="username != null and username != ''"> username = #{username},</if>23     <if test="password != null and password != ''"> password = #{password},</if>24     <if test="age != null and age != ''"> age = #{age}</if>25     where 1=126     <if test="id != null and id != ''">and id = #{id}</if>27     28   </update>29   30   <select id="getUser" parameterType="int" resultType="User" >31     select * from t_user where id = #{id}32   </select>33   34   <select id="getUserById" parameterType="int" resultType="java.lang.String" >35     select username from t_user where id = #{id}36   </select>37   38 </mapper> 

五,Service接口

 1 package com.sl.user.service; 2  3 import com.sl.user.vo.UserVO; 4  5   public interface UserService { 6    7     public void addUser(UserVO user); 8      9     public void deleteUser(UserVO user);10     11     public void updateUser(UserVO user);12     13     public UserVO getUserById(int id);14     15     public UserVO getUser(int id);16   17 }

六,Service实现

 1 package com.sl.user.service.impl; 2  3 import org.springframework.beans.factory.annotation.Autowired; 4 import org.springframework.cache.annotation.CacheEvict; 5 import org.springframework.cache.annotation.Cacheable; 6 import org.springframework.stereotype.Service; 7 import org.springframework.transaction.annotation.Propagation; 8 import org.springframework.transaction.annotation.Transactional; 9 10 import com.sl.user.dao.UserDao;11 import com.sl.user.service.UserService;12 import com.sl.user.vo.UserVO;13 14 @Service("userService")15 @Transactional(propagation=Propagation.REQUIRED, rollbackFor=Exception.class) 16 public class UserServiceImpl implements UserService{17   18   @Autowired19   private UserDao userDao;20   21   @Override22   @CacheEvict(value="User",key="addUser",allEntries=true) 23   public void addUser(UserVO user) {24     userDao.addUser(user);25   }26 27   @Override28   @CacheEvict(value = {"getUser", "getUserById"}, allEntries = true) 29   public void deleteUser(UserVO user) {30     userDao.deleteUser(user);31   }32 33   @Override34   @CacheEvict(value = {"getUser", "getUserById"}, allEntries = true) 35   public void updateUser(UserVO user) {36     userDao.updateUser(user);37   }38 39   @Override40   @Cacheable(value="User",key="getUserById")41   public UserVO getUserById(int id) {42     return userDao.getUserById(id);43   }44   45   @Override46   @Cacheable(value="User",key="'getUser'")47   public UserVO getUser(int id) {48     return userDao.getUser(id);49   }50 51 }

七,Ctrl层

 1 package com.sl.user.web; 2  3 import java.util.HashMap; 4 import java.util.Map; 5  6 import org.springframework.beans.factory.annotation.Autowired; 7 import org.springframework.stereotype.Controller; 8 import org.springframework.web.bind.annotation.RequestMapping; 9 import org.springframework.web.bind.annotation.ResponseBody;10 11 import com.sl.user.service.UserService;12 import com.sl.user.vo.UserVO;13 14 @Controller15 @RequestMapping("/userCtrl")16 public class UserCtrl {17   18   @Autowired19   private UserService userService;20   21   @RequestMapping("/addUser")22   public void addUser(UserVO user){23     userService.addUser(user);24   }25   26   @RequestMapping("/deleteUser")27   public void deleteUser(UserVO user){28     userService.deleteUser(user);29   }30   31   @RequestMapping("/updateUser")32   public void updateUser(UserVO user){33     userService.updateUser(user);34   }35   36   @ResponseBody37   @RequestMapping("/getUserById")38   public Map<String,Object> getUserById(UserVO user){39     Map<String,Object> map = new HashMap<String,Object>();40     map.put("msg",userService.getUserById(4));41     return map;42   }43   44   @ResponseBody45   @RequestMapping("/getUser")46   public Map<String,Object> getUser(UserVO vo){47     Map<String,Object> map = new HashMap<String,Object>();48     Object user = userService.getUser(4);49     map.put("msg",user.toString());50     return map;51   }52   53 }

八,Redis关键类,用于CRUD操作

 1 package com.sl.user.redis; 2 import java.io.ByteArrayInputStream;  3 import java.io.ByteArrayOutputStream;  4 import java.io.IOException;  5 import java.io.ObjectInputStream;  6 import java.io.ObjectOutputStream;  7   8 import org.springframework.cache.Cache;  9 import org.springframework.cache.support.SimpleValueWrapper;  10 import org.springframework.dao.DataAccessException;  11 import org.springframework.data.redis.connection.RedisConnection;  12 import org.springframework.data.redis.core.RedisCallback;  13 import org.springframework.data.redis.core.RedisTemplate; 14  15 public class RedisUtil implements Cache{ 16    17   private RedisTemplate<String, Object> redisTemplate;   18   private String name;   19   public RedisTemplate<String, Object> getRedisTemplate() {  20     return redisTemplate;   21   }  22     23   public void setRedisTemplate(RedisTemplate<String, Object> redisTemplate) {  24     this.redisTemplate = redisTemplate;   25   }  26     27   public void setName(String name) {  28     this.name = name;   29   }  30     31   @Override   32   public String getName() {  33     return this.name;   34   }  35   36   @Override   37   public Object getNativeCache() {  38     return this.redisTemplate;   39   }  40    41   /** 42    * 从缓存中获取key 43   */ 44   @Override   45   public ValueWrapper get(Object key) {  46 System.out.println("get key");  47    final String keyf = key.toString();  48    Object object = null;  49    object = redisTemplate.execute(new RedisCallback<Object>() {  50    public Object doInRedis(RedisConnection connection)   51          throws DataAccessException {  52      byte[] key = keyf.getBytes();  53      byte[] value = connection.get(key);  54      if (value == null) {  55       return null;  56       }  57      return toObject(value);  58      }  59     });  60     return (object != null ? new SimpleValueWrapper(object) : null);  61    }  62    63   /** 64    * 将一个新的key保存到缓存中 65    * 先拿到需要缓存key名称和对象,然后将其转成ByteArray 66    */ 67    @Override   68   public void put(Object key, Object value) {  69 System.out.println("put key");  70    final String keyf = key.toString();   71    final Object valuef = value;   72    final long liveTime = 86400;   73    redisTemplate.execute(new RedisCallback<Long>() {   74      public Long doInRedis(RedisConnection connection)   75          throws DataAccessException {   76         byte[] keyb = keyf.getBytes();   77         byte[] valueb = toByteArray(valuef);   78         connection.set(keyb, valueb);   79         if (liveTime > 0) {   80           connection.expire(keyb, liveTime);   81          }   82         return 1L;   83        }   84      });   85    }  86   87    private byte[] toByteArray(Object obj) {   88     byte[] bytes = null;   89     ByteArrayOutputStream bos = new ByteArrayOutputStream();   90     try {   91      ObjectOutputStream oos = new ObjectOutputStream(bos);   92       oos.writeObject(obj);   93       oos.flush();   94      bytes = bos.toByteArray();   95       oos.close();   96       bos.close();   97      }catch (IOException ex) {   98         ex.printStackTrace();   99      }  100      return bytes;  101     }  102  103    private Object toObject(byte[] bytes) { 104     Object obj = null;  105      try { 106        ByteArrayInputStream bis = new ByteArrayInputStream(bytes);  107        ObjectInputStream ois = new ObjectInputStream(bis);  108        obj = ois.readObject();  109         ois.close();  110         bis.close();  111      } catch (IOException ex) {  112         ex.printStackTrace();  113       } catch (ClassNotFoundException ex) {  114         ex.printStackTrace();  115       }  116       return obj;  117     } 118    119    /**120     * 删除key121     */122     @Override  123    public void evict(Object key) {  124 System.out.println("del key"); 125     final String keyf = key.toString();  126     redisTemplate.execute(new RedisCallback<Long>() {  127     public Long doInRedis(RedisConnection connection)  128          throws DataAccessException {  129       return connection.del(keyf.getBytes());  130       }  131      });  132     } 133    134     /**135      * 清空key136     */137     @Override  138     public void clear() {  139 System.out.println("clear key"); 140      redisTemplate.execute(new RedisCallback<String>() {  141         public String doInRedis(RedisConnection connection)  142             throws DataAccessException {  143          connection.flushDb();  144           return "ok";  145         }  146       });  147     } 148  149     @Override 150     public <T> T get(Object key, Class<T> type) { 151       return null; 152     } 153    154     @Override 155     public ValueWrapper putIfAbsent(Object key, Object value) { 156       return null; 157     } 158    159 }

九,Spring整合mybatis和redis配置文件

 1 <? 2 <beans  3    4    5    6    7    8    9   10   xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd 11    http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd 12    http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd 13    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd14    http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd15    http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache.xsd">16   17   <!-- 扫描dao,service -->18   <context:component-scan base-package="com.sl.user.service" />19   <context:component-scan base-package="com.sl.user.service.*" />20   <context:component-scan base-package="com.sl.user.redis" />21   <!-- 启用注解 -->22   <context:annotation-config/>23   <!-- 启动缓存注解 -->24   <cache:annotation-driven/>25   26   <!-- MyBatis start -->27     <!-- 配置dataSource DriverManagerDataSource-->28     <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">29       <property name="driverClassName" value="com.mysql.jdbc.Driver"></property>30       <property name="url" value="jdbc:mysql://127.0.0.1:3306/test"></property>31       <property name="username" value="root"></property>32       <property name="password" value="root"></property>33     </bean>34   35     <!-- MyBatis配置 SqlSessionFactoryBean -->36     <bean id="sessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">37       <property name="dataSource" ref="dataSource"></property>38       <property name="configLocation" value="classpath:config/mybatis.39       <property name="mapperLocations" value="classpath:mapper/UserMapper.40     </bean>41     42     <!-- mybatis自动扫描加载Sql映射文件/接口 : MapperScannerConfigurer 43           sqlSessionFactory44         basePackage:指定sql映射文件/接口所在的包(自动扫描) -->45     <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">46       <property name="sqlSessionFactory" ref="sessionFactory"></property>47       <property name="basePackage" value="com.sl.user.dao"></property>48     </bean>49         50     <!-- 事务管理 DataSourceTransactionManager-->51     <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">52       <property name="dataSource" ref="dataSource"></property>53     </bean>54     55     <!-- 使用声明式事务 transaction-manager:引用上面定义的事务管理器-->56     <tx:annotation-driven transaction-manager="txManager"></tx:annotation-driven>57     58   <!-- MyBatis end -->59   60   <!-- 配置redis部分 start -->61   62     <!-- 配置redis连接池 JedisPoolConfig-->63     <bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig">64       <property name="maxIdle" value="300" /> 65       <property name="maxTotal" value="600" /> 66     </bean> 67     68     <!-- 配置CoonnectionFactory JedisConnectionFactory-->69     <bean id="connFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">70        <property name="hostName" value="127.0.0.1"></property>71        <property name="port" value="6379"></property>72        <property name="poolConfig" ref="poolConfig"></property>73     </bean>74     75     <!-- 配置redisTemplate StringRedisTemplate-->76     <bean id="redisTemplate" class="org.springframework.data.redis.core.StringRedisTemplate">77       <property name="connectionFactory" ref="connFactory"/>78     </bean>79     80     <bean id="cacheManager" class="org.springframework.cache.support.SimpleCacheManager">  81       <property name="caches">  82         <set>  83           <bean class="com.sl.user.redis.RedisUtil">  84             <property name="redisTemplate" ref="redisTemplate" />  85             <property name="name" value="User"/>  86             <!-- User名称要在类或方法的注解中使用 --> 87           </bean> 88         </set>  89       </property>  90     </bean>91 92 </beans>

十,SpringMVC配置文件

 1 <? 2 <beans  3    4    5   xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd  6    http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd  7    http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd  8    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd 9    http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd">10 11   <mvc:annotation-driven/>12   <!-- 启用spring mvc 注解 -->13   <context:annotation-config/>14   <!-- 设置使用注解的类所在的jar包 -->15   <context:component-scan base-package="com.sl.user.*"></context:component-scan>16 17   <!-- 对模型视图名称的解析,即在模型视图名称添加前后缀 -->18   <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">19     <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>20     <property name="prefix" value="/views/"/>21     <property name="suffix" value=".jsp"/>22   </bean>23 24   <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">25     <!-- JSON转换器 -->26     <property name="messageConverters">27       <list>28         <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">29           <property name="supportedMediaTypes">30             <list>31               <value>application/json;charset=utf-8</value>32               <value>text/json;charset=utf-8</value>33             </list>34           </property>35         </bean>36       </list>37     </property>38   </bean>39 40 </beans>

十一,mybatis配置文件

 1 <? 2 <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"  3 "http://mybatis.org/dtd/mybatis-3-config.dtd"> 4 <configuration> 5  6   <!-- 实体类,简称 -设置别名 --> 7   <typeAliases> 8     <typeAlias alias="User" type="com.sl.user.vo.UserVO" /> 9   </typeAliases>10   11 </configuration> 

十二,log4j

 1 # Set root category priority to INFO and its only appender to CONSOLE. 2 log4j.rootCategory=DEBUG, CONSOLE 3 #log4j.rootCategory=INFO, CONSOLE, LOGFILE 4  5 # CONSOLE is set to be a ConsoleAppender using a PatternLayout. 6 log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender 7 log4j.appender.CONSOLE.Threshold=DEBUG 8 log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout 9 log4j.appender.CONSOLE.layout.ConversionPattern=%d{yyyy-MM-dd HH\:mm\:ss} %p - %m%n10 11 log4j.logger.java.sql.Connection=DEBUG12 log4j.logger.java.sql.Statement=DEBUG13 log4j.logger.java.sql.PreparedStatement=DEBUG14 log4j.logger.java.sql.ResultSet=DEBUG

十三,web.

 1 <? 2 <web-app version="3.0"  3    4    5   xsi:schemaLocation="http://java.sun.com/ 6   http://java.sun.com/ 7  <display-name>TestRedis</display-name> 8   9  <context-param>10     <param-name>contextConfigLocation</param-name>11     <param-value>12       classpath:config/applicationContext.13     </param-value>14   </context-param>15   16   <context-param>17     <param-name>log4jConfigLocation</param-name>18     <param-value>classpath:config/log4j.properties</param-value>19   </context-param>20   <context-param>21     <param-name>log4jRefreshInterval</param-name>22     <param-value>60000</param-value>23   </context-param>24   25   <listener>26     <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>27   </listener>28   <!-- 日志 -->29   <listener>30     <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>31   </listener>32   33   <servlet>34     <servlet-name>spring</servlet-name>35     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>36     <init-param>37       <param-name>contextConfigLocation</param-name>38       <param-value>classpath:config/SpringMVC.39     </init-param>40     <load-on-startup>1</load-on-startup>41   </servlet>42   <servlet-mapping>43     <servlet-name>spring</servlet-name>44     <url-pattern>*.do</url-pattern>45   </servlet-mapping>46   47   <!-- 解决中文乱码问题 -->48   <filter>49     <filter-name>characterEncoding</filter-name>50     <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>51     <init-param>52       <param-name>encoding</param-name>53       <param-value>UTF-8</param-value>54     </init-param>55     <init-param>56       <param-name>forceEncoding</param-name>57       <param-value>true</param-value>58     </init-param>59   </filter>60   <filter-mapping>61     <filter-name>characterEncoding</filter-name>62     <url-pattern>*.do</url-pattern>63   </filter-mapping>64  65    66  <welcome-file-list>67   <welcome-file>index.jsp</welcome-file>68  </welcome-file-list>69 </web-app>

十四,测试,已查询为例(getUser()方法),jsp测试页面整的比较丑就不贴出来了,自己写一个吧。。。

查询前:

执行第一次查询:

执行第二次查询操作:

 

上图可见,没有再执行sql,直接从redis中获取数据。

 

大功告成!!!!

在下初学,文中多有不足之处,还望多多指教。不喜勿喷。。。