springboot+mybatis整合redis缓存(亲测有效)

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即操作完成!

评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值