Com base no fato de ter encontrado vários problemas durante esse período, pensei em resolvê -lo. Este artigo apresenta principalmente a integração de Redis na forma de anotações baseadas na primavera+mybatis. Menos bobagem, chegue ao ponto.
Primeiro, prepare Redis. Vou usar a versão do Windows. Após o download, basta iniciar o Redis-Server diretamente. Veja a foto abaixo:
Primeiro, adicione o pacote JAR primeiro
2. Crie aula de entidade
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) classe pública UserVone implementa serializável {private estático final serialversionuid = 1L; private Int ID; private string nome de usuário; senha privada; private int Age; public uservo () {(); } public uservo (int id, string nome de usuário, senha da string, int idade) {super (); this.id = id; this.UserName = userName; this.password = senha; this.age = AGE;} public int getIr () {Return iD;} public void setIr (int) {this.id = iD;} string; nome de usuário) {this.username = nome de usuário;} public string getPassword () {return senha;} public void setPassword (string senha) {this.password = senha;} public int getage () {retorna idade;} public void se setage (int) {this.age = Age;}@@expedridepublic string tos tos nome de usuário = " + nome de usuário +", senha = " + senha +", idade = " + idade +"] ";}} Três, interface Dao
pacote com.sl.user.dao; importação com.sl.user.vo.uservo; interface pública Userdao {public void adduser (usuário do uservo); public void DeleteUser (usuário do USERVO); public void updateUser (usuário do usuário uservO); UserVerbyId); public); INTROVIVEr. 4. UserMApper
<? xml versão = "1.0" Encoding = "utf-8"?> <! ><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 = "Usuário"> Inserir em T_USER (nome de usuário, senha, idade) valores (#{nome de usuário},#{senha},#{Age}) </insert> <update id = "DeleteUser" ParameterType = "User"> Delete * de T_USER WHERE ID =#{id "</} t_user set <if test = "nome de usuário! = nulo e nome de usuário! = ''"> nome de usuário = #{nome de usuário}, </if> <if test = "senha! = null e senha! = '' '> senha = #{senha}, </if> <se test =" idade! null e id! = '' "> e id = #{id} </if> </update> <select id =" getUser "parametertype =" int "resulttype =" user "> selecione * de t_user onde identing = {id}} </select> <select ID =" getUserByid "parameterType = {{} Result> <select> iD =" getUserByid "parameterType =" t_user onde id = #{id} </leclect> </mapper> 5. Interface de serviço
pacote com.sl.user.service; importar com.sl.user.vo.uservo; interface pública UserService {public void adduser (usuário do uservo); public void DeleteUser (usuário do uservo); public void updateUser (usuário uservO); public uservo getUserbyid (Intest); public USVERTUSER (USERVEURTER (USERVO); Sexto, implementação de serviços
pacote com.sl.user.service.impl; importar org.springframework.beans.factory.annotation.autowired; importar org.springframework.cache.annotation.cacheevict; importar org.springframeworkswork.annotation.cacheevict; importação; org.springframework.transaction.annotation.propagation; importação org.springframework.transaction.annotation.transaction; importar com.sl.user.dao.userdao; importar com.sl.user.serserve.userservie; importar; com.sl.user.vo.uservo; @service ("userService")@transacional (propagação = propagação.Required, rollbackfor = excepcion.class) classe pública UserServiceImpl implementa UserService {@AutowiredPrivate UserDao UserDao;@expedride@CACHED (@AUTODPRIVATE), "Add)," advert), "advert), @aTerEdr)," advert), "advert), @aToToDOUD)," advert), "advert), @aToToild)," advert), "advert), o userDao; addUser (usuário do uservo) {userdao.adduser (user);}@substituir@cacheevict (value = {"getUser", "getUserbyId"}, allEntries = true) public void DeleteUser (UserVo User) {userDao.Deleteer (User); "getUserById"}, allEntries = true) public void updateUser (usuário do uservo) {userdao.updateUser (user);}@substituir@cacheable (value = "user", key = "getUserById") public uservo getUserbyId (int id) {retornar userdao.getUserById (id);}@substituir@cacheable (value = "user", key = "'getUser'") public uservo getuser (int id) {return userdao.getUser (id);}} Sete, camada Ctrl
pacote com.sl.user.web; importar java.util.hashmap; importar java.util.map; importar org.springframework.beans.factory.annotation.autowired; importrg.springframework.sterotype.controller; import.springfringfringfringweb.web.web.web.web.webwe.; org.springframework.web.bind.annotation.Responsebody; importar com.sl.user.service.userService; importar com.sl.user.vo.uservo;@controller@requestMapping ("/userCtrl") public classe userctrl {@aUTowiredRaping "usuários"/userrctrl ") public userCtrl {@aUTowired; addUser (usuário do uservo) {userService.adduser (usuário);}@requestmapping ("/deleteuser") public void DeleteUser (usuário usuário) {Uservice.DeleteUser (usuário);}@requestmapping ("/updateUser") public void update (uservo); Usuário) {userservice.UpdateUser (Usuário);}@ResponseBody@requestMapping ("/getUserById") Public Map <String, Object> getUserById (UserVo User) {map <String, object> Map = new Hashmap <String, Object> (); map;}@respostabody@requestmapping ("/getUser") mapa público <string, object> getUser (uservo vo) {map <string, object> map = new hashmap <string, object> (); objeto user = userService.getUser (4); map.put ("msg", user.tostring ()); 8. Classe Key Redis, usada para operações CRUD
pacote com.sl.user.redis; importar java.io.byteArrayInputStream; importar java.io.byteArrayOutputStream; importar java.io.ioException; importar java.io.ObjectInputStream; importar java.io.ObjectOutputStream; importar java.io.ObjectOutputStream; importar org.springframework.cache.cache; importar org.springframework.cache.support.simpleValueWrapper; importar org.springframework.dao.dataacccessException; importar org.springframework.data.redis.connection.redisconnection; importar org.springframework.data.redis.core.rediscallback; importar org.springframework.data.redis.core.redistemplate; classe pública Redisutil implementa cache {private redistemplate <string, object> redistemplate; nome de string privado; public redistemplate <string, object> getredistemplate () {return redistemplate; } public void setRedSplate (redistemplate <string, object> redistemplate) {this.redistemplate = redistemplate; } public void setName (nome da string) {this.name = name; } @Override public string getName () {return this.name; } @Override public Object getNativeCache () {return this.redistemplate; } /*** Ganhe a chave do cache* /@Substitua public valueWrapper get (chave do objeto) {System.out.println ("get Key"); Final String keyf = key.toString (); Objeto objeto = nulo; Object = Redistemplate.execute (novo Rediscallback <ject> () {public objeto doinredis (conexão de redisconnection) lança dataAccessException {byte [] key = keyf.getBytes (); byte [] value = Connection.get (key); if (value == null) {retorn; return (object! = null? novo SimpleValueWrapper (objeto): nulo); } /*** Salve uma nova chave para o cache*primeiro obtenha o nome e o objeto e depois converta -o em bytearray* /@substituir public void put (chave do objeto, valor do objeto) {System.out.println ("Put Key"); Final String keyf = key.toString (); Valor final do objeto = valor; LiveTime final = 86400; redistemplate.execute (novo rediscallback <long> () {public long doinredis (conexão de redisconnection) lança dataAccessException {byte [] keyb = keyf.getbytes (); byte [] valueB = TobyTearray (valuef); conexão (keyb); 1L;}}); } byte privado [] TobyTearray (objeto obj) {byte [] bytes = null; ByteArrayOutputStream bos = new ByteArrayOutputStream (); tente {objectOutputStream ooS = new ObjectOutputStream (BOS); OOS.WriteObject (OBJ); oos.flush (); bytes = bos.tobytearray (); OOS.Close (); bos.close (); } catch (ioexception ex) {ex.printStackTrace (); } retornar bytes; } objeto privado toObject (byte [] bytes) {objeto obj = null; tente {byteArrayInputStream bis = novo byteArrayInputStream (bytes); ObjectInputStream ois = new ObjectInputStream (bis); obj = ois.readObject (); OIS.Close (); bis.close (); } catch (ioexception ex) {ex.printStackTrace (); } catch (classNotfoundException ex) {ex.PrintStackTrace (); } retornar obj; } /*** exclua chave* /@substitua public void despet (chave do objeto) {System.out.println ("del Key"); Final String keyf = key.toString (); redistemplate.execute (novo rediscallback <long> () {public long doinredis (conexão de redisconnection) lança dataAccessException {return Connection.del (keyf.getbytes ());}}); } /*** Chave limpa* /@Substitua public void clear () {System.out.println ("Clear Key"); redistemplate.execute (novo rediscallback <tring> () {public string doinredis (conexão de redisconnection) lança dataAccessException {Connection.flushdb (); return "ok";}}); } @Override public <T> t Get (tecla de objeto, classe <T> tipo) {return null; } @Override public ValueWrapper PutifabSent (chave do objeto, valor do objeto) {return null; }} 9. Spring integra arquivos de configuração Mybatis e Redis
<? xml versão = "1.0" coding = "utf-8"?> <Beans xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http:/wwww.w3 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.springframew ork.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-tg/schema 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 -> <Contexto: component-scan Base-package = "com.sl.user.service" /> <Contexto: componente-Scan-package = "com.sl.user.service. anotação-> <cache: anotação-driven/> <!-mybatis start-> <!-Configure DataSource DriverManagerDataSource-> <bean id = "DataSource"> <Nome da propriedade = "DriverclassName" Value = "com.mysql.jdbc.driver"> <//propriedade> </propriedade> </propriedades> value = "jdbc: mysql: //127.0.0.1: 3306/teste"> </propriedade> <propriedade name = "userr name" value = "root"> </oilter> <names name = "sepção" value = "root"> </oither> </bean> <!-myehan idiEngis "sqlSactoryBanBan-</oither> </bean> <!-batis" senha "sqlSativeBeanBan-</propriedade> </bean> <!-batis" sqlSactoryban-</oitir> name = "DataSource" Ref = "DataSource"> </Property> <propriedade name = "configLocation" value = "ClassPath: config/mybatis.xml"> </propriedade> <propriedades name = "mapperlocations" value = "Classpath: mapper/userMapper.xml"> </property> </... MAPPERSCANNERCONFIGURADOR SQLSessionFactoryBasePackage: Especifique o pacote em que o arquivo/interface do mapa SQL está localizado (varredura automática)-> <Bean> <Nome da propriedade "SQLSessionFactory" Ref = "SessionFactory"> </Property> <nome "" Basepackage "/" com.sl.er.er.da "> </Property> <nome" "Basepackage"/"com.sl.er.er.da"> </propriedade> <nome "" Basepackage "/" com.sl.er.er.da "> </propriedade> <nome" " DataSourCetransactionManager-> <bean id = "txManager"> <propriedade name = "DataSource" ref = "DataSource"> </propriedade> </bean> <!-usando transação declarativa-manager: referência ao gerenciador de transação " -> <!-Configure a parte Redis Start-> <!-Configure o pool de conexão Redis JedispoolConfig-> <bean id = "poolconfig"> <name da propriedade = "maxidle" value = "300" /> <Nome da propriedade = "maxtotal" = "600" /> < /ben> <!-Config id = "ConnFactory"> <propriedade name = "hostName" value = "127.0.0.1"> </propriedade> <propriedade name = "port" value = "6379"> </propriedade> <propriedades name = "poolconfig" refsplateMpledEMpledMpledMplate "PoolConfig"> </Property> </Bean> <!-Id "RedistemplateMpledem" name = "ConnectionFactory" ref = "ConnFactory"/> </ Bean> <bean id = "cachemanager"> <propriedades name = "cache"> <Set> <Bean> <names name = "redistemplate" ref = "Redistemplate"/> <nome da propriedade "name" name = "/>/<!-bata deve ser usado em classe"/> </ Bean> </ Beans>
10, arquivo de configuração Springmvc
<? xml versão = "1.0" coding = "utf-8"?> <Beans xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http:/wwww.w3 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/><!-Habilite o pacote de mola onde a classe usando a classe usando a classe usando a classe usando a classe usando o pacote da classe, o número da classe usando o pacote da classe-> <! base-package = "com.sl.user.*"> </context: component-scan> <!-Resolução do nome do modelo Nome, ou seja, adicionando prefixos ao modelo de visualização Nome-> <bean id = "ViewResolver"> <nome da propriedade "viewclass" value = "org.springFramework.web.jserview" value = "/Views/"/> <propriedade name = "sufixo" value = ". name = "SupportedMediTypes"> <TIST> <Value> Application/json; charset = utf-8 </value> <Value> text/json; charset = utf-8 </value> </list> </oither> </bean> </list> </propriedade> <//Bean> </ Beans>
11, arquivo de configuração Mybatis
<? xml versão = "1.0" Encoding = "utf-8"?> <! Doctype Configuration public "-// mybatis.org//dtd config 3.0 //" "http://mybatis.org/dtd/mybatis-3-config.dtduz<> Alias-> <TyceAliases> <typeAlias alias = "user" type = "com.sl.user.vo.uservo"/> </tytytealiases> </figuration>
12, log4j
# Defina a categoria raiz prioridade para as informações e seu único Appender para console.log4j.rootcategory = Debug, console# log4j.rootcategory = info, console, arquivo de log# o console deve ser um consoleppender usando um PatternLayout.log4j.appender.console = org.apache.log4j.consoleppenderLog4j.appender.console.threshold = debugLog4j.a ppender.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.sqlger.PreparedStatement = debugLog4jogger.Logger.java.sqlG Treze, 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>CONTEXTCONFIGLOCATIONCIMANTE AME> <MARAM-VALUE> CLASSPATH: config/appoldcontext.xml </param-value> </context-param> <xexent-param> <amam-name> log4jconfigLocation </param-name> <p Aram-value> ClassPath: config/log4j.properties </param-value> </context-param> <xexexent-param> <amam-name> log4jrefreshinterval </amam-name> <param-value > 60000 </param-value> </context-param> <lister> <lister-class> org.springframework.web.context.contextLoaderListener </lister-class> </lirvier> <!- LOG-> <Iunciante> <lister-class> org.springframework.web.util.log4jconfiglistener </lister-class> </ferirer> <ervlet> <Verlet-name> Spring </servlet-name> <ervlet-class> org.springFramework.web.Servlet.gunMestle ContextConfigLocation </param-name> <amam-value> ClassPath: config/springmvc.xml </param-value> </irit-param> <adarot-on-startup> 1 </load-on-startup> </serl-Pattern> <rutlet-mapping> <sicle-name> </sertlet-Name> <url-Pattern>* Problema de código chinês ilegível -> <filter> <filter-name> caractere-codificação Codificação </param-name> <amam-value> true </amam-value> </irit-param> </filter> <filter-mapping> <filter-name> caracterenicing </ftrhter-name> <url-tattern>*. don-e-FILE
Quatorze, teste, foram consultados como um exemplo (método getUser ()), a página de teste JSP é feia, então não vou postar, apenas escreva um sozinho. . .
Antes da consulta:
Execute a primeira consulta:
Execute a segunda operação de consulta:
Como pode ser visto na figura acima, nenhum SQL é executado novamente e os dados são obtidos diretamente da Redis.
O exposto acima é o método de integrar o Redis com base nas anotações do editor. Espero que seja útil para todos. Se você tiver alguma dúvida, deixe -me uma mensagem e o editor responderá a todos a tempo. Muito obrigado pelo seu apoio ao site wulin.com!