mybatis批量更新
时间: 2023-09-28 07:07:51 浏览: 81
MyBatis 提供了两种方式进行批量操作,分别是:
1. `foreach` 循环批量操作
通过 `foreach` 循环遍历需要批量操作的数据,并且在 SQL 语句中使用 `VALUES` 或 `SET` 关键字来设置需要更新或插入的值。
以批量更新为例,示例代码如下:
```xml
<update id="batchUpdate" parameterType="java.util.List">
UPDATE user SET
name = CASE id
<foreach collection="list" item="item" separator=" ">
WHEN #{item.id} THEN #{item.name}
</foreach>
END,
age = CASE id
<foreach collection="list" item="item" separator=" ">
WHEN #{item.id} THEN #{item.age}
</foreach>
END
WHERE id IN
<foreach collection="list" item="item" open="(" separator="," close=")">
#{item.id}
</foreach>
</update>
```
其中,`parameterType` 指定了参数类型为 `java.util.List`,表示传入一个列表对象,列表中存储需要更新的数据。
`foreach` 标签中,`collection` 指定了需要遍历的列表对象,`item` 指定了列表中的元素名称,`separator` 指定了分隔符。在 `CASE` 子句中,使用 `WHEN` 关键字来指定更新条件,`THEN` 后面的值表示需要更新的值。
2. 使用 `SQLSession` 的 `batch` 批量操作
`SQLSession` 提供了 `batch` 方法来实现批量操作,该方法接收一个 `java.util.function.Consumer` 参数,该参数表示需要执行的批量操作逻辑。
以批量更新为例,示例代码如下:
```java
List<User> userList = new ArrayList<>();
// 添加需要更新的数据到 userList 中
try (SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH)) {
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
for (User user : userList) {
userMapper.update(user);
}
sqlSession.flushStatements();
sqlSession.commit();
sqlSession.clearCache();
}
```
其中,`ExecutorType.BATCH` 表示使用批量执行器执行批量操作。在 `for` 循环中,调用 `update` 方法逐条更新数据,`flushStatements` 方法将缓存的 SQL 语句发送给数据库执行,`commit` 方法提交事务,`clearCache` 方法清空缓存。
阅读全文