SpringBoot+MyBatis+Redis整合(记录)

  • Post author:
  • Post category:其他




整合分为两步:1、整合MyBatis;2、整合Redis。



(数据库用MySql,自行百度安装。)



一、整合MyBatis。



1、创建SpringBoot项目。



2、在resources下的application.properties配置里添加如下代码:

server.port=8090
## 数据库设置
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/db_bgy?serverTimezone=UTC&useUnicode=true&characterEncoding=utf8
spring.datasource.username=root
spring.datasource.password=root123

## mybatis配置
# 参数类型的包别名设置
mybatis.typeAliasesPackage=com.example.entity
# 指向映射xml文件目录
mybatis.mapperLocations=classpath:mapper/*.xml



3、创建相应的项目目录以及文件,如下图所示:

以上各个文件的代码如下:


(1)UserController代码如下:

@RestController
@RequestMapping("/user")
public class UserController {

    private final UserService userService;

    public UserController(UserService userService) {
        this.userService = userService;
    }

    @RequestMapping(value = "/find_user", method = RequestMethod.POST)
    public Map<String, Object> GetUser(@RequestParam(value = "id", defaultValue = "0") int id){
        User user = userService.findUserById(id);
        if (user != null) {
            return HttpUtils.getResponse(1, user, "请求成功");
        }
        return HttpUtils.getResponse(0, null, "请求失败");
    }
}


附加:如何传入Json对象参数?

1.请求参数格式必须是正确的JSON。

2.在入参中使用注解@RequestBody,用于接收JSON参数,使其自动转对象

3.标识请求参数的格式为JSON—>> @PostMapping(value=”/Test”,produces = “application/json;charset=UTF-8”)


(2)HttpUtils代码如下:

public class HttpUtils {

    public static final int REQUEST_SUCCESS = 1;
    public static final int REQUEST_FAILED = 0;

    /**
     * Http请求接口结果封装方法
     *
     * @param result  请求结果
     * @param object  数据对象
     * @param msg  提示信息
     * @return
     */
    public static Map<String, Object> getResponse(int result, Object object, String msg) {
        Map<String, Object> data = new HashMap<>();
        data.put("result", result);
        data.put("msg", msg);
        data.put("data", object);
        return data;
    }
}


(3)User类的代码如下:

public class User {
    private Integer id;
    private String userName;
    private String passWord;
    private String realName;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getPassWord() {
        return passWord;
    }

    public void setPassWord(String passWord) {
        this.passWord = passWord;
    }

    public String getRealName() {
        return realName;
    }

    public void setRealName(String realName) {
        this.realName = realName;
    }
}


(4)UserMapper.java的代码如下:

@Repository
public interface UserMapper {

    User findUserById(int id);
}


(5)UserService.java的代码如下:

@Service
public class UserService {

    final
    UserMapper userMapper;

    public UserService(UserMapper userMapper) {
        this.userMapper = userMapper;
    }

    public User findUserById(int id){
        return userMapper.findUserById(id);
    }
}


(6)UserMapper.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.example.mapper.UserMapper">

    <resultMap id="BaseResultMap" type="com.example.entity.User">
        <result column="id" jdbcType="INTEGER" property="id" />
        <result column="userName" jdbcType="VARCHAR" property="userName" />
        <result column="passWord" jdbcType="VARCHAR" property="passWord" />
        <result column="realName" jdbcType="VARCHAR" property="realName" />
    </resultMap>

    <select id="findUserById" resultType="com.example.entity.User">
        select * from user where id = #{id}
    </select>

</mapper>



4、在启动文件DemoApplication.java中添加@MapperScan注解。



5、运行项目,然后调试接口结果如下图:



二、整合Redis。



1、安装部署Redis。

下载网址:

https://github.com/tporadowski/redis/releases


(1)下载zip文件,并解压到你想要的目录下即可。


(2)cmd命令,cd到解压目录下,执行运行命令:redis-server.exe。


(3)推荐安装一下redis管理工具:Redis Desktop Manager。(下载地址:自行百度)



2、SpringBoot整合Redis缓存数据库。


