常见有三种实现方案
表结构:
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两边的括号()可以不写