携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第1天,点击查看活动详情
简介
本文将从零开始以SpringBoot为基础整合Redis6,并配合mybatis-plus的代码生成器实现基础的mysql+redis双数据源的增删改查
整合mybatis-plus并生成基础框架
-
引入相关依赖
<dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-generator</artifactId> <version>3.5.2</version> </dependency> <!-- 模板引擎 --> <!--代码生成器的freemarker引擎--> <dependency> <groupId>org.freemarker</groupId> <artifactId>freemarker</artifactId> </dependency> <!--用于生成接口文档,此处用于配合代码生成器的swagger注解--> <dependency> <groupId>com.github.xiaoymin</groupId> <artifactId>knife4j-spring-boot-starter</artifactId> <version>3.0.3</version> </dependency> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.5.1</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> <!--SpringBoot集成druid连接池--> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.1.10</version> </dependency> -
写配置文件
spring: datasource: druid: test-while-idle: false password: type: com.alibaba.druid.pool.DruidDataSource url: username: mvc: pathmatch: matching-strategy: ANT_PATH_MATCHER基本上都是很常见的配置,最后的配置是解决引入了swagger项目无法启动的问题(具体原因我也不是太理解,希望理解的小伙伴解惑)
-
配置代码生成器
import com.baomidou.mybatisplus.generator.FastAutoGenerator; import com.baomidou.mybatisplus.generator.config.OutputFile; import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine; import org.junit.jupiter.api.Test; import java.util.Collections; public class CodeGenerator { @Test public void generator(){ FastAutoGenerator.create("url", "username", "password") .globalConfig(builder -> { builder.author("wz") // 设置作者 .disableOpenDir() .enableSwagger() .fileOverride() // 覆盖已生成文件 .outputDir("D:\web\redis-demo\src\main\java"); // 指定输出目录 }) .packageConfig(builder -> { builder.parent("com.wz") // 设置父包名 .moduleName("redis") // 设置父包模块名 .pathInfo(Collections.singletonMap(OutputFile.xml, "D:\web\redis-demo\src\main\resources\mapper")); // 设置mapperXml生成路径 }) .strategyConfig(builder -> { builder.addInclude("t_user") // 设置需要生成的表名 .addTablePrefix("t_"); // 设置过滤表前缀 }) .templateEngine(new FreemarkerTemplateEngine()) // 使用Freemarker引擎模板,默认的是Velocity引擎模板 .execute(); } }这里是直接从mybatis-plus官网复制的,只需要改下数据库信息以及文件输出路径即可,满足基本需求是没有问题的。需要特殊需求的话可以自行翻阅文档 生成完成之后在主启动类上打上@MapperScan注解即可正常启动
-
整合Redis
引入相关依赖
<!--SpringBoot与Redis整合依赖--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>3.1.0</version> </dependency>在yml完善redis相关配置
redis: database: 0 host: port:编写Redis配置类,主要是设置RedisTemplate,不然写入redis的数据会出问题,出现莫名其妙的字符(血泪的教训)
import com.fasterxml.jackson.databind.ObjectMapper; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer; import org.springframework.data.redis.serializer.RedisSerializer; import org.springframework.data.redis.serializer.StringRedisSerializer; import javax.annotation.Resource; @Configuration public class RedisConfig { @Resource RedisConnectionFactory redisConnectionFactory; @Bean public RedisTemplate redisTemplate() { RedisTemplate<Object, Object> template = new RedisTemplate(); template.setConnectionFactory(redisConnectionFactory); Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class); jackson2JsonRedisSerializer.setObjectMapper(new ObjectMapper()); RedisSerializer stringSerializer = new StringRedisSerializer(); template.setKeySerializer(stringSerializer); template.setValueSerializer(jackson2JsonRedisSerializer); template.setHashKeySerializer(stringSerializer); template.setHashValueSerializer(jackson2JsonRedisSerializer); return template; } }启动项目,如果Redis连接失败,可以尝试更改服务器上的Redis配置文件的以下三个配置:
- 修改daemonize 改为 daemonize yes
- 修改protected-mode yes 改为 protected-mode no
- 注释掉 #bin 127.0.0.1
如果redis设置了密码,则需要在yml配置文件里完成配置 到这里,SpringBoot与Redis的整合基本就完成了,剩下的就是测试的工作了。我这里也有写好的基础模板(其实也是根据其他老师的代码写的),贴出来方便大家测试
serviceImpl import com.wz.redis.entity.User; import com.wz.redis.mapper.UserMapper; import com.wz.redis.service.UserService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import lombok.extern.slf4j.Slf4j; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Service; import javax.annotation.Resource; /** * <p> * 用户表 服务实现类 * </p> * * @author wz * @since 2022-08-12 */ @Service @Slf4j public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService { public static final String CACHE_KEY_USER = "user:"; @Resource private UserMapper userMapper; @Resource private RedisTemplate redisTemplate; @Override public void addUser(User user){ int insertCount = userMapper.insert(user); if (insertCount > 0) { user = userMapper.selectById(user.getId()); String key = CACHE_KEY_USER + user.getId(); redisTemplate.opsForValue().set(key, user); } } @Override public void deleteUser(Integer id){ int deleteCount = userMapper.deleteById(id); if (deleteCount > 0) { String key = CACHE_KEY_USER + id; redisTemplate.delete(key); } } @Override public void updateUser(User user){ int updateCount = userMapper.updateById(user); if (updateCount > 0){ user = userMapper.selectById(user.getId()); String key = CACHE_KEY_USER + user.getId(); redisTemplate.opsForValue().set(key, user); } } @Override public User findUserById(Integer id){ String key = CACHE_KEY_USER + id; User user = (User) redisTemplate.opsForValue().get(key); if (user == null) { user = userMapper.selectById(id); if (user == null) { return null; }else { redisTemplate.opsForValue().setIfAbsent(key, user); } } return user; } }controller import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.RandomUtil; import com.wz.redis.entity.User; import com.wz.redis.entity.dto.UserDto; import com.wz.redis.service.UserService; import org.springframework.beans.BeanUtils; import org.springframework.web.bind.annotation.*; import org.springframework.stereotype.Controller; import javax.annotation.Resource; /** * <p> * 用户表 前端控制器 * </p> * * @author wz * @since 2022-08-12 */ @RestController @RequestMapping("/redis/user") public class UserController { @Resource private UserService userService; @PostMapping("/addUser") public void addUser(){ for (int i = 0; i < 5; i++) { User user = new User(); user.setUsername("wz"+i); user.setPassword(IdUtil.simpleUUID().substring(0, 6)); user.setSex(RandomUtil.randomInt(0, 2)); userService.addUser(user); } } @GetMapping("delete/{id}") public void deleteUser(@PathVariable("id") Integer id){ userService.deleteUser(id); } @PostMapping("/updateUser") public void updateUser(@RequestBody UserDto userDto){ User user = new User(); BeanUtils.copyProperties(userDto, user); userService.updateUser(user); } @GetMapping("/findUserById/{id}") public User findUserById(@PathVariable("id") Integer id){ return userService.findUserById(id); } }
结尾
文章到这里就结束了,欢迎大家留言讨论