Spring Boot整合mybatis和redis

一、Spring Boot整合mybatis

1、项目结构

在这里插入图片描述
2、pom.xml配置

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.6.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.jp</groupId>
    <artifactId>boot-jedis</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>boot-jedis</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
<!--        mybatis连接配置-->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>1.3.2</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.9</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>

        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
            <version>2.4.2</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>

    <build>

        <resources>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.xml</include>
                </includes>
            </resource>
            <resource>
                <directory>src/main/resources</directory>
            </resource>
        </resources>

        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

3、mysql数据库连接配置

spring.datasource.username=root
spring.datasource.password=******
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.url=jdbc:mysql://网址:3306/2020offer?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=UTC

3、实体层model中的User类

package com.jp.bootjedis.model;

import java.io.Serializable;

/**
 * @program: boot-jedis
 * @description: 用户类
 * @author: CoderPengJiang
 * @create: 2020-04-19 09:36
 **/
public class User implements Serializable {
    private Integer id;
    private String username;
    private String birthday;
    private String sex;
    private String address;


    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 getBirthday() {
        return birthday;
    }

    public void setBirthday(String birthday) {
        this.birthday = birthday;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", birthday='" + birthday + '\'' +
                ", sex='" + sex + '\'' +
                ", address='" + address + '\'' +
                '}';
    }
}

4、持久层Mapper对应的mapper类和xml

UserMapper类

package com.jp.bootjedis.mapper;
import com.jp.bootjedis.model.User;

import java.util.List;

public interface UserMapper {
    List<User> getAllUser();
}

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.jp.bootjedis.mapper.UserMapper">
    <select id="getAllUser" resultType="com.jp.bootjedis.model.User">
        select * from user
    </select>
</mapper>

由于UserMapper类和UserMapper.xml放置在java包下的同一个包mapper下,放在这里的UserMapper.xml会被自动扫描到,但是有另外一个Maven带来的问题,就是java目录下的xml资源在项目打包时会被忽略掉,所以,如果UserMapper.xml放在包下,需要在pom.xml文件中再添加如下配置,避免打包时java目录下的XML文件被自动忽略掉:

<build>
        <resources>
        
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.xml</include>
                </includes>
            </resource>
            
            <resource>
                <directory>src/main/resources</directory>
            </resource>
        </resources>
    </build>

5、业务层service对应的UserService类

package com.jp.bootjedis.service;
import	java.util.List;

import com.jp.bootjedis.mapper.UserMapper;
import com.jp.bootjedis.model.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/**
 * @program: boot-jedis
 * @description: 用户业务类
 * @author: CoderPengJiang
 * @create: 2020-04-19 22:44
 **/
@Service
public class UserService {
    @Autowired
    UserMapper userMapper;

    public List<User> getAllUser(){
        return userMapper.getAllUser();
    }
}

6、进行测试

   @Test
    public void testSpring() {
        List<User> users=userService.getAllUser();
        for (int i = 0; i < users.size(); i++) {
            System.out.println(users.get(i));
        }
    }

一、Spring Boot整合redis

1、采用Jedis的连接方式

pom.xml配置再上节已经展示

<dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
            <version>2.4.2</version>
 </dependency>

新建工具类JedisUtils,主要存放关于jedis的连接等配置

package com.jp.bootjedis.utils;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

/**
 * @program: boot-jedis
 * @description: Jedis工具类
 * @author: CoderPengJiang
 * @create: 2020-04-19 08:55
 **/
public class JedisUtis {
    private static final JedisPool JEDIS_POOL;
    static {
        //1、设置Jedis连接池配置
        JedisPoolConfig config=new JedisPoolConfig();
        //设置最大连接数
        config.setMaxTotal(100);
        //空闲时的连接数
        config.setMaxIdle(10);
        //2、设置连接池
        JEDIS_POOL = new JedisPool(config,"自己的服务器的弹性公网地址",6379);
    }

    //池中获得jedis对象
    public static Jedis getJedis(){
        Jedis jedis=JEDIS_POOL.getResource();
        jedis.auth("改为自己的密码");
        return jedis;
    }
}

接着就可以进行测试了

package com.jp.bootjedis;
import	java.util.HashMap;
import java.util.List;
import	java.util.Map;

import com.jp.bootjedis.model.User;
import com.jp.bootjedis.service.UserService;
import com.jp.bootjedis.utils.JedisUtis;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import redis.clients.jedis.Jedis;

@SpringBootTest
class BootJedisApplicationTests {

    //测试连接redis
    @Test
    public void testConnection(){
        Jedis jedis = new Jedis("139.9.141.121", 6379);
        jedis.auth("123456");
        String ping = jedis.ping();
        System.out.println(ping);
    }



