闲来无事,今天就研究一下SSM架构集成Redis做缓存。话不多说了,直接贴代码吧。后面会有整个项目的源码还有sql,需要的话大家可以去下载。
- 先创建一个基于maven的空项目
- 项目的整体结构
- pom.xml
4.0.0
BookMaven
BookMaven
0.0.1-SNAPSHOT
war
4.0.2.RELEASE
3.2.6
1.7.7
1.2.17
junit
junit
4.11
test
org.springframework
spring-core
4.0.2.RELEASE
org.springframework
spring-web
4.0.2.RELEASE
org.springframework
spring-oxm
4.0.2.RELEASE
org.springframework
spring-tx
4.0.2.RELEASE
org.springframework
spring-jdbc
4.0.2.RELEASE
org.springframework
spring-webmvc
4.0.2.RELEASE
org.springframework
spring-aop
4.0.2.RELEASE
org.springframework
spring-context-support
4.0.2.RELEASE
org.springframework
spring-test
4.0.2.RELEASE
org.mybatis
mybatis
3.2.6
org.mybatis
mybatis-spring
1.2.2
commons-dbcp
commons-dbcp
1.2.2
jstl
jstl
1.2
log4j
log4j
1.2.17
com.alibaba
fastjson
1.1.41
org.slf4j
slf4j-api
1.7.7
org.slf4j
slf4j-log4j12
1.7.7
org.codehaus.jackson
jackson-mapper-asl
1.9.13
commons-fileupload
commons-fileupload
1.3.1
commons-io
commons-io
2.4
commons-codec
commons-codec
1.9
mysql
mysql-connector-java
5.1.34
org.aspectj
aspectjweaver
1.7.4
org.springframework.data
spring-data-redis
1.6.2.RELEASE
redis.clients
jedis
2.8.0
org.mybatis
mybatis-ehcache
1.0.0
org.apache.maven.plugins
maven-compiler-plugin
1.7
1.7
- applicationContext.xml
classpath:db.properties
classpath:redis.properties
- db.properties
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/test
jdbc.username=root
jdbc.password=123456
- log4j.properties
### Log4j\u914D\u7F6E ###
### \u4E0ESpring\u7ED3\u5408\u9700\u8981\u5728web.xml\u4E2D\u6307\u5B9A\u6B64\u6587\u4EF6\u4F4D\u7F6E\uFF0C\u5E76\u6DFB\u52A0\u76D1\u542C\u5668 ###
#\u5B9A\u4E49log4j\u7684\u8F93\u51FA\u7EA7\u522B\u548C\u8F93\u51FA\u76EE\u7684\u5730\uFF08\u76EE\u7684\u5730\u53EF\u4EE5\u81EA\u5B9A\u4E49\u540D\u79F0\uFF0C\u548C\u540E\u9762\u7684\u5BF9\u5E94\uFF09
#[ level ] , appenderName1 , appenderName2
log4j.rootLogger=DEBUG,console,file
#-----------------------------------#
#1 \u5B9A\u4E49\u65E5\u5FD7\u8F93\u51FA\u76EE\u7684\u5730\u4E3A\u63A7\u5236\u53F0
log4j.appender.console = org.apache.log4j.ConsoleAppender
log4j.appender.console.Target = System.out
log4j.appender.console.Threshold=DEBUG
####\u53EF\u4EE5\u7075\u6D3B\u5730\u6307\u5B9A\u65E5\u5FD7\u8F93\u51FA\u683C\u5F0F\uFF0C\u4E0B\u9762\u4E00\u884C\u662F\u6307\u5B9A\u5177\u4F53\u7684\u683C\u5F0F ###
#%c: \u8F93\u51FA\u65E5\u5FD7\u4FE1\u606F\u6240\u5C5E\u7684\u7C7B\u76EE\uFF0C\u901A\u5E38\u5C31\u662F\u6240\u5728\u7C7B\u7684\u5168\u540D
#%m: \u8F93\u51FA\u4EE3\u7801\u4E2D\u6307\u5B9A\u7684\u6D88\u606F,\u4EA7\u751F\u7684\u65E5\u5FD7\u5177\u4F53\u4FE1\u606F
#%n: \u8F93\u51FA\u4E00\u4E2A\u56DE\u8F66\u6362\u884C\u7B26\uFF0CWindows\u5E73\u53F0\u4E3A"/r/n"\uFF0CUnix\u5E73\u53F0\u4E3A"/n"\u8F93\u51FA\u65E5\u5FD7\u4FE1\u606F\u6362\u884C
log4j.appender.console.layout = org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=[%c]-%m%n
#-----------------------------------#
#2 \u6587\u4EF6\u5927\u5C0F\u5230\u8FBE\u6307\u5B9A\u5C3A\u5BF8\u7684\u65F6\u5019\u4EA7\u751F\u4E00\u4E2A\u65B0\u7684\u6587\u4EF6
log4j.appender.file = org.apache.log4j.RollingFileAppender
#\u65E5\u5FD7\u6587\u4EF6\u8F93\u51FA\u76EE\u5F55
log4j.appender.file.File=log/tibet.log
#\u5B9A\u4E49\u6587\u4EF6\u6700\u5927\u5927\u5C0F
log4j.appender.file.MaxFileSize=10mb
###\u8F93\u51FA\u65E5\u5FD7\u4FE1\u606F###
#\u6700\u4F4E\u7EA7\u522B
log4j.appender.file.Threshold=ERROR
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=[%p][%d{yy-MM-dd}][%c]%m%n
#4 mybatis \u663E\u793ASQL\u8BED\u53E5\u90E8\u5206
log4j.logger.org.mybatis=DEBUG
#log4j.logger.cn.tibet.cas.dao=DEBUG
#log4j.logger.org.mybatis.common.jdbc.SimpleDataSource=DEBUG#
#log4j.logger.org.mybatis.common.jdbc.ScriptRunner=DEBUG#
#log4j.logger.org.mybatis.sqlmap.engine.impl.SqlMapClientDelegate=DEBUG#
#log4j.logger.java.sql.Connection=DEBUG
log4j.logger.java.sql=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.ResultSet=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG
- redis.properties
# Redis settings
redis.host=192.168.220.154
redis.port=6379
redis.pass=
redis.maxIdle=300
redis.maxActive=600
redis.maxWait=1000
redis.testOnBorrow=true
redis.pass= 我没有设置密码 所以是空的
- springmvc.xml
5242880
error_fileupload
- sqlMapConfig.xml
- PersonController
package com.book.controller;
import java.util.ArrayList;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import com.alibaba.fastjson.JSONObject;
import com.book.model.Person;
import com.book.service.PersonService;
@Controller
public class PersonController {
@Autowired
private PersonService personService;
public void setUserService(PersonService personService) {
this.personService = personService;
}
@RequestMapping("/person")
public ModelAndView person(){
Person person =personService.find(2);
String str= person.toString();
return new ModelAndView("message","str",str);
}
@RequestMapping("/personlist")
public ModelAndView personlist(){
List
person= new ArrayList
();
person=personService.FindAll();
JSONObject json=new JSONObject();
json.put("person", person);
return new ModelAndView("message","str",json);
}
@RequestMapping("/addPerson")
public ModelAndView addPerson(){
Person person = new Person();
person.setName("hehe");
person.setAge(22);
personService.addPerson(person);
return new ModelAndView("message","str","aa");
}
@RequestMapping("/getById")
public ModelAndView getById(){
Person person =personService.getById(2);
String str= person.toString();
return new ModelAndView("message","str",str);
}
}
- PersonMapper
package com.book.dao;
import java.util.List;
import com.book.model.Person;
public interface PersonMapper {
public Person find(int id);
public List
FindAll();
public Person getByName(String name);
public void addPerson(Person person);
public Person getById(int id);
}
- PersonMapper.xml
<cache eviction="LRU" type="com.book.util.RedisCache" /> 这里是最重要的部分
- Person
package com.book.model;
import java.io.Serializable;
public class Person implements Serializable{
private Integer id;
private String name;
private Integer age;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Person(){
super();
}
@Override
public String toString() {
return "Person [Id=" + id + ", Name=" + name
+ ", age=" + age + "]";
}
}
- PersonService
package com.book.service;
import java.util.List;
import com.book.model.Person;
public interface PersonService {
public Person find(int id);
public List
FindAll();
public Person getByName(String name);
public void addPerson(Person person);
public Person getById(int id);
}
- PersonServiceImpl
package com.book.service.impl;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.book.dao.PersonMapper;
import com.book.model.Person;
import com.book.service.PersonService;
@Service
public class PersonServiceImpl implements PersonService {
@Autowired
private PersonMapper personDao;
public void setUserDao(PersonMapper personDao) {
this.personDao = personDao;
}
public Person find(int id) {
return personDao.find(id);
}
public List
FindAll() {
return personDao.FindAll();
}
public Person getByName(String name) {
return personDao.getByName(name);
}
public void addPerson(Person person) {
personDao.addPerson(person);
}
public Person getById(int id) {
return personDao.getById(id);
}
}
- RedisCache
package com.book.util;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
import org.apache.ibatis.cache.Cache;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.data.redis.connection.jedis.JedisConnection;
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
import org.springframework.data.redis.serializer.JdkSerializationRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializer;
import redis.clients.jedis.exceptions.JedisConnectionException;
/**
*
* @描述: 使用第三方内存数据库Redis作为二级缓存
* @版权: Copyright (c) 2016
* @作者:
* @版本: 1.0
* @创建日期:
* @创建时间:
*/
public class RedisCache implements Cache {
private static final Logger logger = LoggerFactory.getLogger(RedisCache.class);
private static JedisConnectionFactory jedisConnectionFactory;
private final String id;
/**
* The {@code ReadWriteLock}.
*/
private final ReadWriteLock readWriteLock = new ReentrantReadWriteLock();
public RedisCache(final String id) {
if (id == null) {
throw new IllegalArgumentException("Cache instances require an ID");
}
logger.debug("MybatisRedisCache:id=" + id);
this.id = id;
}
public void clear() {
JedisConnection connection = null;
try {
connection = jedisConnectionFactory.getConnection();
connection.flushDb();
connection.flushAll();
} catch (JedisConnectionException e) {
e.printStackTrace();
} finally {
if (connection != null) {
connection.close();
}
}
}
public String getId() {
return this.id;
}
public Object getObject(Object key) {
Object result = null;
JedisConnection connection = null;
try {
connection = jedisConnectionFactory.getConnection();
RedisSerializer