RestTemplate使用详解

https://blog.csdn.net/Sophia_0331/article/details/121196840

数、HTTP响应转换被转换成的对象类型
使用restTemplatej河restu接口非常的简单粗暴无脑。(url.reouestBean. ResponseBean.cass )这三个参数分别代表 请求地址、请求参

CONVERT(bs.sku_name USING gbk) COLLATE gbk_chinese_ci, SUBSTR(CONVERT(bs.sku_name USING gbk), 1, 1) COLLATE gbk_chinese_ci ASC,

这里的 CONVERT 函数将 bs.sku_name 中的中文转换为拼音,使用 gbk 编码进行转换,COLLATE gbk_chinese_ci 指定了排序规则,确保中文的排序是按照拼音的顺序进行的。SUBSTR 函数提取了拼音的首字母,COLLATE gbk_chinese_ci 同样指定了排序规则,确保按照拼音首字母的顺序进行排序。这样就可以将 bs.sku_name 中的中文名称按照首字母升序排序了。

  1. HAVING 关键字:用于在 GROUP BY 分组查询中对分组后的结果进行过滤。与 WHERE 关键字不同的是,HAVING 关键字可以使用聚合函数和分组条件进行过滤。
  2. HAVEN 函数:MySQL 中没有这个函数,可能是您输入有误或者是其他数据库系统中的函数。
  3. 字符串函数:MySQL 中有很多用于处理字符串的函数,比如 CONCAT、SUBSTR、LENGTH、LOWER、UPPER 等。这些函数可以用于拼接字符串、截取子串、计算字符串长度、转换大小写等操作。
  4. 数学函数:MySQL 中也有很多用于处理数字的函数,比如 ABS、ROUND、CEILING、FLOOR、MOD 等。这些函数可以用于计算绝对值、四舍五入、向上取整、向下取整、取模等操作。
  5. 日期时间函数:MySQL 中还有很多用于处理日期时间的函数,比如 DATE、TIME、NOW、YEAR、MONTH、DAY、HOUR、MINUTE、SECOND 等。这些函数可以用于获取当前日期时间、提取日期时间的年、月、日、时、分、秒等部分。

用java对中文首字母排序

您可以使用 Java 中的 Collator 类来对中文进行排序。Collator 是 Java 的国际化类,可用于比较和排序文本。

以下是一个示例,该示例使用 Collator 类对中文字符串进行排序:

