批量處理即對多條數據進行sql操作,如批量更新,插入,新增。
之前採取過很low的方式,就是在dao層進行循環,對每條數據進行操作。這樣效果可以實現,但是頻繁連接數據庫,性能,效率上非常不好。mybatis支持參數爲list的操作,這樣連接數據庫就一次,把循環的語句寫入到sql語句中,這樣效率會高很多。
如何引入mybatis這裏不做描述。
先看service層方法如何寫
service 接口層定義方法,如:Integer batchUpdate(List<OrderEntity> list);注:對訂單進行批量更新
dao 層也同樣頂一個接口,一般我都用同樣的名字,拷貝起來比較方便,Integer batchUpdate(List<OrderEntity> list);
千萬注意dao層接口是通過mabatis的xml找到真正的實現方式的。
service 實現層 ,public Integer batchUpdate (List<OrderEntity> list){
return dao.batchUpdate (list);//調用dao層的接口,dao層的接口又會找到對應的mybatis的xml的sql語句
}
下面開始說重點,就是mybatis的xml裏怎麼寫的
<update id="batchUpdate " parameterType="java.util.List">
<foreach collection="list" index="index" item="item" separator=";">
update t_order_table
<set>
<trim suffixOverrides=","> <if test="item.count != null"> f_count = #{item.count,jdbcType=BIGINT}, </if> <if test="item.status != null"> f_status= #{item.status,jdbcType=VARCHAR}, </if> </trim>
</set>
<where> <trim suffixOverrides=","> f_id = #{item.id,jdbcType=BIGINT} </trim> </where>
</foreach>
</update>
上面的寫法百度上面都能找到,之所要寫這個主要是因爲,我一直報錯,處理單個沒有問題,一旦數據超過一條就報錯,耽誤了很長時間,後來找到原因,需要在數據庫連接的時候加上一個配置,讓它允許批量處理,
allowMultiQueries=true ,這個很關鍵,一般和字符集一起加上,如:
?characterEncoding=UTF-8&allowMultiQueries=true