需求:读取excel 里面的数据,然后存储到数据库,因为excel 里数据量比较大
1-2w 条,一次性存储到数据库速度会很慢,考虑将List 拆分成1000size 的多个List
现在有一个List 里面有110条数据,想要均匀拆分成3个小List
int sum = list.size(); 数据总条数 System.out.println("【文件数据量】=" + sum); int pagesize = 1000; int page = (int)Math.ceil((double)sum/pagesize); 每个List 1000条,这里类似分页,先计算出总共的份数(页数) 然后调用拆分List 的方法
public static <T> List<List<T>> averageAssign(List<T> source,int n){ List<List<T>> result=new ArrayList<List<T>>(); int remaider=source.size()%n; //(先计算出余数) int number=source.size()/n; //然后是商 int offset=0;//偏移量 for(int i=0;i<n;i++){ List<T> value=null; if(remaider>0){ value=source.subList(i*number+offset, (i+1)*number+offset+1); remaider--; offset++; }else{ value=source.subList(i*number+offset, (i+1)*number+offset); } result.add(value); } return result; }
测试,List 五条数据,拆分成3个List 就是 2 - 2 -1
List<Integer> integers=new ArrayList<>(); integers.add(1); integers.add(2); integers.add(3); integers.add(4); integers.add(5); List<List<Integer>> lists=averageAssign(integers, 3);
结果 [[1, 2], [3, 4], [5]]
二、mybatis 批量保存数据
int batchInsert(List<Sku> list); <insert id="batchInsert" parameterType="java.util.List"> insert into sku ( SKU_NO, SOLD_TO, HUB_ID, SOLD_ALLOCATION, HUB_ALLOCATION ) values <foreach collection="list" item="sku" index="index" separator="," > ( #{sku.skuNo,jdbcType=VARCHAR}, #{sku.soldTo,jdbcType=VARCHAR}, #{sku.hubId,jdbcType=VARCHAR}, #{sku.soldAllocation,jdbcType=VARCHAR}, #{sku.hubAllocation,jdbcType=VARCHAR} ) </foreach> </insert>