Springboot项目-实战2-实现

接口接收数据并进行数据清洗

  1. 基本信息
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) --》将创建的线程设置为守护线程;
守护线程是一种特殊的过程,它在后台运行,不会组织程序的退出,当所有的非守护线程都结束时,守护线程也将自动终止;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值