1.添加依赖
<dependencies> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.1.3</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.1.18</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> <exclusions> <exclusion> <groupId>org.junit.vintage</groupId> <artifactId>junit-vintage-engine</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies>2.编写application.yml
spring: datasource: username: root password: 990515 url: jdbc:mysql://localhost:3306/test?characterEncoding=utf8&useSSL=false&serverTimezone=UTC driver-class-name: com.mysql.cj.jdbc.Driver type: com.alibaba.druid.pool.DruidDataSource redis: port: 6379 host: localhost database: 0 mybatis: type-aliases-package: com.jayce.entity mapper-locations: mapper/*.xml configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl cache-enabled: true #开启二级缓存3.编写entity,dao,service,controller
@Data @NoArgsConstructor @AllArgsConstructor public class User implements Serializable { private static final long serialVersionUID = 313124L; private Integer id; private String username; private String password; } @Mapper public interface UserDao { User getUserById(int id); } @Service public class UserService { @Autowired private UserDao userDao; public User getUserById(int id) { return userDao.getUserById(id); } } @RestController public class UserController { @Autowired private UserService userService; @GetMapping("/user/{id}") public User getUser(@PathVariable("id") int id) { return userService.getUserById(id); } }4.编写UserMapper.xml文件
<?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.jayce.dao.UserDao"> <!-- 开启二级缓存 --> <cache type="com.jayce.cache.RedisCache"/> <!-- User getUserById(int id); --> <select id="getUserById" resultType="user"> select id, username, password from t_user where id = #{id} </select> </mapper>5.自定义 ApplicationContextHolder 类实现 ApplicationContextAware 接口,用于获取 applicationContext
@Component public class ApplicationContextHolder implements ApplicationContextAware { private static ApplicationContext applicationContext; @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { this.applicationContext = applicationContext; } // 通过名称获取bean public static <T> T getBean(String name) { return (T) applicationContext.getBean(name); } }6.编写RedisCache 实现 Cache 接口
public class RedisCache implements Cache { private String id; private RedisTemplate<Object, Object> redisTemplate; // 必须要有这个构造方法,不然会报错(自己尝试去掉该构造方法) public RedisCache(String id) { this.id = id; } public RedisTemplate<Object, Object> getRedisTemplate() { this.redisTemplate = ApplicationContextHolder.getBean("redisTemplate"); return this.redisTemplate; } @Override public String getId() { return this.id; } // 将查询结果保存在redis缓存 @Override public void putObject(Object key, Object value) { redisTemplate = getRedisTemplate(); redisTemplate.opsForValue().set(key, value); } // 从redis缓存中获取值 @Override public Object getObject(Object key) { redisTemplate = getRedisTemplate(); return redisTemplate.opsForValue().get(key); } @Override public Object removeObject(Object key) { return null; } @Override public void clear() { } @Override public int getSize() { return 0; } }id, key, value 分别代表什么 到这里已经实现了mybatis二级缓存和redis的整合了,建议你们每次测试的时候都用flushall指令将redis的缓存清一遍(如果你的redis中没有重要的数据),避免不必要的错误。
