diff --git a/9.Spring-Boot-Redis-Cache/pom.xml b/9.Spring-Boot-Redis-Cache/pom.xml
new file mode 100644
index 0000000..8b9b6f0
--- /dev/null
+++ b/9.Spring-Boot-Redis-Cache/pom.xml
@@ -0,0 +1,81 @@
+
+
+ 4.0.0
+
+ com.springboot
+ Spring-Boot-Redis-Cache
+ 0.0.1-SNAPSHOT
+ jar
+
+ demo
+ Demo project for Spring Boot
+
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 1.5.9.RELEASE
+
+
+
+
+ UTF-8
+ UTF-8
+ 1.7
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+
+
+ org.mybatis.spring.boot
+ mybatis-spring-boot-starter
+ 1.3.1
+
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+
+ org.springframework.boot
+ spring-boot-starter-cache
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-data-redis
+
+
+
+
+ com.oracle
+ ojdbc6
+ 6.0
+
+
+ com.alibaba
+ druid-spring-boot-starter
+ 1.1.6
+
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+
+
+
diff --git a/9.Spring-Boot-Redis-Cache/src/main/java/com/springboot/Application.java b/9.Spring-Boot-Redis-Cache/src/main/java/com/springboot/Application.java
new file mode 100644
index 0000000..ccfc0ab
--- /dev/null
+++ b/9.Spring-Boot-Redis-Cache/src/main/java/com/springboot/Application.java
@@ -0,0 +1,15 @@
+package com.springboot;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.cache.annotation.EnableCaching;
+
+
+@SpringBootApplication
+@EnableCaching
+public class Application {
+
+ public static void main(String[] args) {
+ SpringApplication.run(Application.class,args);
+ }
+}
diff --git a/9.Spring-Boot-Redis-Cache/src/main/java/com/springboot/ApplicationTest.java b/9.Spring-Boot-Redis-Cache/src/main/java/com/springboot/ApplicationTest.java
new file mode 100644
index 0000000..3aff213
--- /dev/null
+++ b/9.Spring-Boot-Redis-Cache/src/main/java/com/springboot/ApplicationTest.java
@@ -0,0 +1,39 @@
+package com.springboot;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+
+import com.springboot.bean.Student;
+import com.springboot.service.StudentService;
+
+@RunWith(SpringJUnit4ClassRunner.class)
+@SpringBootTest(classes = Application.class)
+public class ApplicationTest {
+
+ @Autowired
+ private StudentService studentService;
+
+ @Test
+ public void test1() throws Exception {
+ Student student1 = this.studentService.queryStudentBySno("001");
+ System.out.println("学号" + student1.getSno() + "的学生姓名为:" + student1.getName());
+
+ Student student2 = this.studentService.queryStudentBySno("001");
+ System.out.println("学号" + student2.getSno() + "的学生姓名为:" + student2.getName());
+ }
+
+ @Test
+ public void test2() throws Exception {
+ Student student1 = this.studentService.queryStudentBySno("001");
+ System.out.println("学号" + student1.getSno() + "的学生姓名为:" + student1.getName());
+
+ student1.setName("康康");
+ this.studentService.update(student1);
+
+ Student student2 = this.studentService.queryStudentBySno("001");
+ System.out.println("学号" + student2.getSno() + "的学生姓名为:" + student2.getName());
+ }
+}
diff --git a/9.Spring-Boot-Redis-Cache/src/main/java/com/springboot/bean/Student.java b/9.Spring-Boot-Redis-Cache/src/main/java/com/springboot/bean/Student.java
new file mode 100644
index 0000000..0ff713e
--- /dev/null
+++ b/9.Spring-Boot-Redis-Cache/src/main/java/com/springboot/bean/Student.java
@@ -0,0 +1,31 @@
+package com.springboot.bean;
+
+import java.io.Serializable;
+
+public class Student implements Serializable{
+
+ private static final long serialVersionUID = -339516038496531943L;
+ private String sno;
+ private String name;
+ private String sex;
+ public String getSno() {
+ return sno;
+ }
+ public void setSno(String sno) {
+ this.sno = sno;
+ }
+ public String getName() {
+ return name;
+ }
+ public void setName(String name) {
+ this.name = name;
+ }
+ public String getSex() {
+ return sex;
+ }
+ public void setSex(String sex) {
+ this.sex = sex;
+ }
+
+
+}
diff --git a/9.Spring-Boot-Redis-Cache/src/main/java/com/springboot/config/RedisConfig.java b/9.Spring-Boot-Redis-Cache/src/main/java/com/springboot/config/RedisConfig.java
new file mode 100644
index 0000000..5bae236
--- /dev/null
+++ b/9.Spring-Boot-Redis-Cache/src/main/java/com/springboot/config/RedisConfig.java
@@ -0,0 +1,64 @@
+package com.springboot.config;
+
+import org.springframework.cache.CacheManager;
+import org.springframework.cache.annotation.CachingConfigurerSupport;
+import org.springframework.cache.interceptor.KeyGenerator;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.data.redis.cache.RedisCacheManager;
+import org.springframework.data.redis.connection.RedisConnectionFactory;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.data.redis.core.StringRedisTemplate;
+import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
+
+import com.fasterxml.jackson.annotation.JsonAutoDetect;
+import com.fasterxml.jackson.annotation.PropertyAccessor;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+@Configuration
+public class RedisConfig extends CachingConfigurerSupport {
+
+ // 自定义缓存key生成策略
+ @Bean
+ public KeyGenerator keyGenerator() {
+ return new KeyGenerator() {
+ @Override
+ public Object generate(Object target, java.lang.reflect.Method method, Object... params) {
+ StringBuffer sb = new StringBuffer();
+ sb.append(target.getClass().getName());
+ sb.append(method.getName());
+ for (Object obj : params) {
+ sb.append(obj.toString());
+ }
+ return sb.toString();
+ }
+ };
+ }
+
+ // 缓存管理器
+ @Bean
+ public CacheManager cacheManager(@SuppressWarnings("rawtypes") RedisTemplate redisTemplate) {
+ RedisCacheManager cacheManager = new RedisCacheManager(redisTemplate);
+ // 设置缓存过期时间
+ cacheManager.setDefaultExpiration(10000);
+ return cacheManager;
+ }
+
+ @Bean
+ public RedisTemplate redisTemplate(RedisConnectionFactory factory) {
+ StringRedisTemplate template = new StringRedisTemplate(factory);
+ setSerializer(template);// 设置序列化工具
+ template.afterPropertiesSet();
+ return template;
+ }
+
+ private void setSerializer(StringRedisTemplate template) {
+ @SuppressWarnings({ "rawtypes", "unchecked" })
+ Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
+ ObjectMapper om = new ObjectMapper();
+ om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
+ om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
+ jackson2JsonRedisSerializer.setObjectMapper(om);
+ template.setValueSerializer(jackson2JsonRedisSerializer);
+ }
+}
diff --git a/9.Spring-Boot-Redis-Cache/src/main/java/com/springboot/mapper/StudentMapper.java b/9.Spring-Boot-Redis-Cache/src/main/java/com/springboot/mapper/StudentMapper.java
new file mode 100644
index 0000000..d909f45
--- /dev/null
+++ b/9.Spring-Boot-Redis-Cache/src/main/java/com/springboot/mapper/StudentMapper.java
@@ -0,0 +1,28 @@
+package com.springboot.mapper;
+
+import org.apache.ibatis.annotations.Delete;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Result;
+import org.apache.ibatis.annotations.Results;
+import org.apache.ibatis.annotations.Select;
+import org.apache.ibatis.annotations.Update;
+import org.springframework.cache.annotation.CacheConfig;
+
+import com.springboot.bean.Student;
+
+@Mapper
+@CacheConfig(cacheNames = "student")
+public interface StudentMapper {
+
+ @Update("update student set sname=#{name},ssex=#{sex} where sno=#{sno}")
+ int update(Student student);
+
+ @Delete("delete from student where sno=#{sno}")
+ void deleteStudentBySno(String sno);
+
+ @Select("select * from student where sno=#{sno}")
+ @Results(id = "student", value = { @Result(property = "sno", column = "sno", javaType = String.class),
+ @Result(property = "name", column = "sname", javaType = String.class),
+ @Result(property = "sex", column = "ssex", javaType = String.class) })
+ Student queryStudentBySno(String sno);
+}
diff --git a/9.Spring-Boot-Redis-Cache/src/main/java/com/springboot/service/StudentService.java b/9.Spring-Boot-Redis-Cache/src/main/java/com/springboot/service/StudentService.java
new file mode 100644
index 0000000..cb35c4f
--- /dev/null
+++ b/9.Spring-Boot-Redis-Cache/src/main/java/com/springboot/service/StudentService.java
@@ -0,0 +1,20 @@
+package com.springboot.service;
+
+import org.springframework.cache.annotation.CacheConfig;
+import org.springframework.cache.annotation.CacheEvict;
+import org.springframework.cache.annotation.CachePut;
+import org.springframework.cache.annotation.Cacheable;
+
+import com.springboot.bean.Student;
+
+@CacheConfig(cacheNames = "student")
+public interface StudentService {
+ @CachePut(key = "#p0.sno")
+ Student update(Student student);
+
+ @CacheEvict(key = "#p0", allEntries = true)
+ void deleteStudentBySno(String sno);
+
+ @Cacheable(key = "#p0")
+ Student queryStudentBySno(String sno);
+}
diff --git a/9.Spring-Boot-Redis-Cache/src/main/java/com/springboot/service/impl/StudentServiceImpl.java b/9.Spring-Boot-Redis-Cache/src/main/java/com/springboot/service/impl/StudentServiceImpl.java
new file mode 100644
index 0000000..804962a
--- /dev/null
+++ b/9.Spring-Boot-Redis-Cache/src/main/java/com/springboot/service/impl/StudentServiceImpl.java
@@ -0,0 +1,32 @@
+package com.springboot.service.impl;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Repository;
+
+import com.springboot.bean.Student;
+import com.springboot.mapper.StudentMapper;
+import com.springboot.service.StudentService;
+
+@Repository("studentService")
+public class StudentServiceImpl implements StudentService{
+
+ @Autowired
+ private StudentMapper studentMapper;
+
+ @Override
+ public Student update(Student student) {
+ this.studentMapper.update(student);
+ return this.studentMapper.queryStudentBySno(student.getSno());
+ }
+
+ @Override
+ public void deleteStudentBySno(String sno) {
+ this.studentMapper.deleteStudentBySno(sno);
+ }
+
+ @Override
+ public Student queryStudentBySno(String sno) {
+ return this.studentMapper.queryStudentBySno(sno);
+ }
+
+}
diff --git a/9.Spring-Boot-Redis-Cache/src/main/resources/application.yml b/9.Spring-Boot-Redis-Cache/src/main/resources/application.yml
new file mode 100644
index 0000000..bb91f11
--- /dev/null
+++ b/9.Spring-Boot-Redis-Cache/src/main/resources/application.yml
@@ -0,0 +1,90 @@
+server:
+ context-path: /web
+
+spring:
+ datasource:
+ druid:
+ # 数据库访问配置, 使用druid数据源
+ type: com.alibaba.druid.pool.DruidDataSource
+ driver-class-name: oracle.jdbc.driver.OracleDriver
+ url: jdbc:oracle:thin:@localhost:1521:ORCL
+ username: test
+ password: 123456
+ # 连接池配置
+ initial-size: 5
+ min-idle: 5
+ max-active: 20
+ # 连接等待超时时间
+ max-wait: 30000
+ # 配置检测可以关闭的空闲连接间隔时间
+ time-between-eviction-runs-millis: 60000
+ # 配置连接在池中的最小生存时间
+ min-evictable-idle-time-millis: 300000
+ validation-query: select '1' from dual
+ test-while-idle: true
+ test-on-borrow: false
+ test-on-return: false
+ # 打开PSCache,并且指定每个连接上PSCache的大小
+ pool-prepared-statements: true
+ max-open-prepared-statements: 20
+ max-pool-prepared-statement-per-connection-size: 20
+ # 配置监控统计拦截的filters, 去掉后监控界面sql无法统计, 'wall'用于防火墙
+ filters: stat,wall
+ # Spring监控AOP切入点,如x.y.z.service.*,配置多个英文逗号分隔
+ aop-patterns: com.springboot.servie.*
+
+
+ # WebStatFilter配置
+ web-stat-filter:
+ enabled: true
+ # 添加过滤规则
+ url-pattern: /*
+ # 忽略过滤的格式
+ exclusions: '*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*'
+
+ # StatViewServlet配置
+ stat-view-servlet:
+ enabled: true
+ # 访问路径为/druid时,跳转到StatViewServlet
+ url-pattern: /druid/*
+ # 是否能够重置数据
+ reset-enable: false
+ # 需要账号密码才能访问控制台
+ login-username: druid
+ login-password: druid123
+ # IP白名单
+ # allow: 127.0.0.1
+ # IP黑名单(共同存在时,deny优先于allow)
+ # deny: 192.168.1.218
+
+ # 配置StatFilter
+ filter:
+ stat:
+ log-slow-sql: true
+
+ redis:
+ # Redis数据库索引(默认为0)
+ database: 0
+ # Redis服务器地址
+ host: localhost
+ # Redis服务器连接端口
+ port: 6379
+ pool:
+ # 连接池最大连接数(使用负值表示没有限制)
+ max-active: 8
+ # 连接池最大阻塞等待时间(使用负值表示没有限制)
+ max-wait: -1
+ # 连接池中的最大空闲连接
+ max-idle: 8
+ # 连接池中的最小空闲连接
+ min-idle: 0
+ # 连接超时时间(毫秒)
+ timeout: 0
+
+
+logging:
+ level:
+ com:
+ springboot:
+ mapper: debug
+
\ No newline at end of file
diff --git a/9.Spring-Boot-Redis-Cache/src/main/resources/init.sql b/9.Spring-Boot-Redis-Cache/src/main/resources/init.sql
new file mode 100644
index 0000000..15bfe6b
--- /dev/null
+++ b/9.Spring-Boot-Redis-Cache/src/main/resources/init.sql
@@ -0,0 +1,8 @@
+CREATE TABLE STUDENT (
+ SNO VARCHAR2(3 BYTE) NOT NULL ,
+ SNAME VARCHAR2(9 BYTE) NOT NULL ,
+ SSEX CHAR(2 BYTE) NOT NULL
+);
+INSERT INTO STUDENT VALUES ('001', 'KangKang', 'M ');
+INSERT INTO STUDENT VALUES ('002', 'Mike', 'M ');
+INSERT INTO STUDENT VALUES ('003', 'Jane', 'F ');
\ No newline at end of file