Based on the fact that I encountered various problems during this period of time, I thought about sorting out it out. This article mainly introduces the integration of Redis in the form of annotations based on Spring+Mybatis. Less nonsense, get to the point.
First, prepare Redis. I'm going to be the Windows version. After downloading, just start redis-server directly. See the picture below:
First, add the jar package first
2. Create entity class
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;}@Overridepublic String toString() {return "UserVO [id=" + id + ", username=" + username + ", password="+ password + ", age=" + age + "]";}} Three, dao interface
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);} 4. 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"/><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> 5. Service interface
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);} Sixth, Service implementation
package com.sl.user.service.impl;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.cache.annotation.CacheEvict;import org.springframework.cache.annotation.CacheEvict;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{@Autowiredprivate 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);}} Seven, Ctrl layer
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 {@Autowiredprivate 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;}} 8. Redis key class, used for CRUD operations
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 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; } /*** Get key from cache*/@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); } /*** Save a new key to the cache* First get the name and object and then convert it into ByteArray*/@Override public void put(Object key, Object value) { System.out.println("put key"); final String keyf = key.toString(); final Object value = 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; } /*** Delete 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()); } }); } /*** Clear 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; } } 9. Spring integrates mybatis and redis configuration files
<?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.xsdhttp://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsdhttp://www.springframework.org/schema/cache http://www.springframework.org/schema/cache.xsd"><!-- Scan 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" /><!-- Enable annotation--><context:annotation-config/><!-- Start cache annotation--><cache:annotation-driven/><!-- MyBatis start --><!-- Configure dataSource DriverManagerDataSource--><bean id="dataSource"><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 configuration SqlSessionFactoryBean --><bean id="sessionFactory"><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 automatic scan to load Sql map file/interface: MapperScannerConfigurer sqlSessionFactorybasePackage: Specify the package where the sql map file/interface is located (auto scan) --><bean><property name="sqlSessionFactory" ref="sessionFactory"></property><property name="basePackage" value="com.sl.user.dao"></property></bean><!-- Transaction Management DataSourceTransactionManager--><bean id="txManager"><property name="dataSource" ref="dataSource"></property></bean><!-- Using declarative transaction-manager: Reference the transaction manager defined above--><tx:annotation-driven transaction-manager="txManager"></tx:annotation-driven><!-- MyBatis end --><!-- Configure redis part start --><!-- Configure redis connection pool JedisPoolConfig--><bean id="poolConfig"><property name="maxIdle" value="300" /> <property name="maxTotal" value="600" /> </bean> <!-- Configure CoonnectionFactory JedisConnectionFactory--><bean id="connFactory"><property name="hostName" value="127.0.0.1"></property><property name="port" value="6379"></property><property name="poolConfig" ref="poolConfig"></property></bean><!-- Configure redisTemplate StringRedisTemplate--><bean id="redisTemplate"><property name="connectionFactory" ref="connFactory"/></bean><bean id="cacheManager"> <property name="caches"> <set> <bean> <property name="redisTemplate" ref="redisTemplate" /> <property name="name" value="User"/> <!-- User name should be used in class or method annotations --> </bean> </set> </property> </bean></beans>
10, SpringMVC configuration file
<?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/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 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/><!-- Enable spring mvc annotation--><context:annotation-config/><!-- Set the jar package where the class using the annotation is located--><context:component-scan base-package="com.sl.user.*"></context:component-scan><!-- Resolution of model view name, that is, adding prefixes to model view name--><bean id="viewResolver"><property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/><property name="prefix" value="/views/"/><property name="suffix" value=".jsp"/></bean><bean><!-- JSON Converter--><property name="messageConverters"><list><bean><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>
11, mybatis configuration file
<?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><!-- Entity class, abbreviated - Set alias--><typeAliases><typeAlias alias="User" type="com.sl.user.vo.UserVO" /></typeAliases></configuration>
12, 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.ConsoleAppenderlog4j.appender.CONSOLE.Threshold=DEBUGlog4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayoutlog4j.appender.CONSOLE.layout.ConversionPattern=%d{yyyy-MM-dd HH/:mm/:ss} %p - %m%nlog4j.logger.java.sql.Connection=DEBUGlog4j.logger.java.sql.Statement=DEBUGlog4j.logger.java.sql.PreparedStatement=DEBUGlog4j.logger.java.sql.ResultSet=DEBUG Thirteen, 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><p aram-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><!-- Log--><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><!-- Solve the problem of garbled Chinese code --><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>forceEn coding</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>
Fourteen, test, have been queried as an example (getUser() method), the jsp test page is ugly, so I won’t post it, just write one by myself. . .
Before query:
Execute the first query:
Perform the second query operation:
As can be seen in the figure above, no SQL is executed again, and data is directly obtained from Redis.
The above is the method of integrating Redis based on annotations by the editor. I hope it will be helpful to everyone. If you have any questions, please leave me a message and the editor will reply to everyone in time. Thank you very much for your support to Wulin.com website!