<insert id="insertBatch">
insert into ujcms_visit_log (id_, site_id_, user_id_)
values
<foreach collection="list" item="item" separator=",">
(#{item.id,jdbcType=BIGINT}, #{item.siteId,jdbcType=INTEGER}, #{item.userId,jdbcType=INTEGER}
</foreach>
</insert>
* 批量插入数据
* @param list 待插入数据
* @return 插入数据量
int insertBatch(List<VisitLog> list);
对于的SQL语句类似如下:
insert into ujcms_visit_log
(id_, site_id_, user_id_)
values
(?,?,?),
(?,?,?),
(?,?,?)
但需要注意参数的数量,SqlServer 参数限制为2100个,Oracle、PostgreSQL参数限制为32767个,MySQL参数限制为65535个。
如果需要兼容所有的数据库,一次插入的条数大概在100-200条之间。否则可以在1000-2000条左右。
<update id="updateBatch">
update ujcms_site_buffer
<trim prefix="set" suffixOverrides=",">
<trim prefix="views_=case" suffix="end,">
<foreach collection="list" item="item" index="index">
when id_=#{item.id} then views_+#{item.views}
</foreach>
</trim>
<trim prefix="self_views_=case" suffix="end,">
<foreach collection="list" item="item" index="index">
when id_=#{item.id} then self_views_+#{item.selfViews}
</foreach>
</trim>
</trim>
where id_ in
<foreach collection="list" index="index" item="item" separator="," open="(" close=")">
#{item.id,jdbcType=INTEGER}
</foreach>
</update>
对应的sql语句类似:
UPDATE ujcms_site_buffer
views_ = CASE
WHEN id_=1 THEN 'abc1'
WHEN id_=2 THEN 'abc2'
WHEN id_=3 THEN 'abc3'
self_views_ = CASE
WHEN id_=1 THEN 123
WHEN id_=2 THEN 234
WHEN id_=3 THEN 345
WHERE id_ IN (1,2,3)
这种方式兼容性好,但也需注意SQL Server的2100个参数限制。