前两种方法,均可实现数据的批量插入/更新,具体选择哪种需根据具体情况,第三种方法仅用于批量更新数据,介绍如下:
1、先插入数据,遇到冲突时更新:
本方法要求表必须有主键,否则无法判断冲突。举例如下:
insert into xxtable (col1, col2, col3) values <foreach collection="list" index="index" item="i" open="" close="" separator=","> (#{i.col1}, <choose> <when test ="i.col2 != null and i.col2 != ''"> cast(#{i.col2} as numeric), </when> <otherwise>null, </otherwise> </choose> #{i.col3}) </foreach> on conflict (col1, col2) do update set (col1, col2, col3) = (EXCLUDED.col1, EXCLUDED.col2, EXCLUDED.col3)
注:如果希望主键冲突时不做任何操作,可以使用 on conflict (col1, ......) do nothing
2、先更新数据,无数据时插入:
本方法更适合使用Map或实体类参数,单条更新/插入数据,使用List参数时需另行改造。
wi