Spring与Mybatis基于注解整合Redis的方法
作者:Revel
这篇文章主要介绍了Spring与Mybatis基于注解整合Redis的方法,本文通过实例给大家介绍的非常详细,具有参考借鉴价值,需要的朋友可以参考下
基于这段时间折腾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;
}
@Override
public 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{
@Autowired
private 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 {
@Autowired
private 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.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd http://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 sqlSessionFactory basePackage:指定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.xsd http://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.ConsoleAppender
log4j.appender.CONSOLE.Threshold=DEBUG
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%d{yyyy-MM-dd HH\:mm\:ss} %p - %m%n
log4j.logger.java.sql.Connection=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG
log4j.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的方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!
