文章作者:Tyan
博客:noahsnail.com ?|? CSDN ?|? 簡書
在操作數(shù)據(jù)庫時,經(jīng)常會碰到批量插入跳夭、批量刪除的情況亡笑,直接執(zhí)行SQL語句還好做一點钳枕,當使用Mybatis進行批量插入、批量刪除時會有一些問題藐俺。下面對使用Mybatis批量插入炊甲,批量刪除進行介紹。
1. 批量插入
- Java代碼:
// Model: Test.java
@Data
public class Test {
private String x;
private String y;
private String z;
}
// Mapper: TestMapper.java
public void insertTestList(List<Test> testList);
- XML代碼
<!-- XML: TestMapper.XML -->
...
<!-- 忽略重復數(shù)據(jù) -->
<insert id="insertTestList" parameterType="Test">
INSERT IGNORE INTO
test_table(test_x, test_y, test_z)
VALUES
<foreach item="item" index="index" collection="list" open="(" close=")" separator=",">
#{item}.x, #{item.y}, #{item}.z
</foreach>
</insert>
<!-- 更新重復數(shù)據(jù) -->
<insert id="insertTestList" parameterType="Test">
INSERT INTO
test_table(test_x, test_y, test_z)
VALUES
<foreach item="item" index="index" collection="list" open="(" close=")" separator=",">
#{item}.x, #{item.y}, #{item}.z
</foreach>
ON DUPLICATE KEY UPDATE
test_x = VALUES(test_x),
test_y = VALUES(test_y),
test_z = VALUES(test_z)
</insert>
...
- 批量插入SQL語句
insert into test_table(x, y, z) values (1, 1, 1), (2, 2, 2), (3, 3, 3)
備注:VALUE()是Mysql的一個函數(shù)欲芹,具體解釋可以查看文檔function_values卿啡。
主要功能就是在數(shù)據(jù)重復時可以獲取要更新的值。
2. 批量刪除
- Java代碼:
// Model: Test.java
@Data
public class Test {
private String x;
private String y;
private String z;
}
// Mapper: TestMapper.java
public void deleteTestList(List<Test> testList);
- XML代碼
<!-- XML: TestMapper.XML -->
...
<delete id="deleteTestList" parameterType="Test">
DELETE FROM
test_table
WHERE
<foreach item="item" index="index" collection="list" open="(" close=")" separator="OR">
test_x = #{item.x} AND test_y = #{item.y} AND test_z = #{item.z}
</foreach>
</delete>
...
- SQL語句
delete from test_table where (test_x = 1 AND test_y = 1 AND test_z = 1) or (test_x = 2 AND test_y = 2 AND test_z = 2) or (test_x = 3 AND test_y = 3 AND test_z = 3)
備注:上面的代碼為x,y,z為聯(lián)合主鍵的情況菱父,普通情況使用where id in
颈娜。