最近有个需求,将excel的数据导入的数据库的这个一个操作。
工作主要分为:解析excel,将excel中的数据单条循环插入数据库。
使用框架:mybatis+spring
使用过Mybatis的人都知道,自动生成的Mapper里是不支持批量插入的,也不支持SQL。这个让我有点小小的郁闷,网上查资料发现对这方面的资料颇少。于是决定写一篇blog案例分享心得。
或许有人要问既然Mybatis既然支持插入了,为何非要要使用批量插入。我这里的excel中的数据最少也是上W条,如果是使用单条循环插入的话会对数据库造成很大的负荷状态,数据库的连接资源是有限的,循环插入的时候会直接的影响其它的数据库操作。
pojo
package me.gall.business.model.mybatis.bean;
/**
* @author Quinn He
* @dateTime 2012-2-9 下午4:35:18
*
*/
public class ApkStatisticRaw {
private Integer id;
private String uuid;
private String apkId;
private String eventId;
private Integer supplyId;
private Integer channelId;
private String fileUploadRecordId;
private String productName;
private String content;
private Long time;
private Integer numbers;
private Integer status;
private String creator;
private Long createTime;
private String other;
set...
get...
}
interface
import me.gall.business.model.mybatis.bean.ApkStatisticRaw;
/**
* @author Quinn He
* @dateTime 2012-2-20 下午7:48:39
*/
public interface ApkStatisticRawExtMapper {
/**
* 专门针对在导入CSV文件时
* 频繁操作数据库造成的数据库并发问题
* 固此方法为批量插入方法
*
* @author Quinn He
* @dateTime 2012-3-30 上午11:34:22
* @param list
*/
void batchInsert(List<ApkStatisticRaw> list);
}
再看看XML里的操作
<select id="batchInsert" parameterType="java.util.List">
insert into apk_statistic_raw
(uuid,apk_id,event_id,supply_id,channel_id,file_upload_record_id,product_name,content,time,numbers,status,creator,create_time,other
)values
<foreach collection="list" item="item" index="index"
separator=",">
(#{item.uuid,jdbcType=CHAR},#{item.apkId,jdbcType=CHAR},#{item.eventId,jdbcType=CHAR},#{item.supplyId,jdbcType=INTEGER},#{item.channelId,jdbcType=INTEGER}
,#{item.fileUploadRecordId,jdbcType=CHAR},#{item.productName,jdbcType=VARCHAR},#{item.content,jdbcType=VARCHAR},#{item.time,jdbcType=BIGINT},
#{item.numbers,jdbcType=INTEGER},#{item.status,jdbcType=INTEGER},#{item.creator,jdbcType=VARCHAR},#{item.createTime,jdbcType=BIGINT},#{item.other,jdbcType=VARCHAR}
)
</foreach>
</select>
如此简单的操作,我也不做多说吧。相信都能看懂#{item.uuid,jdbcType=CHAR}其中uuid是对象的字段,CHAR是对应的数据库字段类型