SpringBoot整合Mysql和Redis的详细过程
作者:路上的追梦人 发布时间:2024-01-27 02:18:01
标签:SpringBoot,整合,Mysql,Redis
一、项目创建
1.1 创建项目
在IDEA中,File--New--Project--Spring Initializer
名称为springboot-mysql-redis
1.2 目录结构
1.3 pom.xml配置文件
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/mybatis?serverTimezone=UTC
username: root
password: 1234
redis:
host: localhost
port: 6379
server:
port: 8080
mybatis:
mapper-locations: classpath:mapper/*xml
type-aliases-package: com.xsbc.entity
# 开启驼峰命名
configuration:
map-underscore-to-camel-case: true
二、初始化数据库
drop database if exists blog;
create database blog;
user blog;
drop table if exists user;
create table user(
id int(11) not null,
name varchar(255) DEFAULT "",
age int(11) DEFAULT 0,
PRIMARY KEY(id)
)ENGINE=INNODB DEFAULT CHARSET=utf8;
insert into user values(1,'小王',20);
insert into user values(2,'老李',23);
三、初始化代码
3.1 实体类entity
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
private int id;
private String name;
private int age;
}
3.2 Mapper接口类
@Mapper
public interface UserMapper {
List<User> getAllUsers();
int updateUser(Integer id);
}
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.xsbc.mapper.UserMapper">
<select id="getAllUsers" resultType="com.xsbc.entity.User">
select * from user
</select>
<!-- User类的id参数是int类型,mysql默认是Integer -->
<update id="updateUserAgeById" parameterType="java.lang.Integer">
update user set age=age+2 where id=#{id}
</update>
</mapper>
3.3 Redis工具类
1)config包创建类
Redis常量类RedisConstant
public class RedisConstant {
public static String ALL_USER_KEY="allUser";
}
Redis配置类RedisConfig
@Configuration
public class RedisConfig {
@Resource
private RedisTemplate redisTemplate;
@Bean
public RedisTemplate redisTemplateInit(){
//序列化key的实例化对象
redisTemplate.setKeySerializer(new StringRedisSerializer());
//序列化value的实例化对象
redisTemplate.setValueSerializer(
new GenericJackson2JsonRedisSerializer());
return redisTemplate;
}
}
2)util包下创建类
@Component
public class RedisUtil {
@Resource
private RedisTemplate<String,Object> redisTemplate;
public void setRedisTemplate(RedisTemplate<String,Object> redisTemplate){
this.redisTemplate=redisTemplate;
}
// 指定缓存失效时间
public boolean expire(String key,long time) {
try {
if (time > 0) {
redisTemplate.expire(key, time, TimeUnit.SECONDS);
}
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
// 根据key获取过期时间
public long getExpire(String key){
return redisTemplate.getExpire(key,TimeUnit.SECONDS);
// 判断key是否存在
public boolean hasKey(String key){
return redisTemplate.hasKey(key);
}catch(Exception e){
// 删除缓存
@SuppressWarnings("unchecked")
public void del(String... key){
if (key!=null&&key.length> 0){
if (key.length==1) {
redisTemplate.delete(key[0]);
}else{
redisTemplate.delete(
(Collection<String>)CollectionUtils.arrayToList(key));
// 普通缓存获取
public Object get(String key){
return key==null?null:redisTemplate.opsForValue().get(key);
// 普通缓存放入
public boolean set(String key,Object value){
redisTemplate.opsForValue().set(key,value);
// 普通缓存放入并设置时间
public boolean set(String key,Object value,long time){
try{
if(time>0){
redisTemplate.opsForValue()
.set(key,value,time,TimeUnit.SECONDS);
set(key,value);
// 递增
public long incr(String key,long delta){
if(delta<0){
throw new RuntimeException("递增因子必须大于0");
return redisTemplate.opsForValue().increment(key,delta);
// 递减
public long decr(String key, long delta){
throw new RuntimeException("递减因子必须大于0");
return redisTemplate.opsForValue().increment(key,-delta);
// HashGet
public Object hget(String key,String item){
return redisTemplate.opsForHash().get(key,item);
// 获取hashKey对应的所有键值
public Map<Object, Object> hmget(String key){
return redisTemplate.opsForHash().entries(key);
// HashSet
public boolean hmset(String key,Map<String, Object> map){
redisTemplate.opsForHash().putAll(key,map);
// HashSet 并设置时间
public boolean hmset(String key,Map<String, Object> map,long time){
redisTemplate.opsForHash().putAll(key, map);
if (time>0){
expire(key,time);
// 向一张hash表中放入数据,如果不存在将创建
public boolean hset(String key,String item,Object value){
redisTemplate.opsForHash().put(key,item,value);
public boolean hset(String key,String item,Object value,long time){
// 删除hash表中的值
public void hdel(String key,Object... item) {
redisTemplate.opsForHash().delete(key,item);
// 判断hash表中是否有该项的值
public boolean hHasKey(String key,String item) {
return redisTemplate.opsForHash().hasKey(key,item);
// hash递增 如果不存在,就会创建一个 并把新增后的值返回
public double hincr(String key,String item,double by) {
return redisTemplate.opsForHash().increment(key,item,by);
// hash递减
public double hdecr(String key,String item,double by) {
return redisTemplate.opsForHash().increment(key,item,-by);
// 根据key获取Set中的所有值
public Set<Object> sGet(String key) {
return redisTemplate.opsForSet().members(key);
return null;
// 根据value从一个set中查询,是否存在
public boolean sHasKey(String key,Object value) {
return redisTemplate.opsForSet().isMember(key,value);
// 将数据放入set缓存
public long sSet(String key,Object... values) {
return redisTemplate.opsForSet().add(key,values);
return 0;
// 将set数据放入缓存
public long sSetAndTime(String key,long time,Object... values){
Long count=redisTemplate.opsForSet().add(key,values);
if (time> 0)expire(key, time);
return count;
// 获取set缓存的长度
public long sGetSetSize(String key){
return redisTemplate.opsForSet().size(key);
// 移除值为value的
public long setRemove(String key,Object... values){
Long count=redisTemplate.opsForSet().remove(key,values);
// 获取list缓存的内容
public List<Object> lGet(String key,long start,long end){
return redisTemplate.opsForList().range(key,start,end);
// 获取list缓存的长度
public long lGetListSize(String key){
return redisTemplate.opsForList().size(key);
// 通过索引 获取list中的值
public Object lGetIndex(String key,long index){
return redisTemplate.opsForList().index(key,index);
// 将list放入缓存
public boolean lSet(String key, Object value){
redisTemplate.opsForList().rightPush(key,value);
public boolean lSet(String key,Object value,long time){
if (time > 0) expire(key, time);
public boolean lSet(String key, List<Object> value){
redisTemplate.opsForList().rightPushAll(key,value);
public boolean lSet(String key,List<Object> value,long time){
if(time>0) expire(key, time);
// 根据索引修改list中的某条数据
public boolean lUpdateIndex(String key,long index,Object value){
redisTemplate.opsForList().set(key,index,value);
// 移除N个值为value
public long lRemove(String key,long count,Object value){
Long remove=redisTemplate.opsForList().remove(key,count,value);
return remove;
}
3.4 Service层
1)UserService接口类
public interface UserService {
public List<User> getAllUsers();
public void updateUserAge();
}
2)接口实现类
@Service("userService")
public class UserServiceImpl implements UserService {
@Resource
private UserMapper userMapper;
@Autowired
private RedisUtil redisUtil;
@Override
public List<User> getAllUsers() {
List<User> users=(List<User>)redisUtil
.get(RedisConstant.ALL_USER_KEY);
if(CollectionUtils.isEmpty(users)){
users=userMapper.getAllUsers();
redisUtil.set(RedisConstant.ALL_USER_KEY,users);
}
return users;
}
@Transactional
public void updateUserAge() {
redisUtil.del(RedisConstant.ALL_USER_KEY);
userMapper.updateUserAgeById(1);
userMapper.updateUserAgeById(2);
}
3.5 Controller层
@Controller
public class UserController {
@Autowired
private UserService userService;
@RequestMapping("/getAll")
@ResponseBody
public List<User> getUsers(){
return userService.getAllUsers();
}
@RequestMapping("/update")
@ResponseBody
public int updateUser(){
userService.updateUserAge();
return 1;
}
}
四、单元测试
4.1 Respository和Service层单元测试
@SpringBootTest
class SpringbootMysqlRedisApplicationTests {
@Autowired
private UserMapper userMapper;
private UserService userService;
@Test
void testUserMapper(){
userMapper.updateUserAgeById(1);
List<User> users=userMapper.getAllUsers();
for(User user:users){
System.out.println(user);
}
}
void testUserService(){
userService.updateUserAge();
List<User> users=userService.getAllUsers();
}
4.2 Controller层接口测试
来源:https://blog.csdn.net/Jiangtagong/article/details/122960915
0
投稿
猜你喜欢
- 一、使用loadVariables 一个例子简单的描述了如何通过GET方法向服务器端的ASP发送请求: _root. pushAc
- Bytes和Str的区别在Python3中,字符序列有两种类型:bytes和str。bytes类型是无符号的8位值(通常以ASCII码显式)
- 豆瓣电影排行榜前250 分为10页,第一页的url为https://movie.douban.com/top250,但实际上应该是https
- 一、问题描述 SQL Plus WorkSheet是一个窗口图形界面的SQL语句编辑器,对于那些喜欢窗口界面而不喜欢字符界面的用户,该工具相
- 一.图像量化处理原理量化(Quantization)旨在将图像像素点对应亮度的连续变化区间转换为单个特定值的过程,即将原始灰度图像的空间坐标
- 从一个通道的图片进行卷积生成新的单通道图的过程很容易理解,对于多个通道卷积后生成多个通道的图理解起来有点抽象。本文以通俗易懂的方式讲述卷积,
- 本文实例为大家分享了python代码实现猜拳小游戏的具体代码,供大家参考,具体内容如下游戏实现具体功能原有的用户登录的信息均能保存在txt文
- # _*_ coding: utf-8 _*_#---------------------------------------#
- 导语亲爱的小可爱们,大家好! 欢迎来到木子的游戏编程空间经常听到有朋友说,学习编程是一件非常枯燥无味的事情。其实,大家有没有认真想过,可能是
- YAML是一种直观的能够被电脑识别的的数据序列化格式,容易被人类阅读,并且容易和脚本语言交互。YAML类似于XML,但是语法比XML简单得多
- 本文实例讲述了Python3写入文件常用方法。分享给大家供大家参考。具体如下:''''' Creat
- 本文实例为大家分享了Python使用tkinter实现小时钟效果的具体代码,供大家参考,具体内容如下自己又调试了一下,分享一下# codin
- 使用环境:Win10 x64 Python:3.6.4 SqlServer:2008R2 因为
- 使用 Django 或 Flask 这种框架开发 web app 的时候一般都会用内建服务器开发和调试程序,等程序完成后再移交到生产环境部署
- 本文较为详细的分析了php提示Failed to write session data错误的解决方法。分享给大家供大家参考。具体方法如下:一
- 随机生成10位数密码,字母和数字组合import string>>> import random>>>
- 一、调用百度接口进行人脸属性识别安装好baidu-aip模块,获取了百度AI接口密钥后,即可调用百度接口进行人脸属性识别了。首先以杨紫的图片
- 数据库:保存图片的数据格式 图象二进制数据储存字段前台: <%@ Page Language="C#" AutoE
- pip是一个很好用的第三方库安装方式,但是默认的源没法连接,就算有时候可以成功率也很低,所以换成国内镜像源比较方便。将pip源更换到国内镜像
- 有时候系统会以pytest的形式运行,如果不想以这种方式运行,换回普通模式,那么就点击画圈圈那里的白色三角行点击Edit configura