Springboot项目-实战2-实现
文章目录
- 接口接收数据并进行数据清洗
- mysql读取到redis
- 接口返回参数对象
- java函数使用备注
- 返回参数分析
- stream操作
- Thread线程
接口接收数据并进行数据清洗
- 基本信息
在Java Spring Boot环境中,可以使用Spring Data JPA和Hibernate ORM来操作SQLite数据库,来实现如何创建一个接收并同步数据到服务器端数据库的RESTful API接口;
参考博客:https://blog.csdn.net/u013735734/article/details/136361244#%E9%85%8D%E7%BD%AE%20SQLite%20&%20JPA
项目基础配置:
需要确保配置:Spring Data JPA和SQLite连接
参考博客:https://blog.csdn.net/zyd573803837/article/details/109263219
mysql读取到redis
通过实现CommandLineRunner接口重写run方法可以实现。
具体的run方法中,使用xxxMapper读取mysql数据,然后向RedisOpreation对象写入数据。
@Component
public class RedisDataLoader implements CommandLineRunner {
@Autowired
private RedisOperations redisOperations;
@Autowired
private XXXMapper xxxMapper;
@Override
public void run(String... args) throws Exception {
Object object = xxxMapper.selectById(1);
redisOperations.set(key, object);
}
}
接口返回参数对象
通常不同的运行情况,返回的对象是不同的。
通过采用构造方法-重载形式,可以实现该效果。
通过重载不同的静态方法,实现调用不同的构造方案。
该类需要实现Seriaizable。
需要添加@JsonInclude(JsonInclude.Include.NON_NULL),不返回参数值为null的。
@Slf4j
@Data
@JsonInclude(JsonInclude.Include.NON_NULL)
public class ResultDto implements Serializable {
private String xx1;
private String xx2;
private String xx3;
public ResultDto(String xx1, String xx2, String xx3){
this.xx1 = xx1;
this.xx2 = xx2;
this.xx3 = xx3;
}
public ResultDto(String xx1, String xx2){
this.xx1 = xx1;
this.xx2 = xx2;
}
public static ResultDto result(String xx1, String xx2, String xx3){
return new ResultDto(xx1, xx2, xx3);
}
public static ResultDto result(String xx1, String xx2){
return new ResultDto(xx1, xx2);
}
}
java函数使用备注
Math.min 和 Math.max函数
int min = Math.min(111111, 111111);// 如果两个数相同,则返回其中任意一个。
int max = Math.max(22,22);// 如果两个数相同,返回其中任意一个。
System.out.println(min);
System.out.println(max);
List集合
问题:
一个list集合执行add命令,报java.lang.NullPointerException: null 这是什么原因
分析:
List本身没有初始化,导致使用add方法的时候会报错;
list是由map.get(key)获取到的,但是key对应的value为null,也会报上述错误。
返回参数分析
一般采用JSON格式,该格式是轻量级的数据交换格式,易于人阅读和编写;
但返回值格式需要经过如下过程加以判断:
1. 使用@RestController 或 @Controller + @ResponseBody
表示控制类的返回值直接写入HTTP的响应体,而不作为视图模型返回给视图层;
2. 返回值类型
可以是原生的java对象(map)、自定义对象或者String。如果返回的是java对象,Spring自动将去转换为JSON对象;
3. 响应头Content-Type
当返回为JSON格式时,响应头的Content-Tpye字段会被赋值为application/json
stream操作
情况1:
Collection<LzKey> lzKeys
LzKey errorKey = lzKeys.stream().filter(lzKey -> !validateId(lzKey.getId())).findAny().orElse(null);
// 理解:
lzKeys.stream() --》 集合转换成流Stream,可以对其中的元素继续流式操作;
.filter(lzKey -> !validateId(lzKey.getId())) --》 过滤出通过getId获取到的lzKey对象无法通过validateId验证的lzKey
.findAny() --》 从结果中随机选择一个元素
.orElse(null) --》 如果存在元素就返回元素,不存在就返回null
情况2:
下划线是java7以及之后版本的数字分割符,即50000000 等于 5000_0000
情况3:
Collection<LzKey> lzKeys
Map<Integer, List<LzKey>> map = lzKeys.stream().collect(Collectors.groupingBy(lzKey -> getTableIndex(lzKey.getId())));
// 理解;
lzKeys.stream() --》 将lzKeys列表转化成一个流;
.collect(....) --》 流操作的终止操作之一,收集元素并将其转化为Map类型;
Collectors.groupingBy(....) --》 Collector工厂方法,用于创建一个Collector实例,元素根据分类函数groupingBy进行分组;
lzKey -> getTableIndex(lzKey.getId()) --》 根据id得到tableIndex,其作为Map的key,值为lzKeys组成的列表;
情况4:
List<Integer> indexList = list.stream().map(LzKey::getId).collect(Collectors.toList());
// 理解:
list.stream() --》 基于list集合创建流
map(LzKey::getId) --》 将list集合中的lzKey对象的id元素提取出来
collect(Collectors.toList()) --》将提取出来的id组成新的List
Collections.shuffle(indexList, ThreadLocalRandom.current());
// 理解:
对indexList进行随机重排,参数2 确保多线程环境下速记数生成的安全性;
Thread线程
extends Thread:
public class function extends Thread{}
public function(int a,
long b,
int c) {
super("ConsumerKeyThread");
setDaemon(true);
this.a = a;
this.b = b;
this.c = c;
}
// 理解:
super("ConsumerKeyThread") --》 调用父类的构造方法,传入字符串s,作为新线程的名字;
setDaemon(true) --》将创建的线程设置为守护线程;
守护线程是一种特殊的过程,它在后台运行,不会组织程序的退出,当所有的非守护线程都结束时,守护线程也将自动终止;