基于这段时间折腾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://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"xmlns:mvc="http://www.springframework.org/schema/mvc"xmlns:aop="http://www.springframework.org/schema/aop"xmlns:cache="http://www.springframework.org/schema/cache"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsdhttp://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsdhttp://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache.xsd"><!-- 扫描dao,service --><context:component-scan base-package="com.sl.user.service" /><context:component-scan base-package="com.sl.user.service.*" /><context:component-scan base-package="com.sl.user.redis" /><!-- 启用注解 --><context:annotation-config/><!-- 启动缓存注解 --><cache:annotation-driven/><!-- MyBatis start --><!-- 配置dataSource DriverManagerDataSource--><bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"><property name="driverClassName" value="com.mysql.jdbc.Driver"></property><property name="url" value="jdbc:mysql://127.0.0.1:3306/test"></property><property name="username" value="root"></property><property name="password" value="root"></property></bean><!-- MyBatis配置 SqlSessionFactoryBean --><bean id="sessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"><property name="dataSource" ref="dataSource"></property><property name="configLocation" value="classpath:config/mybatis.xml"></property><property name="mapperLocations" value="classpath:mapper/UserMapper.xml"></property></bean><!-- mybatis自动扫描加载Sql映射文件/接口 : MapperScannerConfigurer sqlSessionFactorybasePackage:指定sql映射文件/接口所在的包(自动扫描) --><bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"><property name="sqlSessionFactory" ref="sessionFactory"></property><property name="basePackage" value="com.sl.user.dao"></property></bean><!-- 事务管理 DataSourceTransactionManager--><bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource"></property></bean><!-- 使用声明式事务 transaction-manager:引用上面定义的事务管理器--><tx:annotation-driven transaction-manager="txManager"></tx:annotation-driven><!-- MyBatis end --><!-- 配置redis部分 start --><!-- 配置redis连接池 JedisPoolConfig--><bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig"><property name="maxIdle" value="300" /> <property name="maxTotal" value="600" /> </bean> <!-- 配置CoonnectionFactory JedisConnectionFactory--><bean id="connFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory"><property name="hostName" value="127.0.0.1"></property><property name="port" value="6379"></property><property name="poolConfig" ref="poolConfig"></property></bean><!-- 配置redisTemplate StringRedisTemplate--><bean id="redisTemplate" class="org.springframework.data.redis.core.StringRedisTemplate"><property name="connectionFactory" ref="connFactory"/></bean><bean id="cacheManager" class="org.springframework.cache.support.SimpleCacheManager"> <property name="caches"> <set> <bean class="com.sl.user.redis.RedisUtil"> <property name="redisTemplate" ref="redisTemplate" /> <property name="name" value="User"/> <!-- User名称要在类或方法的注解中使用 --> </bean> </set> </property> </bean></beans>
十,SpringMVC配置文件
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:mvc="http://www.springframework.org/schema/mvc"xmlns:aop="http://www.springframework.org/schema/aop"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsdhttp://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd"><mvc:annotation-driven/><!-- 启用spring mvc 注解 --><context:annotation-config/><!-- 设置使用注解的类所在的jar包 --><context:component-scan base-package="com.sl.user.*"></context:component-scan><!-- 对模型视图名称的解析,即在模型视图名称添加前后缀 --><bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"><property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/><property name="prefix" value="/views/"/><property name="suffix" value=".jsp"/></bean><bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"><!-- JSON转换器 --><property name="messageConverters"><list><bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"><property name="supportedMediaTypes"><list><value>application/json;charset=utf-8</value><value>text/json;charset=utf-8</value></list></property></bean></list></property></bean></beans>
十一,mybatis配置文件
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"><configuration><!-- 实体类,简称 -设置别名 --><typeAliases><typeAlias alias="User" type="com.sl.user.vo.UserVO" /></typeAliases></configuration>
十二,log4j
# Set root category priority to INFO and its only appender to CONSOLE.log4j.rootCategory=DEBUG, CONSOLE#log4j.rootCategory=INFO, CONSOLE, LOGFILE# CONSOLE is set to be a ConsoleAppender using a PatternLayout.log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppenderlog4j.appender.CONSOLE.Threshold=DEBUGlog4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayoutlog4j.appender.CONSOLE.layout.ConversionPattern=%d{yyyy-MM-dd HH/:mm/:ss} %p - %m%nlog4j.logger.java.sql.Connection=DEBUGlog4j.logger.java.sql.Statement=DEBUGlog4j.logger.java.sql.PreparedStatement=DEBUGlog4j.logger.java.sql.ResultSet=DEBUG
十三,web.xml
<?xml version="1.0" encoding="UTF-8"?><web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"><display-name>TestRedis</display-name><context-param><param-name>contextConfigLocation</param-name><param-value>classpath:config/applicationContext.xml</param-value></context-param><context-param><param-name>log4jConfigLocation</param-name><param-value>classpath:config/log4j.properties</param-value></context-param><context-param><param-name>log4jRefreshInterval</param-name><param-value>60000</param-value></context-param><listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener><!-- 日志 --><listener><listener-class>org.springframework.web.util.Log4jConfigListener</listener-class></listener><servlet><servlet-name>spring</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:config/SpringMVC.xml</param-value></init-param><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>spring</servlet-name><url-pattern>*.do</url-pattern></servlet-mapping><!-- 解决中文乱码问题 --><filter><filter-name>characterEncoding</filter-name><filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class><init-param><param-name>encoding</param-name><param-value>UTF-8</param-value></init-param><init-param><param-name>forceEncoding</param-name><param-value>true</param-value></init-param></filter><filter-mapping><filter-name>characterEncoding</filter-name><url-pattern>*.do</url-pattern></filter-mapping><welcome-file-list><welcome-file>index.jsp</welcome-file></welcome-file-list></web-app>
十四,测试,已查询为例(getUser()方法),jsp测试页面整的比较丑就不贴出来了,自己写一个吧。。。
查询前:
执行第一次查询:
执行第二次查询操作:
上图可见,没有再执行sql,直接从redis中获取数据。
以上所述是小编给大家介绍的Spring与Mybatis基于注解整合Redis的方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对武林网网站的支持!
新闻热点
疑难解答