    //操作字符串
    @Test
    public void testString() {
        Jedis jedis= JedisUtis.getJedis();
        //字符串中的uname jp
        String uname="jp";
        boolean isExit=jedis.exists("uname");
        if (isExit) {
            System.out.println("进入redis");
            System.out.println(jedis.get("uname"));
        }else{
            System.out.println("进入数据库");
            jedis.set("uname",uname);
        }
        System.out.println(uname);
        jedis.close();
    }

    //操作hash,由于存储对象
    @Test
    public void testHash() {
        Jedis jedis = JedisUtis.getJedis();
        if (jedis.exists("user")){
            System.out.println("从redis中获取数据");
            //获取存储在HASH中的值,根据FIELD得到VALUE
            String value = jedis.hget("user","name");
            System.out.println(value);
            //获取全部的hash的key
            Map<String, String> mapAll = jedis.hgetAll("user");
            System.out.println(mapAll);
            //修改指定的value值
            jedis.hset("user","name","jp");
        }else {
            System.out.println("从数据库中获取");
            User user=new User();
            System.out.println(user);
            jedis.hset("user","id","1");
            jedis.hset("user","name","jb");
            jedis.hset("user","password","123456");
        }
        jedis.close();
    }


}

2、采用spring-data-redis进行连接

默认使用的Redis工具是Lettuce
pom.xml文件配置:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.6.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.jp</groupId>
    <artifactId>spring-data-redis</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>spring-data-redis</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>

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

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

项目结构
在这里插入图片描述
用户持久层,实现对数据的crud操作

@Repository
public class HelloDao {
    @Autowired
    RedisTemplate redisTemplate;
    public void set(String key, String value) {
        ValueOperations ops = redisTemplate.opsForValue();
        ops.set(key, value);
    }
    public String get(String key) {
        ValueOperations ops = redisTemplate.opsForValue();
        return ops.get(key).toString();
    }
    public void setuser(User user) {
        ValueOperations ops = redisTemplate.opsForValue();
        ops.set(user.getId(), user);
    }
    public User getuser(String id) {
        ValueOperations<String, User> ops = redisTemplate.opsForValue();
        User user = ops.get(id);
        System.out.println(user);
        return user;
    }
}

用户业务层

@Service
public class HelloService {
    @Autowired
    HelloDao helloDao;
    public void set(String key, String value) {
        helloDao.set(key,value);
    }

    public String get(String key) {
        return helloDao.get(key);
    }

    public void setuser(User user) {
        helloDao.setuser(user);
    }

    public String getuser(String id) {
        String s = helloDao.getuser(id).toString();
        return s;
    }
}

controller层

@RestController
public class HelloController {
    @Autowired
    HelloService helloService;

    @RequestMapping("/set")
    @ResponseBody
    public void set(String key, String value) {
        helloService.set(key, value);
    }

    @RequestMapping("/get")
    @ResponseBody
    public String get(String key) {
        return helloService.get(key);
    }

    @RequestMapping("/setuser")
    @ResponseBody
    public void setUser() {
        User user = new User();
        user.setId("1");
        user.setUsername("深圳");
        user.setPassword("sang");
        helloService.setuser(user);
    }

    @RequestMapping(value = "/getuser",produces = "text/html;charset=UTF-8")
    @ResponseBody
    public String getUser() {
        return helloService.getuser("1");
    }
}

启动服务器用postman进行测试
http://localhost:8080/set数据存储测试是post请求,采用redismanager采用存储的数据显示为乱码
在这里插入图片描述
显示的结果乱码
在这里插入图片描述

怎么会这样?这是因为没有设置序列化器,RedisTemplate选择了默认的序列化器JdkSerializationRedisSerializer
spring boot默认会提供StringRedisTemplate和RedisTemplate的实例,这两个提供了redis的基本操作方法。
StringRedisTemplate默认选择的StringRedisSerializer序列化器,RedisTemplate选择了默认的序列化器JdkSerializationRedisSerializer,因此需要我们自己配置序列化器

配置序列化器
@Configuration
public class RedisConfig{
    @Bean
    public RedisTemplate<String, User>redisTemplate(RedisConnectionFactory factory){
        RedisTemplate<String,User>template=new RedisTemplate<>();
        //关联
        template.setConnectionFactory(factory);
        //设置key的序列化器
        template.setKeySerializer(new StringRedisSerializer());
        //设置value的序列化器
        template.setValueSerializer(new Jackson2JsonRedisSerializer<>(User.class));
        return template;
    }
}

再次重新启动服务器就可以正常显示了
http://localhost:8080/get?key=wangwu测试是get请求取数据
在这里插入图片描述
http://localhost:8080/setuser时出现如下异常,解决办法时redisconfig出现了问题,修改后即可
在这里插入图片描述
存储的结果json字符串
在这里插入图片描述
http://localhost:8080/getuser测试结果如下
在这里插入图片描述

发布了9 篇原创文章 · 获赞 9 · 访问量 830

猜你喜欢

转载自blog.csdn.net/qq_36908783/article/details/105624603