龙空技术网

subList引发的空指针异常

诗歌乐园 12

前言:

当前同学们对“mysql光标没了”大体比较关怀,咱们都需要了解一些“mysql光标没了”的相关资讯。那么小编在网上网罗了一些关于“mysql光标没了””的相关内容,希望朋友们能喜欢,同学们快快来学习一下吧!

今天开发了一个批量导入数据的功能,导入的数据使用mybatis框架持久化到mysql数据库。由于导入的数据量较大,需要分批插入到库表中。这个功能并不复杂,但是在调试的过程中却爆出了空指针异常。

以前听说subList使用不当,会出问题,可没听说过会空指针啊,难道是我又犯了啥低级错误。下面看看我写的代码:

int. batchSize = 1000;int  remaider = importList.size()%batchSize;int. loop = importList.size()/batchSize;loop = remaider==0?loop:(loop+1);for(int i=1;i<=loop;i++){  int endIndex = (i==loop)?importList.size():i*loop;  List<TaxDO>. insertList = importList.subList((i-1)*batchSize,endIndex);  taxMapper.batchInsert(insertList);}

这段代码本身并没有问题,而是公司封装的mybatis的插件里爆出了空指针异常。

公司将敏感词的处理逻辑封装在mybatis的插件中。插件中有一行代码如下:

(Collection)ReflectUtil.newInstanceIfPossible(param.getClass())

param为subList类型数据时,这行代码返回值为null,后续会向这个返回的集合放数据,空指针异常就出现了。

插件是打到jar包里面的,没法对代码进行修改。因此我们不能用subList视图数据进行批量插入。

修改如下:

int. batchSize = 1000;int  remaider = importList.size()%batchSize;int. loop = importList.size()/batchSize;loop = remaider==0?loop:(loop+1);List<String>. newList = Lists.newArrayList();for(int i=1;i<=loop;i++){  int endIndex = (i==loop)?importList.size():i*loop;  List<TaxDO>. insertList = importList.subList((i-1)*batchSize,endIndex);  newList.addAll(insertList);  //不实用subList插入数据,避免插件处理空指针  taxMapper.batchInsert(newList);  //清空下数据,供下次使用  newList.clear();}

标签: #mysql光标没了