spprogrammer 2018-01-25
工作中需要批量导入excel数据到mysql数据库中
excel数据量比较大,一次大概导入1万多条
用传统的for循环导入mysql数据库的话,非常耗时,大概3分钟左右
所有就需要用到批处理,核心算法如下
/** * 批量插入功能 */ @SuppressWarnings("unchecked") public void insertBatch(final List<WinddataBo> list) { SqlMapClient sqlMapClientTemplate = baseDao.getSqlMapClient(); try { sqlMapClientTemplate.startTransaction();//开启事务 /**事务todo start***/ /**先执行删除所有**/ sqlMapClientTemplate.delete("com.zero2ipo.ylcf.winddata.deleteAll"); sqlMapClientTemplate.insert("com.zero2ipo.ylcf.winddata.insertBatch",list); /**事务todo end***/ sqlMapClientTemplate.commitTransaction();//提交事务 } catch (SQLException e) { e.printStackTrace(); }finally { try { sqlMapClientTemplate.endTransaction();//事务完成 } catch (SQLException e) { try { sqlMapClientTemplate.getCurrentConnection().rollback(); //事务回滚 } catch (SQLException e1) { e1.printStackTrace(); } e.printStackTrace(); } } }
ibatis sql文件如下
<!--批量插入--> <insert id ="com.zero2ipo.ylcf.winddata.insertBatch" parameterClass ="java.util.List"> <![CDATA[ insert into winddata(CRETE_DATE , SHOUPANJIA , COLUMN1,COLUMN2 ) values ]]> <iterate conjunction ="," > <![CDATA[ (#list[].creteDate#,#list[].shoupanjia#,#list[].column1#,#list[].column2#) ]]> </iterate > </insert >
1次导入excel1万多条数据,耗时大概3秒钟
部分效果图