(1)pom.xml添加redis依赖。

<!-- redis -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>


(2)添加config文件夹,并创建RedisConfig.java文件,文件代码如下:

@Configuration
@EnableCaching
//Redis 缓存配置类
public class RedisConfig extends CachingConfigurerSupport {

    @Bean
    public CacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) {
        //初始化json的序列化方式
        Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class);
        RedisSerializationContext.SerializationPair<Object> pair = RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSerializer);
        //设置 value 的序列化方式为 jackson2JsonRedisSerializer
        RedisCacheConfiguration defaultCacheConfig=RedisCacheConfiguration.defaultCacheConfig().serializeValuesWith(pair);

        //设置默认超过期时间是100秒
        defaultCacheConfig = defaultCacheConfig.entryTtl(Duration.ofSeconds(100));

        //初始化RedisCacheWriter
        RedisCacheWriter redisCacheWriter = RedisCacheWriter.nonLockingRedisCacheWriter(redisConnectionFactory);
        //初始化RedisCacheManager
        RedisCacheManager cacheManager = new RedisCacheManager(redisCacheWriter, defaultCacheConfig);

        //设置白名单---非常重要********
        //解决查询缓存转换异常的问题
        ObjectMapper om = new ObjectMapper();
        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        om.activateDefaultTyping(LaissezFaireSubTypeValidator.instance , ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.PROPERTY);
        jackson2JsonRedisSerializer.setObjectMapper(om);

        return cacheManager;

    }
}


(3)在配置文件application.properties中添加Redis相关配置代码:

#Redis数据库索引(默认为0)
spring.redis.database=0
#Redis服务器地址
spring.redis.host=127.0.0.1
#Redis服务器连接端口
spring.redis.port=6379
#Redis服务器连接密码(默认为空)
spring.redis.password=
#连接池最大连接数(使用负值表示没有限制)
spring.redis.pool.max-active=10
#连接池最大阻塞等待时间(使用负值表示没有限制)
spring.redis.pool.max-wait=-1
#连接池中的最大空闲连接
spring.redis.pool.max-idle=8
#连接池中的最小空闲连接
spring.redis.pool.min-idle=0
#连接超时时间(毫秒)
spring.redis.timeout=0


(4)在启动文件DemoApplication.java中添加@EnableCaching注解。


(5)在UserService.java中添加Redis缓存注解,代码如下:


(6)请求接口:

http://localhost:8090/user/find_user

,结果如下:(可看到Redis里已有相关缓存)


(7)缓存已有,但是还没有结束。如果,这时通过修改用户名接口修改了该用户的UserName,然后请求接口获取该用户信息,那么获取到的还是没修改之前的缓存数据(缓存到期之前)。为了保证数据的实时性,就要用到其他缓存注解。

Redis常用的缓存注解:



  • @Cacheable


    – 表明对应方法的返回结果可以被缓存,首次调用后,下次就从缓存中读取结果,方法不会再被执行了。


  • @CachePut


    – 更新缓存,方法每次都会执行。


  • @CacheEvict


    – 清除缓存,方法每次都会执行。

通过给增加、删除、修改类型接口添加@CacheEvict注解,来达到数据实时性的目的。添加代码如下:



PS附加内容:


项目结构也可以如下所示:

(1)UserService.java代码如下:

public interface UserService {

    User findUserById(int id);
    void updateUserName(int id, String userName);
}

(2)UserServiceImpl.java代码如下:

@Service("UserService")
@CacheConfig(cacheNames="user")
public class UserServiceImpl implements UserService {

    final
    UserMapper userMapper;

    public UserServiceImpl(UserMapper userMapper) {
        this.userMapper = userMapper;
    }

    @Cacheable(key="'user_cache_'+ #p0")
    public User findUserById(int id){
        return userMapper.findUserById(id);
    }

    @CacheEvict(key="'user_cache_'+ #p0")
    public void updateUserName(int id, String userName) {
        userMapper.updateUserName(id, userName);
    }
}

其他内容不用修改。



版权声明:本文为lpCrazyBoy原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。