Java 如何使用jooq批量更新
使用以下方法使用jOOQ进行更新Java 如何使用jooq批量更新,java,jooq,Java,Jooq,使用以下方法使用jOOQ进行更新 for (Balance balance : balances) { dslContext.update(BALANCE) .set(BALANCE.AMOUNT, balance.getAmount()) .where(BALANCE.ID.eq(balance.getId)) .execute(); } 这将迭代所有余额并插入每个余额。我知道
for (Balance balance : balances) {
dslContext.update(BALANCE)
.set(BALANCE.AMOUNT, balance.getAmount())
.where(BALANCE.ID.eq(balance.getId))
.execute();
}
这将迭代所有余额并插入每个余额。我知道这可以用UpdateableRecord来完成。但是
我想避免从数据库中获取余额。Balance是一个包含8个以上字段的表,但我只想更新一个字段。在没有UpdateableRecord的情况下,是否有其他方法可以做到这一点?您的代码很好,但您可以像这样使用批更新:
List<UpdateConditionStep<BalanceRecord> updates = new ArrayList<>();
for (Balance balance : balances) {
updates.add(dslContext.update(BALANCE)
.set(BALANCE.AMOUNT, balance.getAmount())
.where(BALANCE.ID.eq(balance.getId)));
}
dslContext.batch(updates).execute();
文件:
提示:如果您在未锁定的情况下更新余额,请小心丢失的更新。您的代码很好,但您可以使用以下批量更新:
List<UpdateConditionStep<BalanceRecord> updates = new ArrayList<>();
for (Balance balance : balances) {
updates.add(dslContext.update(BALANCE)
.set(BALANCE.AMOUNT, balance.getAmount())
.where(BALANCE.ID.eq(balance.getId)));
}
dslContext.batch(updates).execute();
文件:
只是一个提示:如果在不锁定的情况下更新余额,请小心更新丢失。使用UpdateableRecord的批处理语句
如果希望方便,您仍然可以使用UpdateableRecord,而无需首先从数据库中获取所有记录。假设您正在使用代码生成器并正在生成记录,您将拥有BalanceRecord:
ctx.batchUpdatebalances
流动
.mapb->{
var r=新的平衡记录;
r、 setAmountb.getAmount;
r、 setIdb.getId;
r、 changedBALANCE.ID,false;//防止将ID设置为自身
返回r;
}
.收藏家
处决
这将为你创造一个幕后的机会
使用批处理连接
从jOOQ 3.14开始,您可以使用一个特殊的JDBC连接代理透明地批处理所有逻辑,该代理会延迟jOOQ创建或未创建的所有JDBC语句的执行,并对它们进行缓冲,直到需要执行为止:
dslContext.batchedc->{
余额:余额{
c、 dsl.updateBALANCE
.setBALANCE.AMOUNT,balance.getAmount
.whereBALANCE.ID.eqbalance.getId
.execute;//这尚未执行查询
}
}//现在,缓冲查询正在批量执行
运行单个批量语句
从您的评论来看,似乎希望将其作为一条批量语句运行,而不是在一条批处理语句中对多条语句进行批处理
我不相信这是正确的方法-语句可能会变得庞大,并且不一定比批处理快,但是当然,您可以使用
ctx.updateBALANCE
.余额,
case_BALANCE.ID.mapValues
balances.stream.collecttoMapbalance::getId,balance::getValue
.whereBALANCE.ID.inbalances.stream.mapbalance::getId.collecttoList
处决
这将产生如下结果:
更新余额
设定金额=
病例id
当1时,则为2.50
当2时,则为3.50
13点到8点30分
终止
其中id在1,2,13中
根据您使用的方言,使用MERGE可能会更好:
趋于平衡
使用
值1,2.50,2,3.50,13,8.30
作为s i,b
总的来说,1.id=s.i
和balance.balance=s.b
匹配后,更新集合余额=b
使用UpdateableRecord的批处理语句
如果希望方便,您仍然可以使用UpdateableRecord,而无需首先从数据库中获取所有记录。假设您正在使用代码生成器并正在生成记录,您将拥有BalanceRecord:
ctx.batchUpdatebalances
流动
.mapb->{
var r=新的平衡记录;
r、 setAmountb.getAmount;
r、 setIdb.getId;
r、 changedBALANCE.ID,false;//防止将ID设置为自身
返回r;
}
.收藏家
处决
这将为你创造一个幕后的机会
使用批处理连接
从jOOQ 3.14开始,您可以使用一个特殊的JDBC连接代理透明地批处理所有逻辑,该代理会延迟jOOQ创建或未创建的所有JDBC语句的执行,并对它们进行缓冲,直到需要执行为止:
dslContext.batchedc->{
余额:余额{
c、 dsl.updateBALANCE
.setBALANCE.AMOUNT,balance.getAmount
.whereBALANCE.ID.eqbalance.getId
.execute;//这尚未执行查询
}
}//现在,缓冲查询正在批量执行
运行单个批量语句
从您的评论来看,似乎希望将其作为一条批量语句运行,而不是在一条批处理语句中对多条语句进行批处理
我不相信这是正确的方法-语句可能会变得庞大,并且不一定比批处理快,但是当然,您可以使用
ctx.updateBALANCE
.余额,
case_BALANCE.ID.mapValues
balances.stream.collecttoMapbalance::getId,balance::getValue
.whereBALANCE.ID.inbalances.stream.mapbalance::getId.collecttoList
处决
这将产生如下结果:
更新余额
设定金额=
病例id
当1时,则为2.50
当2时,则为3.50
13点到8点30分
终止
其中id在1,2,13中
根据您使用的方言,这可能更好地使用
合并:
趋于平衡
使用
值1,2.50,2,3.50,13,8.30
作为s i,b
总的来说,1.id=s.i
和balance.balance=s.b
匹配后,更新集合余额=b
看起来它没有使用绑定值?没有?执行的SQL看起来如何?这对应于批处理几个不一定相关的语句。对于JDBC,这不能使用绑定变量来完成。您正在寻找的是在同一页面上批处理单个查询并使用bind…(绑定…)提供绑定变量集:看起来它没有使用绑定值?没有?执行的SQL看起来如何?这对应于批处理几个不一定相关的语句。对于JDBC,这不能使用绑定变量来完成。您正在寻找的是批处理单个查询,并在同一页面上使用bind…(绑定…)提供绑定变量集:您的id、金额对来自何处?我从外部服务接收余额列表。因此,对于这种方法,它是通过方法参数来实现的。您的id、金额对来自哪里?我从外部服务接收余额列表。因此,对于该方法,它是通过方法参数扫描,您还提供了一个将其与MERGE语句/onDuplicateKeyUpdate一起使用的示例?DSLContext.batchMerge仅在jOOQ 3.14中添加,目前尚未发布。您只需将BATCHUPDATE调用更改为BATCHMERGEAT代码生成查询,该查询只考虑Id在WHERE子句中进行更新。如何在where子句中添加更多条件?@pppavan:您按照的建议编写了一个显式查询,但使用上述查询不会生成批更新,而是生成许多更新查询。batchUpdate的工作原理是否与报告中的batchInsert类似?您能否提供一个将其与MERGE语句/onDuplicateKeyUpdate一起使用的示例?DSLContext.batchMerge仅在jOOQ 3.14中添加,目前尚未发布。您只需将BATCHUPDATE调用更改为BATCHMERGEAT代码生成查询,该查询只考虑Id在WHERE子句中进行更新。如何在where子句中添加更多条件?@pppavan:您按照的建议编写了一个显式查询,但使用上述查询不会生成批更新,而是生成许多更新查询。batchUpdate的工作方式是否与报告的batchInsert类似