1. 背景
今天遇到个业务场景需要批量根据索引删除数据,ORM框架为mybatis,跟以往遇到的根据MySQL主键批量删除不同,本次使用的数据库时PgSQL,使用的联合主键索引;搜索相关资料网上大部分帖子都是使用类似 where id in (...) 的写法,直到找到花了点时间才找到合适的写法,现在总结下;
2. 代码
(1)对于单列主键一般使用IN语句
XML
<delete id="batchDelByIds" parameterType="list">
delete
from t_data
where id in
<foreach collection="list" item="batchId" index="index" open="(" close=")" separator=",">
#{batchId}
</foreach>
</delete>
(2)使用OR语句连接多个条件
XML
<delete id="batchDelByNameAgeEntrys" parameterType="list">
delete
from t_data
where
<foreach collection="list" item="item" index="index" separator=" or ">
(`name`={#item.name,VARCHAR} and `age`={#item.age,INTEGER})
</foreach>
</delete>
(3)使用多条DELETE语句执行
XML
<delete id="batchDelByNameAgeEntrysV2" parameterType="list">
<foreach collection="list" item="item" index="index" separator=";">
delete
from t_data
where
`name`={#item.name,VARCHAR} and `age`={#item.age,INTEGER}
</foreach>
</delete>
注意,这种写法需要sql连接支持多条语句执行,需要在jdbc.url上加上多语句命令的参数,例如:
Lua
spring.datasource.url=jdbc:mysql://127.0.0.1:11070/test?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true
(4)使用多参数的IN语句
XML
<delete id="batchDelByIds" parameterType="list">
delete
from t_data
where (`name`, `age`) in
<foreach collection="list" item="item" index="index" open="(" close=")" separator=",">
({#item.name,VARCHAR}, {#item.age,INTEGER})
</foreach>
</delete>
本次的场景就适合这种写法;注意,如果多字段非联合索引,建议新建联合索引;
以上,希望你能帮到你;