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

基于这段时间折腾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的方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

转载于:https://my.oschina.net/ldm95/blog/881690

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值