常见有三种实现方案
表结构:
CREATE TABLE test01 (
id varchar(64) NOT NULL,
"name" varchar(64) NULL,
CONSTRAINT pkey_test01 PRIMARY KEY (id)
);
方案一:
dao接口关键代码
void insertBatch01(List<Test01> test01List);
xml关键代码
<insert id="insertBatch01" parameterType="list">
INSERT INTO test01 (id, name)
VALUES
<foreach collection="list" item="item" index="index" separator=",">
(
#{item.id},
#{item.name}
)
</foreach>
-- on conflict (id) do update set name= 'new_name' -- 存在则更新,根据实际业务选择
</insert>
缺点:在实际使用中,mybatis传入的values是一个List,这里做update的时候,取不到list中的值
方案二:
-- 批量插入(方式二)
<insert id="insertBatch02" parameterType="java.util.List">
<foreach collection="list" item="item" index="index" open="" close="" separator=";">
insert into test01(id, name) values(#{item.id}, #{item.name})
-- on conflict (id) do update set name = #{item.name} -- 存在则更新,不存在则插入,根据实际需要选择
</foreach>
</insert>
-- 批量更新
<update id="updateBatch01" parameterType="java.util.List">
<foreach collection="list" item="item" index="index" open="" close="" separator=";">
update test01
set name = #{item.name,jdbcType=VARCHAR}
where
id = #{item.id,jdbcType=VARCHAR}
</foreach>
</update>
方案三:基于其他表构建批量数据,一次插入
insert into test01(id, name) (查询SQL,查询结果为id, name)
-- on conflict (id) do update set name = 'name_new' -- 根据实际业务选择
示例:
insert into test01(id, name) (select 'id1', 'value1')
注意:查询SQL两边的括号()可以不写