Spring与Mybatis基于注解整合Redis的方法
2017-04-18 00:00
501 查看
基于这段时间折腾redis遇到了各种问题,想着整理一下。本文主要介绍基于Spring+Mybatis以注解的形式整合Redis。废话少说,进入正题。
首先准备Redis,我下的是Windows版,下载后直接启动redis-server就行了,见下图:
一,先上jar包
二,创建实体类
?
三,dao接口
?
四,UserMapper
?
五,Service接口
?
六,Service实现
?
七,Ctrl层
?
八,Redis关键类,用于CRUD操作
?
九,Spring整合mybatis和redis配置文件
?
十,SpringMVC配置文件
?
十一,mybatis配置文件
?
十二,log4j
?
十三,web.xml
?
十四,测试,已查询为例(getUser()方法),jsp测试页面整的比较丑就不贴出来了,自己写一个吧。。。
查询前:
执行第一次查询:
执行第二次查询操作:
上图可见,没有再执行sql,直接从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 + "]" ; } } |
?
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); } |
?
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> |
?
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); } |
?
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); } } |
?
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; } } |
?
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 ; } } |
?
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> |
?
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> |
?
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> |
?
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 |
?
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> |
查询前:
执行第一次查询:
执行第二次查询操作:
上图可见,没有再执行sql,直接从redis中获取数据。
以上所述是小编给大家介绍的Spring与Mybatis基于注解整合Redis的方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!
相关文章推荐
- Spring与Mybatis基于注解整合Redis的方法
- Spring基于注解整合Redis完整实例
- SpringBoot整合mybatis、shiro、redis实现基于数据库的细粒度动态权限管理系统实例
- SSM简单整合(Mybatis,Spring,SpringMVC,基于注解和xml文件配置)
- Spring基于注解整合Redis
- SpringMvc+Spring+MyBatis 基于注解整合
- SpringBoot整合mybatis、shiro、redis实现基于数据库的细粒度动态权限管理系统实例
- spring mvc系列文章 - springmvc spring mybatis ibatis freemark整合开发(2.0版:基于注解)
- 基于注解的mybatis和spring整合
- SpringBoot整合mybatis、shiro、redis实现基于数据库的细粒度动态权限管理系统实例
- 纯代码(基于注解和代码,零xml)整合SSHM(Spring、SpringMVC、Hibernate、Mybatis)
- SpringBoot整合mybatis、shiro、redis实现基于数据库的细粒度动态权限管理系统实例
- 基于注解spring4.*,mybatis3.*最简单的SSM整合
- 实际工作:----Redis之——Spring基于注解整合Redis
- Redis之——Spring基于注解整合Redis
- SpringBoot整合mybatis、shiro、redis实现基于数据库的细粒度动态权限管理系统实例(转)
- springboot 整合mybatis 基于注解开发 传入对象
- Redis之——Spring基于注解整合Redis
- [置顶] 基于注解的mybatis整合spring开发流程?
- mybatis3 spring整合的好方案及其使用注解操作的方法如下