您的位置:首页 > 数据库 > Redis

Spring与Mybatis基于注解整合Redis的方法

2017-04-18 00:00 501 查看
基于这段时间折腾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-->

<beanid=
"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 -->

<beanid=
"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-->

<beanid=
"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-->

<beanid=
"poolConfig"
class
=
"redis.clients.jedis.JedisPoolConfig"
>

<property name=
"maxIdle"
value=
"300"
/>

<property name=
"maxTotal"
value=
"600"
/>

</bean>

<!-- 配置CoonnectionFactory JedisConnectionFactory-->

<beanid=
"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-->

<beanid=
"redisTemplate"
class
=
"org.springframework.data.redis.core.StringRedisTemplate"
>

<property name=
"connectionFactory"
ref=
"connFactory"
/>

</bean>

<beanid=
"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>

<!-- 对模型视图名称的解析,即在模型视图名称添加前后缀 -->

<beanid=
"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的方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  spring+mybatis+redis