创建spring boot工程
勾选相关需要的依赖
使用mybatis-plus操作数据库还需要引入mybatis-plus和自动生成代码的依赖
<!-- mybatis-plus自动代码生成器1 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.5.1</version>
</dependency>
<!-- mybatis-plus自动代码生成器2 -->
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.31</version>
</dependency>
<!-- springboot整合mybatis-plus-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.2</version>
</dependency>
创建数据库和User表 并添加一条数据
在测试类中写入以下代码,完成mapper,service,controller和entity的创建,注意文件路径不要写错了
public static void main(String[] args) {
FastAutoGenerator.create("jdbc:mysql://localhost:3306/spring-redis-study?serverTimezone=GMT%2B8", "root", "root")
.globalConfig(builder -> {
builder.author("紫金") // 设置作者
//.enableSwagger() // 开启 swagger 模式
.fileOverride() // 覆盖已生成文件
.outputDir("C:\\Users\\23500\\Desktop\\springboot-redis\\src\\main\\java"); // 指定输出目录
})
.packageConfig(builder -> {
builder.parent("com") // 设置父包名
.moduleName("springboot_redis") // 设置父包模块名
.pathInfo(Collections.singletonMap(OutputFile.mapperXml,
"C:\\Users\\23500\\Desktop\\springboot-redis\\src\\main\\resources\\mapper")); // 设置mapperXml生成路径
})
.strategyConfig(builder -> {
builder.addInclude("user");//设置需要生成的表
})
.templateEngine(new FreemarkerTemplateEngine()) // 使用Freemarker引擎模板,默认的是Velocity引擎模板
.execute();
}
注解@MapperScan,注意,如果使用@MapperScan在启动类上,在属性注入调用 Mapper时可能会爆红,这是idea机制的问题与代码无关,要想不暴红不使用@MapperScan,在每个mapper文件上注解@Mapper即可解决爆红问题
配置数据源,创建application.yml文件,写入连接的条件,到此springboot整合mybatis-plus demo项目完成
接下来整合redis,首先在windows或者是linux上开启redis
开启redis之后,在aplication.yml文件中进行配置,redis服务器地址在linux通过ifconfig命令查看 (同时配置端口号 server.port=8080)
引入redis有关依赖
<!-- springboot整合redis的依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!-- spring2.X集成redis所需common-pool2-->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
<version>2.6.0</version>
</dependency>
现在进行测试,在controller中通过方法进行检验连接redis有啥问题没有
写好controller层后启动springboot结果发现报如下错误,错误的原因我的理解是版本的问题,springboot的版本太高整合redis时就会报错,我这里是2.6.10,把他改为2.5.0即可 (修改了pom.xml记得刷新)
再次启动服务器没有报错,打开浏览器,输入请求地址,发现能从redis中获取数据
打开redis,查看数据,发现数据乱码,因为RedisTemplate默认采用的是JDK的序列化策略,保存的key和value都是采用此策略序列化保存的,因此redisTemplate在存储时, 可能出现乱码现象
解决乱码问题,需要创建config文件夹,在文件夹中创建RedisConfig.java文件,写入以下代码(这里可以直接粘贴赋值)
package com.springboot_redis.config;
import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.CachingConfigurerSupport;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.cache.RedisCacheConfiguration;
import org.springframework.data.redis.cache.RedisCacheManager;
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.RedisSerializationContext;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import java.time.Duration;
@EnableCaching
@Configuration
public class RedisConfig extends CachingConfigurerSupport {
@Bean("redisTemplate")
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
RedisTemplate<String, Object> template = new RedisTemplate<>();
RedisSerializer<String> redisSerializer = new StringRedisSerializer();
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
ObjectMapper om = new ObjectMapper();
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(om);
template.setConnectionFactory(factory);
//key序列化方式
template.setKeySerializer(redisSerializer);
//value序列化
template.setValueSerializer(jackson2JsonRedisSerializer);
//value hashmap序列化
template.setHashValueSerializer(jackson2JsonRedisSerializer);
return template;
}
@Bean
public CacheManager cacheManager(RedisConnectionFactory factory) {
RedisSerializer<String> redisSerializer = new StringRedisSerializer();
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
//解决查询缓存转换异常的问题
ObjectMapper om = new ObjectMapper();
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(om);
// 配置序列化(解决乱码的问题),过期时间600秒
RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
.entryTtl(Duration.ofSeconds(600))
.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(redisSerializer))
.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSerializer))
.disableCachingNullValues();
RedisCacheManager cacheManager = RedisCacheManager.builder(factory)
.cacheDefaults(config)
.build();
return cacheManager;
}
}
重新启动springboot,清空redis数据库中的内容,在浏览器中重新发送请求,之后在linux中查看,发现乱码问题解决
至此,springboot整合redis完成。不过注意,在向redis中存数据时,存的是list集合到redis中,而获取的是Object类型,这里可以通过阿里提供的数据转换进行操作,首先导入依赖
<!-- 阿里提供的json数据转换-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.60</version>
</dependency>
刷新pom.xml之后把在controller中进行代码修改(使用StringRedisTemplate)
之后,在浏览器中获取的值就是集合类型