mybatis批量插入

************************************************************************************

当有大量数据需要插入时,可以配置mybatis批量插入,实现高效插入的两种方式

************************************************************************************

 

方式一:使用foreach标签

<insert id="insertBatch" parameterType="java.util.List">
    <trim prefix="insert into md_net_index (" suffix=") " suffixOverrides=",">
        NET_INDEX_ID,
        ACCOUNT_ID,
        CORP_ID,
        NET_BATCH_ID,
        ROAD_NETWORK_ID,
        REMARK,
        CREATE_TIME,
        UPDATE_TIME,
        CREATE_USER,
        UPDATE_USER,
    </trim>
    <trim prefix="values " suffixOverrides=",">
        <foreach collection="list" index="index" item="item" separator=",">
            <trim suffix=")" prefix="(" suffixOverrides=",">
                <if test="item.netIndexId != null">
                    #{item.netIndexId,jdbcType=VARCHAR},
                </if>
                <if test="item.accountId != null">
                    #{item.accountId,jdbcType=VARCHAR},
                </if>
                <if test="item.corpId != null">
                    #{item.corpId,jdbcType=VARCHAR},
                </if>
                <if test="item.netBatchId != null">
                    #{item.netBatchId,jdbcType=VARCHAR},
                </if>
                <if test="item.roadNetworkId != null">
                    #{item.roadNetworkId,jdbcType=VARCHAR},
                </if>
                <if test="item.remark != null">
                    #{item.remark,jdbcType=VARCHAR},
                </if>
                <if test="item.createTime != null">
                    #{item.createTime,jdbcType=VARCHAR},
                </if>
                <if test="item.updateTime != null">
                    #{item.updateTime,jdbcType=VARCHAR},
                </if>
                <if test="item.createUser != null">
                    #{item.createUser,jdbcType=VARCHAR},
                </if>
                <if test="item.updateUser != null">
                    #{item.updateUser,jdbcType=VARCHAR},
                </if>
            </trim>
        </foreach>
    </trim>
</insert>

 

方法二:通过设置SQLSessionTemplate

@Autowired
    private SqlSessionTemplate sqlSessionTemplate;
public void insertBatch(String sqlId, int batchCount) {
List<MdNetIndex> pojos = new ArrayList<>();
int result = 1;
if (pojos == null || pojos.size() == 0 || batchCount < 1) {
return;
}
SqlSession batchSqlSession = null;
batchSqlSession = sqlSessionTemplate.getSqlSessionFactory().openSession(ExecutorType.BATCH, false); // ExecutorType.BATCH批量,ExecutorType.SIMPLE单条(默认),false:取消自动提交
    try {
int batchLastIndex = batchCount; // 每批最后一个的下标
int listSize = pojos.size();
for (int index = 0; index < listSize; ) {
if (batchLastIndex >= listSize) {
batchLastIndex = listSize;
batchSqlSession.insert(sqlId, pojos.subList(index, batchLastIndex));
batchSqlSession.commit();
batchSqlSession.clearCache();
break; // 数据插入完毕,退出循环
} else {
batchSqlSession.insert(sqlId, pojos.subList(index, batchLastIndex));
batchSqlSession.commit();
batchSqlSession.clearCache();
index = batchLastIndex; // 设置下一批下标
batchLastIndex = index + (batchCount - 1);
}
}
} catch (Exception e) {
batchSqlSession.rollback();
} finally {
batchSqlSession.close();
}
}

 

posted @ 2018-01-20 23:43  antlord  阅读(316)  评论(0编辑  收藏  举报