技术栈 : SpringBoot + TKMybatis + Oracle + Apollo + Zookeeper
服务间使用Dubbo进行通信
- Oracle数据库不能识别NULL类型。前端传入空串(“”),后端接收字符类型为
decimal
类型,接收后得到的是null值(decimal不能为空串
),存入oracle数据库 需要另写sql语句,不能使用tkmybatis/mybatis封装好的语句如
.updateByPrimaryKey()
(直接报错)或.updateByPrimaryKeySelective()
(如果为null值,就不更新。不能为省事而选用这个操作,有bug。如果一开始有数据后用户不填,则不正确。)
- 最好直接自己另写Sql语句,告诉oracle数据库该字段对应的数据类型
- 判断BigDecimal类型的变量是否为0
今天居然出了个/byZero的bug
判断BigDecimal类型的变量是否为0,如果为0不进行后面的逻辑
结果0.00居然判断结果是不为0!!!
我的判断语句是!s1.equals(BigDecimal.ZERO)
,好像是这个逻辑会判断位数,即0.00小数点后有两位,两者位数不等,直接不相等了。
后来,换成了(s1.compareTo(BigDecimal.ZERO)!=0)
,就可以了
BigDecimal类型的变量不能用equals去比较,需要用compareTo()比较
这里有个注意点,使用Double方式初始化(即不加双引号)可以使用equals()比较;而使用String方式初始化,只能使用compareTo()方式比较
/**
* String实例化和Double实例化BigDecimal的equal比较的区别
*/
@Test
public void equalDif(){
BigDecimal decimal1 = new BigDecimal("0.00");
BigDecimal decimal2 = new BigDecimal(0.00);
System.out.println("String初始化和BigDecimal.ZERO使用equals比较:"+decimal1.equals(BigDecimal.ZERO));
System.out.println("String初始化和BigDecimal.ZERO使用compareTo比较为0表示相等:"+decimal1.compareTo(BigDecimal.ZERO));
System.out.println("==================================");
System.out.println("Double初始化和BigDecimal.ZERO使用equals比较:"+decimal2.equals(BigDecimal.ZERO));
System.out.println("Double初始化和BigDecimal.ZERO使用compareTo比较为0表示相等:"+decimal2.compareTo(BigDecimal.ZERO));
}
结果
- 解决ORA-00904: invalid identifier“”标识符无效
oracle数据库报错,字段不存在,我以为是字段名写错,但是呢,这个是mybatis自动生成的mapper配置文件,按理说不应该;后来我又把sql语句放到navicat中执行,也报这个错;我又去掉这个字段insert,报最后一个字段不存在;
最后,总算发现了问题,原来oracle数据库字段区分大小写,一定要大写字段名
equals()比较报错,空指针异常
两值比较,其中一个为null,一个不为null;A.equals(B),如果A为null,会报错;所以一般的开发中使用:“常量”.equals(B),以避免报错;在项目中可以使用如下方式
studentA.getName()!=null?studentA.getName().equals(studentB.getName()):studentB.getName();
前后端联调需要注意的点
一、传参
- 查看详情与保存接口
查看详情返回的参数与保存的入参参数需要一致 - 搜索框的多条件查询按钮与查询返回的list结果参数要一致
注意返回"null"
出现原因:
String deposit = "";
if(xxx == "001"){
deposit = String.valueOf(xxx01.getDespoit());
}else{
deposit = String.valueOf(xxx02.getDespoit());
}
此时,如果xxx01.getDespoit()为null,得到的值就是"null";
改成以下方式解决问题
String deposit = "";
if(xxx == "001"){
deposit = xxx01.getDespoit() == null?null:String.valueOf(xxx01.getDespoit());
}else{
deposit = xxx02.getDespoit() == null?null: String.valueOf(xxx02.getDespoit());
}
返回日期格式化
后端日期默认返回的Date样式为: