https://blog.csdn.net/weixin_43206161/article/details/104626399
Java技术分享
CSDN话题挑战赛第2期
参赛话题:Java技术分享
Java技术er集合啦!大家可分享关于Java技术知识,包括但不限于微服务,分布式等前沿技术,快来沉淀自己的技术,一起写出未来吧! 你可以从以下几个方面着手(不强制),或者根据自己对话题主题的理解进行创作,参考如下:
java里的JSONObject作用是什么?什么时候用?
https://blog.csdn.net/qq_19810699/article/details/80006850
支付订单添加客服名字字段
支付订单添加客服名字字段
List<UserCustomerServiceRecord> customerServiceRecordList =
userCustomerServiceRemoteService.listStaffName().getData();
Map<String, UserCustomerServiceRecord> customerServiceRecordMap = customerServiceRecordList.stream()
.collect(Collectors.toMap(UserCustomerServiceRecord::getStaffId, i -> i));
String staffId = String.valueOf(item.getStaffId());
if (null != customerServiceRecordMap.get(staffId)) {
adminPageOrderRes.setStaffName(customerServiceRecordMap.get(staffId).getStaffName());
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
-----说明书-----
JAVA8 lambda表达式中Collectors.toMap()方法
例:
Map<Long, VipEntity> vipMap = vipList.stream().collect(Collectors.toMap(VipEntity::getUserId, v -> v, (v1, v2) -> v1));
说明:
.collect(Collectors.toMap(VipEntity::getUserId, v -> v, (v1, v2) -> v1))
- 1
- 2
- 3
- 4
- 5
第一个参数 VipEntity::getUserId 表示选择 VipEntity 的 getUserId 作为map的key值;
第二个参数 v -> v 表示选择将原来的对象作为map的value值; 第三个参数 (v1, v2) -> v1 中,如果v1与v2的key值相同,选择v1作为那个key所对应的value值。
校验 OrderException
if (null == id) {
throw new OrderException(OrderExceptionResult.ORDER_USER_CONFIG_ID_NOT_EXITS);
}
- 1
- 2
- 3
OrderExceptionResult
public enum OrderExceptionResult implements IExceptionResult {
ERROR(1000, "系统繁忙,请稍后重试"),
ORDER_USER_CONFIG_ID_NOT_EXITS(1029, "客服订单不存在"),
;
private int code;
private String msg;
OrderExceptionResult(int code, String msg) {
this.code = code;
this.msg = msg;
}
@Override
public int getCode() {
return code;
}
@Override
public String getMsg() {
return msg;
}
public IExceptionResult buildParamErrorMsg(String paramErrorMsg) {
if (paramErrorMsg == null || "".equals(paramErrorMsg)) {
paramErrorMsg = "";
}
if (this.code == PARAM_ERROR.code) {
this.msg = "参数 " + paramErrorMsg + " 不能为空";
}
return this;
}
}
## MySQL事务,串行化,索引
2、MySQL事务
什么?主要用来处理操作量大,复杂度高的数据
例子?在人员管理网站中,你要删除一个人员,不但要删除他的基本信息,而且也要删除他的相关信息,如他的文章,信箱等等
在 MySQL 中只有使用了 Innodb 数据库引擎的数据库或表才支持事务。----》 Innodb 数据库引擎
事务处理可以用来维护数据库的完整性,保证成批的 SQL 语句要么全部执行,要么全部不执行。-----》原子性
事务用来管理 insert,update,delete 语句----》增删改
事务要满足的4个条件:
原子性:要么全部执行,要么全部不执行。
一致性:在事务开始之前和事务结束以后,数据库的完整性没有改变—》一致
隔离性:包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)。
数据库允许多事务执行,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。隔离性保证了事务并发执行的互不干扰。
持久性:事务处理结束后,对数据库的改变必须是永久的,即便系统故障也不会丢失。—》持久
上面串行化(Serializable)
在这个事务没有被提交之前 其他的线程只能等到当前操作完成之后,才能进行操作,这样会非常耗时,而且,影响数据库的性能,通常情况下,不会使用这种隔离级别
3/索引
----》提高检索速度,高效运行
例子—》字典根据拼音来查询需要的字
## 查到部分数据处理为null处理方式
select s.total_pv as total_pv, s.total_uv as total_uv from dialog d left join
(select dialog_id, sum(counts) as total_pv, user_id,count(DISTINCT(user_id)) as total_uv
from dialog_count GROUP BY dialog_id) s
on d.id=s.dialog_id
ORDER BY id desc
查到部分数据处理为null
1、数据库用函数查询
SELECT d.*,**IFNULL(s.total_pv,0) as total_pv ,IFNULL(s.total_uv,0)** as total_uv
FROM `dialog` d left join (select dialog_id,sum(counts) as total_pv,user_id,count(distinct(user_id)) as total_uv from dialog_count group by dialog_id) s
ON d.id=s.dialog_id
order by id desc
2、后端业务逻辑处理
如实现类if else赋值
3、前端显示处理
## 事务隔离级别的解决方案1 方案一
在读取数据前,加锁,阻止其他事务对数据进行修改
Lock Based Concurrency Control (LBCC)
2 方案二
生成一个数据请求时间点的一致性数据快照,用这个快照提高一个事务及一致性的读取,Multi Version Concurrency Control(MVCC) 原理用undo log,中间有一个环节失败了,让前面的环节也失败。
## 自动类型转换正向过程与强制转换
1、自动类型转换正向过程
(byte、char、short)->int->long->float->double
2、强制转换
即逆向过程,可能丢失精度
int a=(int)3.1478932;
3、String不是基本数据类型—》final
强制转换—》包装类
String a = "73874.48787548";
double b = Double.parseDouble(a);
System.out.println(b);
4、boolean不能转换为其它数据类型
![](https://img-blog.csdnimg.cn/a73b3d27375649d0b153de90ef50028d.png)
## JavaScript对象输出
```内容
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org/">
<head>
<meta charset="UTF-8">
<title>Title</title>
<base th:href="${#servletContext.getContextPath+'/'}">
</head>
<body>
<script>
var username={
id : 1,
name : "xiaohong",
age : 17
};
document.write(username.id+" "+username["name"]+" "+username.age);
</script>
</body>
</html>
- 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
- 101
- 102
- 103
- 104
- 105
- 106
- 107
- 108
- 109
- 110
- 111
- 112
- 113
- 114
- 115
- 116
- 117
- 118
- 119
- 120
- 121
- 122
- 123
- 124
- 125
- 126
- 127
- 128
- 129
- 130
- 131
- 132
- 133
- 134
- 135
- 136
- 137
- 138
- 139
- 140
- 141
- 142
- 143
- 144
- 145
- 146
- 147
- 148
- 149
- 150
- 151
- 152
- 153
- 154
- 155
- 156
- 157
- 158
- 159
- 160
- 161
- 162
- 163
- 164
- 165
- 166
- 167
- 168
- 169
- 170
- 171
- 172
- 173
- 174
- 175
结果
1 xiaohong 17
JavaScript 语句向浏览器发出的命令。语句的作用是告诉浏览器该做什么。
JavaScript 语句向浏览器发出的命令。语句的作用是告诉浏览器该做什么。
使用window.alert()弹出警告框。
使用document.write()方法将内容写到HTML文档中
使用innerHTML写入到HTML元素
使用console.log()写入到浏览器的控制台
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>菜鸟教程(runoob.com)</title>
</head>
<body>
<p id="demo">fdsjallll </p>
<script>
window.alert(7+8);
document.write(8+1);
a = document.getElementById("demo");
a.innerHTML="beijfin";
console.log("hello world");
</script>
</body>
</html>
- 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
代码规范-实用版包括方法命名
1、POJO 类中布尔类型的变量,都不要加 is,否则部分框架解析会引起序列化错误。
反例:定义为基本数据类型 Boolean isDeleted;的属性,它的方法也是 isDeleted(),RPC
框架在反向解析的时候,“以为”对应的属性名称是 deleted,导致属性获取不到,进而抛出异
常。
2、方法命名
1) 获取单个对象的方法用 get 做前缀。
2) 获取多个对象的方法用 list 做前缀。
3) 获取统计值的方法用 count 做前缀。
4) 插入的方法用 save/insert 做前缀。
5) 删除的方法用 remove/delete 做前缀。
6) 修改的方法用 update 做前缀。
7. 【强制】不要在 foreach 循环里进行元素的 remove/add 操作。remove 元素请使用 Iterator
方式,如果并发操作,需要对 Iterator 对象加锁。 正例:
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
String item = iterator.next();
if (删除元素的条件) {
iterator.remove();
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
反例:
List<String> list = new ArrayList<String>();
list.add("1");
list.add("2");
for (String item : list) {
if ("1".equals(item)) {
list.remove(item);
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
说明:以上代码的执行结果肯定会出乎大家的意料,那么试一下把“1”换成“2”,会是同样的
结果吗?
10. 【推荐】防止 NPE(空指针异常),是程序员的基本修养,注意 NPE 产生的场景:
1)返回类型为基本数据类型,return 包装数据类型的对象时,自动拆箱有可能产生 NPE。
反例:public int f() { return Integer 对象}, 如果为 null,自动解箱抛 NPE。
2) 数据库的查询结果可能为 null。
3) 集合里的元素即使 isNotEmpty,取出的数据元素也可能为 null。
4) 远程调用返回对象时,一律要求进行空指针判断,防止 NPE。
5) 对于 Session 中获取的数据,建议 NPE 检查,避免空指针。
6) 级联调用 obj.getA().getB().getC();一连串调用,易产生 NPE。 正例:使用 JDK8 的 Optional 类来防止 NPE 问题。
11.日志为了安全起见,可以不用注解日志,用自己的日志 private static final LegoLogger LOGGER = LegoLogger.getLogger(MemberServiceImpl.class);
12.接口规范
新建(saveXxx)
修改(updateXxx)
修改单个(updateXxxById)
查询(selectXxx)
查询单个(selectXxxById)
分页查询(xxxByPage)
删除(delete) 删除单个(deleteXxxById)
本文使用 文章同步助手 同步
网友评论