一、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测试结果如下