gpt4 book ai didi

java - 只有最后更新查询在 JAVA 的 addBatch 中工作

转载 作者:行者123 更新时间:2023-12-01 20:12:25 24 4
gpt4 key购买 nike

我正在使用以下代码

con.setAutoCommit(false);

for(int i=0;i<requestBody.size();i++)
{
bulk_Update_Qry = new StringBuffer();

if (requestBody.getUserDetails().get(i).getFirstName() != null)
dbutil.setField(bulk_Update_Qry, "FIRST_NAME",requestBody.getUserDetails().get(i).getFirstName());
if (requestBody.getUserDetails().get(i).getLastName() != null)
dbutil.setField(bulk_Update_Qry, "LAST_NAME",requestBody.getUserDetails().get(i).getLastName());
if (requestBody.getUserDetails().get(i).getPhone() != null)
dbutil.setField(bulk_Update_Qry, "PHONE",requestBody.getUserDetails().get(i).getPhone() );
if (requestBody.getUserDetails().get(i).getEmail() != null)
dbutil.setField(bulk_Update_Qry, "EMAIL",requestBody.getUserDetails().get(i).getEmail());
if (requestBody.getUserDetails().get(i).getAddress()!= null)
dbutil.setField(bulk_Update_Qry, "ADDRESS",requestBody.getUserDetails().get(i).getAddress());
if (requestBody.getUserDetails().get(i).getZip() != null)
dbutil.setField(bulk_Update_Qry, "ZIP",requestBody.getUserDetails().get(i).getZip() );
if (requestBody.getUserDetails().get(i).getCity() != null)
dbutil.setField(bulk_Update_Qry, "CITY",requestBody.getUserDetails().get(i).getCity() );
if (requestBody.getUserDetails().get(i).getState() != null)
dbutil.setField(bulk_Update_Qry, "STATE",requestBody.getUserDetails().get(i).getState());
if (requestBody.getUserDetails().get(i).getCountry() != null)
dbutil.setField(bulk_Update_Qry, "COUNTRY",requestBody.getUserDetails().get(i).getCountry());

System.out.println("UPDATE CINR_USER SET " + bulk_Update_Qry + " WHERE ID = \'" + requestBody.getUserDetails().get(i).getId() + "\'");
ps = con.prepareStatement("UPDATE CINR_USER SET " + bulk_Update_Qry + " WHERE ID = \'" + requestBody.getUserDetails().get(i).getId() + "\'");

ps.addBatch();
}
ps.executeBatch();
con.commit();

这是一个动态更新查询。

setField 是我定义的一个函数,用于验证它是否存在于请求中。

我面临的问题

如果有 5 个更新查询,则仅执行第 5 个查询。我不确定前四个查询发生了什么。

我也买不起

ps = con.prepareStatement(.....)

在 for 循环之外,因为我使用的是动态更新查询。

有人可以澄清我做错了什么吗?

最佳答案

在每个循环中,您都会创建一个新的 PreparedStatement 对象,并且批处理是每个语句对象。换句话说,每次循环都会丢弃前一个循环的批处理,最后您会得到一个准备好的语句,该语句的批处理仅包含一个语句,因此您只执行在循环的最终运行中定义的语句。

有几种方法可以解决这个问题:

  1. 使用在循环外部创建的普通 Statement 对象。
    这是可行的,因为您实际上并没有使用准备好的语句的主要功能,但这也是不安全的。您当前构造语句的方式使您很容易受到 SQL 注入(inject)的影响。
  2. 不要尝试使用批处理,只在循环内执行语句。
    但在此之前,您需要齐心协力并正确参数化您的查询。
  3. 在循环之前使用正确的参数化查询定义多个准备好的语句,并向正确的语句添加批处理,在循环之后执行所有这些查询。

关于java - 只有最后更新查询在 JAVA 的 addBatch 中工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46503321/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com