1
2
import java.text.Collator;import java.util.Arrays;import java.util.Locale; public class Main {  public static void main(String[] args) {    // 定义要排序的中文字符串数组    String[] strings = { "中国", "美国", "日本", "韩国" };     // 使用 Collator 类的静态工厂方法 getInstance() 获取 Collator 对象    Collator cnCollator = Collator.getInstance(Locale.CHINA);     // 使用 Collator 类的 compare() 方法对字符串数组进行排序    Arrays.sort(strings, cnCollator);     // 输出排序后的字符串数组    for (String s : strings) {      System.out.println(s);    }  }}

MYSQL函数,枚举清晰

(1)if(expr,v1,v2)

若expr返回true则返回v1否则v2

(2)ifnull(v1,v2)函数

IFNULL(v1,v2)加入v1不为null,则IFNULL()的返回值为V1;否则其返回值为v2。
IFNULL的返回值是数字还是字符串,根据其具体的语境而定。

MySQL之case when than else end 函数

Case具有两种格式。简单Case函数和Case搜索函数。

CASE sex

WHEN ‘1’ THEN ‘男’

WHEN ‘2’ THEN ‘女’

ELSE ‘保密’ END

Case搜索函数;判别式条件,有点类似Java的if….else….的感觉

CASE WHEN sex = ‘1’ THEN ‘男’

WHEN sex = ‘2’ THEN ‘女’

ELSE ‘保密’ END

case 后跟一个字段,when当某某条件时…than执行某某…else否则就怎样,一定不能少了结束条件end

时间格式排版示例:

CASE
WHEN doc_asn_header.expect_reach_time = ‘0001-01-01 00:00:00’ THEN NULL
WHEN doc_asn_header.expect_reach_time IS NOT NULL AND doc_asn_header.expect_reach_end_time IS NULL
THEN DATE_FORMAT(doc_asn_header.expect_reach_time, ‘%Y-%m-%d %H:%i:%s’)
WHEN DATE(doc_asn_header.expect_reach_time) != DATE(doc_asn_header.expect_reach_end_time)
THEN CONCAT(DATE_FORMAT(doc_asn_header.expect_reach_time, ‘%Y-%m-%d %H:%i:%s’), ‘ ~ ‘, DATE_FORMAT(doc_asn_header.expect_reach_end_time, ‘%Y-%m-%d %H:%i:%s’))
ELSE CONCAT(DATE_FORMAT(doc_asn_header.expect_reach_time, ‘%Y-%m-%d %H:%i:%s’), ‘ ~ ‘, DATE_FORMAT(doc_asn_header.expect_reach_end_time, ‘%H:%i:%s’))
END AS expectReachTimeFormat

6、MySQL之IF函数
IF函数根据判别式是否成立进行选择执行,成立执行前面的语句,不成立执行后面的语句;

IF(conditional, value_if_true, value_if_false);
7、MySQL排序函数RANK
窗口函数用法:
<窗口函数> OVER ( [PARTITION BY <列清单> ] ORDER BY <排序用列清单> )

在计算排序时,若存在相同位次,会跳过之后的位次。
例如,有3条排在第2位时,排序为:1,2,2,2,4······

2、DENSE_RANK()
这就是题目中所用到的函数,在计算排序时,若存在相同位次,不会跳过之后的位次。
例如,有3条排在第1位时,排序为:1,1,1,2······

3、ROW_NUMBER()
这个函数赋予唯一的连续位次。
例如,有3条排在第1位时,排序为:1,2,3,4······

相信自己😘

8、MySQL聚合函数
注意:聚合函数不能嵌套调用。比如不能出现类似***AVG(SUM(字段名称))***形式的调用。

见名思意 求平均值

AVG()

求和

SUM()

求最大值

MAX()

求最小值
MIN()

统计一组数据的个数

COUNT()

聚合函数一般搭配分组函数group by使用,可以解决很多问题,本人是屡试不爽 😄

如果对聚合后的数据还要进行条件筛(shai)选,就需要用到having

例如:题库 - 力扣 (LeetCode) 全球极客挚爱的技术成长平台 第1050题

至少合作过三次的导演,对演员和导演进行分组查询之后,要有一个条件就是需要他们至少合作过三次以上,所以加上 having count(0) >2 【这地方有我自己老是忘记的点为什么 count(0)>2;其实写成count(0)>=3更容易理解一些,count(0)>2,在2的上面那个数不就是3么🤣】

select actor_id, director_id from ActorDirector group by actor_id, director_id having count(0) >2;
模板的列表没有数据

看sql查询语句有没有这个字段然后看有没有查出来数据都没问题

再看字段映射和实体类字段,有没有判空或者格式化,最后看判断条件

stream并发流计算单个箱数并完成详情统计使用示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100

@Override

public IPage<DocOrderHeader> searchDocOrderHeaderAuditByVo(AbstractWrapperVo vo, Page page) {

String orderByStr = getDocOrderHeaderAuditStr(vo);

IPage<DocOrderHeader> headerIPage = headerMapper.searchAuditByVo(page, vo, orderByStr);

// 查看是否有收货点,如果有,匹配返回

if (CollectionUtils.isNotEmpty(headerIPage.getRecords())) {

List<SysSelect> selectList = selectService.list(new LambdaQueryWrapper<SysSelect>()

.eq(SysSelect::getClientId, wrapperService.getClientId())

.eq(SysSelect::getAreaCode, "-999")

.eq(SysSelect::getTableName, "receivePoint"));

Map<String, SysSelect> sysSelectMap = selectList.stream().collect(CollectorUtil.toMap(item -> String.valueOf(item.getSkey())));

Set<String> orderIds = headerIPage.getRecords().stream().map(DocOrderHeader::getOrderId).collect(Collectors.toSet());

List<DocOrderDetail> orderDetails= detailService.getDetailListByOrderId(orderIds);

orderDetails.stream().collect(Collectors.groupingBy(DocOrderDetail::getOrderId)).forEach((k,v)->{

headerIPage.getRecords().stream().filter(item->item.getOrderId().equals(k)).forEach(item->{

item.setDetailList(v);

});

});

Map<String, List<DocOrderDetail>> orderDetailMap = orderDetails.stream()

.collect(Collectors.groupingBy(DocOrderDetail::getOrderId));

headerIPage.getRecords().forEach(docOrderHeader -> {

List<DocOrderDetail> details = orderDetailMap.get(docOrderHeader.getOrderId());

if (CollectionUtils.isNotEmpty(details)) {

BigDecimal cartonNumber = details.parallelStream()

.map(detail -> {

BasSkuStandard basSku = basSkuStandardService.getOne(new LambdaQueryWrapper<BasSkuStandard>().eq(BasSkuStandard::getSkuId, detail.getSkuId()));

if (basSku != null&& StringUtil.isNotEmpty(basSku.getCartonSize())) {

return StringUtil.getAllConvertBoxNum(detail.getGoodsNum(), Integer.valueOf(basSku.getCartonSize()));

} else {

return BigDecimal.ZERO;

}

})

.reduce(BigDecimal.ZERO, BigDecimal::add).setScale(2, RoundingMode.HALF_UP);

docOrderHeader.setCartonNumber(cartonNumber);

}

});

for (DocOrderHeader record : headerIPage.getRecords()) {

List<String> receivePointFormatList = new ArrayList<>();

if(StringUtil.isNotEmpty(record.getReceivePointStr())){

String[] split = record.getReceivePointStr().split(",");

for (String s : split) {

SysSelect sysSelect = sysSelectMap.get(s);

if(sysSelect != null){

receivePointFormatList.add(sysSelect.getSvalue());

}

}

}

record.setReceivePointFormat(String.join(",",receivePointFormatList));

}

}

log.info(“vo 查询出来的 headderPage 分页:” + headerIPage);

return headerIPage;

}

字段格式化

@JsonFormat(targetType = StringUtil.LOCALDATETIME)
targetType = StringUtil.LOCALDATETIME此处可以用enum枚举类

字段上枚举类使用

在循环里判空的时候如果某个字段为空则可以用continue;跳过此次计算,因为是空的不需要计算而且可以提高性能

养成一个好习惯,不用正式的数据库就关闭链接!!!

注意统计数量和计算单个数量有点细节差别,主要是在除法的四舍五入上,计算单个数量然后在统8计,那么统计的过程不要四舍五入,等统计完再四舍五入。(计算统计总箱数时发现的细节)

调用别人的写的工具类特别是时间格式化工具类,最好点进去看一下是否是按要求格式化(坑)

@RequestBody(required = false) 是Spring框架中用于标记一个方法参数的注解。它用于指定一个请求体参数,并指示该参数是否是必需的。

在Spring框架中,当你使用@RequestBody注解标记一个方法参数时,它表示该参数将从请求的主体中提取数据。默认情况下,@RequestBody注解要求请求主体中必须包含该参数的数据。如果请求主体中没有提供该参数的数据,将会抛出异常。

查询类的功能,可以用正式数据测试查询以确保上线没有问题

1
2
3
4
DocOrderDetail targetDetail = new DocOrderDetail();  
BeanUtil.copyProperties(detail, targetDetail);
targetDetail.setOrderDetailId(null);
targetDetail.setGoodsNum(vo.getSplitNum());

即使id被设置为null,但是

@TableId(value = “order_detail_id”, type = IdType.AUTO)
private Long orderDetailId;

在代码里是自增的所有还是能拿到新增之后的id,记住哈

从k8s命令行界面复制出来的json数据可以放大https://oktools.net/进行格式化,前提是json数据是对的,当然这里因为没看到json包含两个单子,导致被吊

https://mp.weixin.qq.com/s/J8sk7YUVZHg8OjQSPr5LAw

在 Java 中,将一个 null 变量与空字符串(””)相加会得到一个字符串 “null”。这是因为在 Java 中,将任何对象(包括 null)与一个字符串相加时,会将该对象转换为字符串形式,然后进行字符串拼接操作。

例如:

1
2
String result = null + "";
System.out.println(result); // 输出 "null"

在这个例子中,null 被转换为字符串 “null”,然后与空字符串相加,得到的结果是字符串 “null”。

因此,如果你有一个 null 的变量,将其与空字符串相加会得到一个非空的字符串 “null”。这可能会对你的业务逻辑产生影响,因此在处理这种情况时需要格外注意。

这三种类型的连接是在关系型数据库中常见的连接操作,它们在连接两个表时有不同的行为。

  1. Inner Join(内连接):
    • 内连接返回两个表中满足连接条件的行。即,只有当连接条件在两个表中都存在时,才会返回结果。
    • 如果表 A 和表 B 分别有 m 和 n 行,且它们有共同的连接键,则内连接的结果最多会有 min(m, n) 行。
  2. Left Join(左连接):
    • 左连接返回左表中的所有行,以及右表中满足连接条件的行。如果右表中没有匹配的行,那么会在结果中显示为 NULL 值。
    • 换句话说,左连接会保留左表中的所有行,即使右表中没有与之匹配的行。
  3. Join(等同于 Inner Join):
    • 在一些数据库系统中,JOIN 关键字默认表示内连接。

这里是一个简单的示例,假设有两个表 A 和 B,它们通过某个共同的键进行连接:

  • Inner Join:只返回 A 和 B 中共同存在的键的行。
  • Left Join:返回 A 中所有的行,以及 A 中与 B 中共同存在的键的行,如果 B 中没有匹配的行,则在结果中显示为 NULL 值。

这些连接类型在实际数据库查询中经常被使用,以便根据不同的需求来获取合适的数据。

String.format()是Java中一个用于格式化字符串的方法。它允许我们在字符串中插入变量并指定格式化的方式。

下面是一个使用String.format()的示例:

1
2
3
4
String name = "Fengfeng";
int age = 18;
String message = String.format("My name is %s and I am %d years old.", name, age);
System.out.println(message);

在上面的示例中,我们使用String.format()方法创建了一个格式化的字符串。在字符串中,我们使用占位符 %s 表示一个字符串变量,%d 表示一个整数变量。在String.format()方法的后面,我们按顺序提供了要替换占位符的变量,这里是name和age。最终,String.format()方法将占位符替换为实际的变量值,并返回格式化后的字符串。

上述示例的输出将会是:My name is Fengfeng and I am 18 years old.

使用String.format()可以方便地将变量插入到字符串中,并指定它们的格式。你可以使用各种类型的占位符,例如 %s(字符串)、%d(整数)、%f(浮点数)、%b(布尔值)等。

在该别人的代码前不要随便删除任何一行不起眼的代码,因为有可能是关键bug

默认情况下,当生产者将消息发送到RabbitMQ的时候,队列中的消息会尽可能的存储在内存之中,这样可以更加快速的将消息发送给消费者。即使是持久化的消息,在被写入磁盘的同时也会在内存中驻留一份备份

我们可以配置允许rabbitmq使用的最大内存是多少,当达到最大内存时,rabbitmq将会阻塞生产者继续发送消息给它

http://t.csdnimg.cn/otmYQ

多线程事务

当在查询语句中使用 FOR UPDATE 时,数据库会对查询结果中的行或表进行锁定,以防止其他事务对这些行或表进行修改。这种锁定方式称为行级锁或表级锁,具体取决于数据库的实现。