基于这段时间折腾redis遇到了各种问题,想着整理一下。本文主要介绍基于Spring+Mybatis以注解的形式整合Redis。废话少说,进入正题。
首先准备Redis,我下的是Windows版,下载后直接启动redis-server就行了,见下图:
一,先上jar包
二,创建实体类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
|
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接口
1
2
3
4
5
6
7
8
9
|
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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
<?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接口
1
2
3
4
5
6
7
8
9
|
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实现
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
|
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层
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
|
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操作
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
|
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配置文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
|
<?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配置文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
<?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配置文件
1
2
3
4
5
6
7
8
9
|
<?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
1
2
3
4
5
6
7
8
9
10
11
12
|
# 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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
|
<?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的方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对服务器之家网站的支持!
原文链接:http://www.cnblogs.com/Revel-sl/archive/2016/09/05/5841861.html