大量数据批量插入数据库
前言
工作时遇到了大量数据需要插入到数据库的情况,一条条的插入速度慢效率低下,不能满足需求,为了解决此问题采用了sql中使用foreach,并在service中设置批量来进行批量插入。此外查找资料时发现还有一种batch方法,但是自己没能实现,希望有大佬可以指点我一下。。
一、在oracle中使用foreach语句的一些注意事项
1、不能使用values语句:最开始使用了 insert into table_name (xxx,xxx,xxx) values 《foreach》 (xxx,xxx,xxx) 《/foreach》
发现oracle报错,从网上查找资料发现oracle中不能使用values,所以暂时放弃了values的写法;
2、《foreach》 标签中的separator的属性为"UNION ALL",将查询合并结果集。
3、oracle没有主键自增,需要将useGeneratedKeys属性设置为false
4、需要使用selece … from dual 虚拟表来过渡
示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。
二、oracle中foreach代码
了解到上述注意事项,就可以写响应的sql语句(mapper.xml),具体代码如下(id字段通过 sys_guid()函数自动插入):
<insert id="batchSave" parameterType="com.gettop.bi.web.model.BiFinanceFeePersonDetail" useGeneratedKeys="false">
insert into BI_FINANCE_FEE_PERSON_DETAIL (ID, VERSION_CODE, PROPERTY_CODE,
DEPARTMENT_BIG_SORT, DEPARTMENT_MOTIVATE_SORT,
DEPARTMENT_SORT, BUDGET_ENTITY, PROJECT_CODE,
SBU_CODE, RANK_SORT, YEAR_MONTH,
PERSON_MONTH, MANPOWER_TOTAL, IYEAR
)
<foreach collection="lists" item="list" index="index" separator="union all">
SELECT
sys_guid(),
#{list.versionCode,jdbcType=VARCHAR}, #{list.propertyCode,jdbcType=OTHER},
#{list.departmentBigSort,jdbcType=VARCHAR}, #{list.departmentMotivateSort,jdbcType=VARCHAR},
#{list.departmentSort,jdbcType=VARCHAR}, #{list.budgetEntity,jdbcType=VARCHAR}, #{list.projectCode,jdbcType=VARCHAR},
#{list.sbuCode,jdbcType=VARCHAR}, #{list.rankSort,jdbcType=VARCHAR}, #{list.yearMonth,jdbcType=VARCHAR},
#{list.personMonth,jdbcType=DECIMAL}, #{list.manpowerTotal,jdbcType=DECIMAL}, #{list.iyear,jdbcType=VARCHAR}
FROM dual
</foreach>
</insert>
三、设置插入的批次
通过下述代码显现批量插入数据,具体代码如下(nums为每次插入的条数,times时插入的此时):
int nums = 1000;
int times = (int)Math.ceil((float)list.size() / nums);// 插入次数
try {
for (int i = 0; i < times; i++){
if(i == times - 1){
biFinanceFeeDetailMapper.batchSave(list.subList(i * nums, list.size()));
resuleMap.put("status",1);
}else {
biFinanceFeeDetailMapper.batchSave(list.subList(i * nums, (i+1) * nums));
resuleMap.put("status",1);
}
}
} catch (Exception e) {
e.printStackTrace();
}
总结
通过查找资料和各种踩oracle的坑终于实现了批量插入,其实速度还是不快,经测试插入5w条数据仍耗费10s,如果哪位大佬有更高效好用的方法,希望可以指导我一下。