最近做项目,有一个上传excel文件,将文件中的数据存储到数据库中,遇到几个问题。
1.批量插入数据报错
如果列表为空,MYSQL执行批量插入时会报错,在进行批量插入之前,需要进行判断,如果需要保存的数据列表为空或者是list.size()=0,则不要进行插入操作
2.批量插入数据,对于重复数据,如果不想重复保存的情况(唯一性约束)
唯一性约束:如果不是主键的话,可以选择唯一性约束,可以选择一个护着多个变量来确定数据的唯一性
<!--唯一性约束-->
alter table 表名 add CONSTRAINT billId UNIQUE(bill_id);
alter table 表名 add CONSTRAINT uniqueKey UNIQUE(user_id,bill_id);
insert into 表名
(col1,col2...)
values
(val1,val2...)
on DUPLICATE key UPDATE user_id,bill_id
3.Excel单元格日期格式的判断
java">CellType cellType = cell.getCellTypeEnum();
if (cellType == CellType.NUMERIC){
//条件为真,是日期格式数据
if (DateUtil.isCellDateFormatted(cell)){
//返回数据是java.util.Date类型
return cell.getDateCellValue();
}
//返回数据是double类型
return cell.getNumericCellValue();
}
4.BigDecimal与double的坑
直接拿double类型数据来初始化BigDecimal类型的变量,会导致精度问题
java">double num = 3.3;
BigDecimal bigDecimal = new BigDecimal(num);
//输出结果是
//3.2999999999999.。。。。。。
从网上找了一通,算是找到一个方案吧
将double类型转换为字符串,用它来初始化BigDecimal类型的变量,不会出现精度问题
java">BigDecimal bigDecimal = new BigDecimal(Double.toString(num));
//输出结果
//3.3
5.时间格式化
在格式化时间时,把模板yyyy-MM-dd HH:mm:ss
写成了yyyy-MM-dd hh:mm:ss
,导致输出一直12小时制,这个需要注意,HH是24小时制,hh是12小时制时间
6.数据上下转型的问题
用poi工具包导入Excel文件里的数据时,由于写了工具类,每个单元格返回数据都向上转型成了Object类型,而对具体数据进行操作时,又需要进行向下转型。
向上转型
是安全的,不会有问题,因为任何类型都继承自Object(向上转型不一定是转型成Object类,只要是相应的父类就可以),但是向下转型不是,容易出错,而且也不能保证客户一定按照要求对单元格进行书写,所以需要对数据进行类型判断instanceof
,才能向下转型
,否则容易出错,例如:
java">if (object instanceof Double){
return (double)object;
}