springBoot+mybatis+redis整合,这里搭建一个简单的框架是为了记录怎么使用redis做缓存。
一、构建一个springboot的maven项目,目录结构如下:
二、在pom.xml文件中引入依赖jar包
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--mybatis整合springboot-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.0.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!--redis缓存-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!--mysql JDBC驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.39</version>
</dependency>
<!--这个特别记得引入-->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
<version>2.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
</dependencies>
三、application.properties配置文件
server.port=8029
数据库连接
spring.datasource.url=jdbc:mysql://localhost:3306/redis_test?useUnicode=true
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.username=root
spring.datasource.password=123456
#mybatis配置
mybatis.type-aliases-package=com.example.springboot_redis.entity
mybatis.mapper-locations=classpath:mapper/*.xml
#打印sql时的语句 ========================
logging.level.com.acong.dao = debug
logging.file=d:/logs/bsbdj.log
#将themilef的默认缓存禁用,热加载生效
spring.thymeleaf.cache=false
#redis配置
spring.redis.database=0
spring.redis.host=localhost
spring.redis.port=6379
spring.redis.password=
#redis最大池连接数
spring.redis.jedis.pool.max-active=8
#redis最大空闲连接
spring.redis.jedis.pool.max-idle=8
#redis最大阻塞等待时间(负值表示无限制)
spring.redis.jedis.pool.max-wait=1001
#redis最小空闲连接
spring.redis.lettuce.pool.min-idle=0
#redis 超时时间
spring.redis.timeout=12000
四、框架代码:
1、创建一个User实体,和数据库表对应。注意这里实体一定要序列化,redis存储对象的时候要序列化存储
public class User implements Serializable {
private static final long serialVersionUID = 1L;
private String id;
private String name;
private String password;
private String phone;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
}
2、创建数据交互层UserDao接口,加上@Mapper注解
@Mapper
public interface UserDao {
public User findById(String id);
public int delete(String id);
public int update(String id);
}
3、mapper.xml配置文件,这里SQL中id和UserDao接口的方法对应。不知道的先学习mybatis
<?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.example.springboot_redis.dao.UserDao">
<select id="queryAll" resultType="com.example.springboot_redis.entity.User">
select * from user
</select>
<select id="findById" resultType="com.example.springboot_redis.entity.User" parameterType="String">
select * from user where id = #{id}
</select>
<update id="update" parameterType="String">
update user set name = 'tom'
where id = #{id}
</update>
<delete id="delete" parameterType="String">
delete from user where id = #{id}
</delete>
</mapper>
4、创建UserService接口以及接口实现类
//接口
public interface UserService {
public User findById(String id);
public int delete(String id);
public int update (String id);
}
//实现类
@Transactional
@Service("UserService")
public class UserServiceImpl implements UserService {
@Autowired
private UserDao userDao;
@Autowired
private RedisTemplate redisTemplate;
@Override
public User findById(String id) {
String key = "user_"+id;
//先从缓存获取用户,如果没有再从数据库获取
ValueOperations<String,User> valueOperations = redisTemplate.opsForValue();
boolean haskey = redisTemplate.hasKey(key);
if(haskey){
User user = valueOperations.get(key);
System.out.println("缓存中获取数据=="+user.getName());
return user;
}else {
User user = userDao.findById(id);
System.out.println("从数据库=="+user.getName());
valueOperations.set(key,user,5, TimeUnit.HOURS); //写入缓存
return user;
}
}
@Override
public int delete(String id) {
int result = userDao.delete(id);
String key = "user_"+id;
//先删除数据库数据再删除缓存数据
if(result != 0){
if(redisTemplate.hasKey(key)){
redisTemplate.delete(key);
}
}
return result;
}
@Override
public int update(String id) {
int result = userDao.update(id);
String key = "user_" + id;
if(result!=0){
if(redisTemplate.hasKey(key)){
redisTemplate.delete(key);
}
//重新写入缓存
User user = userDao.findById(id);
redisTemplate.opsForValue().set(key,user,5,TimeUnit.HOURS);
}
return result;
}
}
5、创建控制层;
@RestController
@RequestMapping("/test")
public class UserController {
@Autowired
private UserService userService;
@Autowired
private RedisTemplate redisTemplate;
@GetMapping("{id}/findById")
public User test(@PathVariable("id") String id){
return userService.findById(id);
}
@GetMapping("/find")
public User hh(){
String key = "user_"+"faffdasf45485fdas54f5daf4";
ValueOperations<String,User> valueOperations = redisTemplate.opsForValue();
return valueOperations.get(key);
}
@GetMapping("{id}/del")
public int delele(@PathVariable("id") String id){
return userService.delete(id);
}
@GetMapping("{id}/up")
public int up(@PathVariable("id") String id){
return userService.update(id);
}
}
五、接口测试结果
1.查看