批量update

我们都知道在MySQL中批量insert的速度会比一条条insert快很多。类似的,update也应该是如此,但因为update的值往往因为条件的不同而不同,只能分开做。
但是在下面的情况下,批量的update是可以做到的。
1. 查询的条件中有主键或唯一键
2. 查询的条件是等于,而不是范围。这实际上包含了1的情况

在1的情况下,可以使用
replace 或者 insert into ... values ... on duplicate key update ...
两者都是在键重复的情况下自动的做更新,但需要注意的是,键不存在的时候会做insert操作。

在2的情况下,可以建一张临时表,把要更新的值插入临时表,然后和需要更新的表连接做update
如:

+-------------+------------------+------+-----+-------------------+
| Field | Type | Null | Key | Default |
+-------------+------------------+------+-----+-------------------+
| id | int(11) | NO | PRI | NULL |
| name | varchar(30) | YES | | NULL |
| email | varchar(40) | YES | | NULL |
| address | varchar(50) | YES | | NULL |
| age | int(10) unsigned | YES | | NULL |
| regist_time | timestamp | NO | | CURRENT_TIMESTAMP |
+-------------+------------------+------+-----+-------------------+

要按照id更新name
两种方法分别为

insert into user (id,name) values (?,?),(?,?) on duplicate key update name = values(name)




create temporary table tmp (id int primary key, n varchar(20));
insert into tmp values (?,?),(?,?);
update user, tmp set user.name = tmp.n where user.id = tmp.id;

这样当user的数据量是10万,更新2万的时候,包括必要的程序时间,一条条更新需要1.7秒,方法1需要0.30秒,方法2需要0.26秒。
JPA实现批量update有以下几种方法: - **使用本地SQL**:可以使用 `@Query` 注解结合 `nativeQuery = true` 来编写本地SQL进行批量更新。例如,将 `updateStatus` 方法里调用的JPA的 `save` 方法替换为本地SQL: ```java @Query(value = "update order set status = :status where id = :id", nativeQuery = true) @Modifying ``` 这种方式可以直接编写SQL语句来实现批量更新,适用于复杂的批量更新操作 [^1]。 - **使用 `@Modifying` 和 `@Query` 注解**:通过 `@Modifying` 和 `@Query` 注解来定义更新查询。例如,批量删除操作可以通过更新 `deleted` 字段来实现: ```java @Modifying @Query("update ShopCoupon sc set sc.deleted = true where sc.id in :ids") public void deleteByIds(@Param(value = "ids") List<String> ids); ``` 这种方式使用JPQL(Java Persistence Query Language)来进行批量更新,相对更符合JPA的规范 [^3]。 - **通过 `set` 方法加 `save` 方法**:先通过 `find` 方法找出要修改的数据,使用 `set` 方法更新对象的某个属性,然后调用 `save` 方法再次保存。示例代码如下: ```java @Override public User modifyUser(User user) { int userId = user.getId(); User oldUser = userRepository.findById(userId); oldUser.setUserTitle(user.getUserTitle()); userRepository.save(oldUser); return userRepository.findById(userId); } ``` 不过这种方式通常是针对单个对象的更新,如果要实现批量更新,需要循环处理多个对象 [^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值