springboot+mybatis整合redis缓存(亲测有效)
Springboot + mybatis整合redis实现缓存,主要是redis为了提升访问速度,一般会将经常查询且不会经常发生改变的数据存入缓存,然后从缓存中查询数据,提升查询速度。并且采用Mybatis作为我们的ORM框架。为了提升性能,我们将Redis作为Mybatis的二级缓存。
ORM框架:
ORM(Object Relational Mapping)框架采用元数据来描述对象与关系映射的细节,元数据一般采用XML格式,并且存放在专门的对象一映射文件中。简单理解为一种框架的格式
只要提供了持久化类与表的映射关系,ORM框架在运行时就能参照映射文件的信息,把对象持久化到数据库中。当前ORM框架主要有五种:Hibernate(Nhibernate),iBATIS,mybatis,EclipseLink,JFinal。
ORM是通过使用描述对象和数据库之间映射的元数据,在我们想到描述的时候自然就想到了xml和特性(Attribute).目前的ORM框架中,Hibernate就是典型的使用xml文件作为描述实体对象的映射框架,而大名鼎鼎的Linq则是使用特性(Attribute)来描述的。
开发环境/工具:
idea
jdk1.8
mysql
redis
RedisDesktopManager(用于查看,可用可不用)
开始:
idea创建好springboot项目并生成所需要的实体类以及mapper/mapping
创建完毕后项目结构如下图:
其中:pom.xml
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.4</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
<!--redis-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
<version>2.3.4.RELEASE</version>
</dependency>
<!--lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.16</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
application.yml
server:
port: 8080 #设置端口号
#配置数据源
spring:
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/test1
username: root
password: ******
#springboot集成redis
redis:
host: 127.0.0.1 #redis服务器地址
database: 0 #Redis数据库索引(默认为0)
port: 6379 #端口号(默认6379)
jedis:
pool:
max-active: 8 #连接池最大连接数(使用负值表示没有限制)
max-idle: 8
min-idle: 0
mybatis:
#扫描实体类的位置,在此处指明扫描实体类的包,在mapper中就可以不用写实体类的全路径名了
typeAliasesPackage: cn.demo.springboot.springboot_mybatis_redis.model
mapperLocations: classpath:mappers/*.xml
controller,service,dao以及mapping映射文件代码
/**
* 〈用户表controller层〉
*
* @author txy
* @create 2021/3/10
* @since 1.0.0
*/
@RestController
@EnableAutoConfiguration
public class UserController {
@Autowired
private UserService userService;
@GetMapping("/queryall")
public List<User> getAllUser() {
return userService.queryAllUser();
}
@GetMapping("/getuser/{uid}")
public User getUser(@PathVariable("uid") Integer uid) {
// System.out.println("进入了这个方法!");
return userService.queryUserById(uid);
}
}
/**
* 〈用户表controller层〉
*
* @author txy
* @create 2021/3/10
* @since 1.0.0
*/
@RestController
@EnableAutoConfiguration
public class UserController {
@Autowired
private UserService userService;
@GetMapping("/queryall")
public List<User> getAllUser() {
return userService.queryAllUser();
}
@GetMapping("/getuser/{uid}")
public User getUser(@PathVariable("uid") Integer uid) {
System.out.println("进入了这个方法!");
return userService.queryUserById(uid);
}
}
/**
* 〈用户表service层接口〉
*
* @author txy
* @create 2021/3/10
* @since 1.0.0
*/
public interface UserService {
/**
* 查询所有
* @return
*/
public List<User> queryAllUser();
/**
* 根据UID查询用户
* @param uid
* @return
*/
public User queryUserById(Integer uid);
}
/**
* 〈用户表service层实现类〉
*
* @author txy
* @create 2021/3/10
* @since 1.0.0
*/
@Service
public class UserServiceImpl implements UserService {
@Resource
private UserMapper userMapper;
/**
* 连接池自动管理,提供了一个高度封装的“RedisTemplate”类
* 由spring-data-redis针对jedis提供
*/
@Autowired
private RedisTemplate redisTemplate;
@Override
public List<User> queryAllUser() {
return userMapper.queryAllUser();
}
/**
* 获取用户策略:先从缓存中获取用户,没有则取数据表中查数据,再将数据写入缓存
* ValueOpertions 说明:只能一个键对应一个值.可以存放Map List等json
* @param uid
* @return
*/
@Override
public User queryUserById(Integer uid) {
String key = uid+"";
// 取出key值所对应的值(String类型)
ValueOperations<String,User> operations = redisTemplate.opsForValue();
// 判断是否有key所对应的值,有则返回true,没有则返回false
Boolean hasKey = redisTemplate.hasKey(key);
//如果缓存中存在就从缓存中获取数据
if (hasKey){
User user = operations.get(key);
System.out.println("==========从缓存中获得数据=========");
System.out.println(user.getUSER_NAME());
System.out.println("==============================");
return user;
} else{
User user = userMapper.queryUserById(uid);
System.out.println("==========从数据表中获得数据=========");
System.out.println(user.getUSER_NAME());
System.out.println("==============================");
//插入缓存将user放入redis中有效时间为5分钟
operations.set(key, user,5, TimeUnit.MINUTES);
return user;
}
}
}
<?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="cn.demo.springboot.springboot_mybatis_redis.mapper.UserMapper">
<resultMap id="result" type="cn.cszhibang.springboot.springboot_mybatis_redis.model.User">
<result property="uid" column="UID" jdbcType="INTEGER"/>
<result property="USER_NAME" column="USER_NAME" jdbcType="VARCHAR"/>
<result property="PWD" column="PWD" jdbcType="VARCHAR"/>
<result property="STAT" column="STAT" jdbcType="INTEGER"/>
</resultMap>
<!--查询所有-->
<select id="queryAllUser" resultMap="result">
SELECT * FROM `user`
</select>
<!--根据ID进行查询-->
<select id="queryUserById" parameterType="int" resultMap="result">
SELECT * FROM `user` WHERE UID=#{uid}
</select>
</mapper>
主启动类:
@SpringBootApplication
@MapperScan("cn.cszhibang.springboot.springboot_mybatis_redis.mapper")
@EnableCaching // @EnableCaching注解是spring framework中的注解驱动的缓存管理功能
public class SpringbootMybatisRedisApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootMybatisRedisApplication.class, args);
}
}
浏览器测试:
测试前先在本地mysql数据库里新建user表,插入多条测试数据,并且启动本地Redis服务
redis在本地进行启动的方式:
使用cmd命令行进行过操作
在本地配置好redis之后,启动的话是比较简单的
1、首先打开cmd运行界面
2、定位到本地redis目录
3、运行命令cd C:\Program Files\Redis ==> redis-server.exe redis.windows.conf 就可以了
附上本地运行截图 :
redis安装后,输入redis-server.exe redis.windows.conf无法启动
报错信息:
[10108] 15 Jan 11:04:56.622 # Creating Server TCP listening socket 127.0.0.1
按照以下命令输入:
1.redis-cli.exe
2. shutdown
3. exit
4. redis-server.exe redis.windows.conf
操作以上四步即可解决报错问题
第一次访问控制台输出:
第二次访问控制台输出:
经过以上操作,SpringBoot+Mybatis+redis即操作完成!