表查询中的续传

前言: 关于表查询续传的注意事项。

todo 建一张测试表,里面插数据

InputX1.java

1
2
3
4
5
public class InputX1 {
private String partitionNo;
private String name;
private String desc;
}

InputY1.java

1
2
3
4
5
6
public class InputY1 {
private boolean continuationCode; // 续传标志
private String partitionNo; // 续传标志-1
private String name; // 续传标志-2
private String specCode; // 冗余代码
}

注意:续传标志必须要为表的唯一键。

关于表的查询,有分页查询,也有续传查询,这里所说的是续传查询。

例如我们的Test_T中记录数为11,但是我们每次传输的数量为10,我们作为请求记录的一方,如果第一次请求得到的记录数为10,这个时候肯定想要知道表中是不是还有其他数据,这个时候续传的那些标志就起到的作用。

模拟请求第一次查询,因为不知道数据库表中的情况,Y1中的那些字段全部置为空:

1
2
3
4
5
6
{
"continuationCode": "",
"partitionNo": "",
"name": "",
"specCode": ""
}

把这个请求发到数据库中,表中有21条数据,查回来10条,我们这个时候接收到的Y1:

1
2
3
4
5
6
{
"continuationCode": "Y",
"partitionNo": "01",
"name": "Mike_10",
"specCode": ""
}

我们发现续传标志为Y,就表示表中是还存在记录的,我们继续查,将Y1原封不动返回回去:

1
2
3
4
5
6
{
"continuationCode": "Y",
"partitionNo": "01",
"name": "Mike_10",
"specCode": ""
}

得到传回来的Y1:

1
2
3
4
5
6
{
"continuationCode": "N",
"partitionNo": "",
"name": "",
"specCode": ""
}

续传标志为N,代表已经没有数据,全部数据已经请求完了。

注意:这里我们每次传输的数量是10,自测的时候要验证

  • 表中只有9条数据
  • 表中只有10条数据
  • 表中只有11条数据

等情况,不要有那种少了一条的查询。

数据库查询方法

  • 第一种写法
    1
    2
    3
    SELECT * FROM TABLE_A
    WHERE UNIQUE_KEY_COLUMN >= #{键值}
    FETCH NEXT 101 ROWS ONLY;
  • 第二种写法
    1
    2
    3
    4
    5
    SELECT T1.* FROM (SELECT *
    FROM TABLE_A
    WHERE UNIQUE_KEY_COLUMN >= #{键值}
    ORDER BY UNIQUE_KEY_COLUMN) T1
    WHERE ROWNUM <= 100;
    这里设定续传数量为100

101: 每次查询101条,将最后一条记录中作为唯一键字段的值作为下一次查询的查询条件.

如果查询出来的记录数量 <= 续传数量,则说明可以不再进行查询。

例如:

1
2
3
第一次查询:101条,将最后一条作为下一次查询的条件
第二次查询:100条,说明数据库中只剩下100条了,因为我们每次去数据库中是拿的101条的,但是返回给我们的只有100
第三次查询:终止查询。