在 java 代码中计算传递给 MySql 的多个查询中受影响的行数

Count number of affected rows over several queries passed to MySql in java code

我会计算受 java 中作为准备语句提供的查询影响的行数传递给 MySql 引擎。

给定以下示例查询传递给准备好的语句,我需要能够计算受所有查询影响的总行数。

//insert data into table X ;
//update records of table X ;

查询以“;”分隔这是 MySql 语法的一部分,用于支持对特定 PreparedStatement 对象的多个 CRUD 操作。 似乎在调用 "executeUpdate()" 方法时,返回的只是受第一个查询影响的行数,即插入到 table。 我是否遗漏了我应该提供的内容以获取此类查询中受影响的总行数?

这是我正在处理的示例真实代码:

insert into Activity
select * from (select ?, ?, ?, ?) as temp
where not exists(select * from Activity where ActivityName=?);
update Activity
set EmployeeeName=?, DepartmentName=?, roleId=? 
where ActivityName=?;

我期望最小值 1 作为输出,而得到 0。

  1. 检查一下 returns select * from Activity where ActivityName=?.

  2. 检查一下 returns select ... where ... (select ...).

在评论中解释了您的目标后,还有其他解决方案可以增加尚不存在的价值。

  1. 定义列ActivityName是一个主键(如果没有做是)。然后不检查任何东西,不做任何select,只做insert:
    try {
      // statement to insert like
      // insert into Activity (ActivityName, EmployeeeName, DepartmentName, roleId)
      //     values (?, ?, ?, ?)
    } catch ... {
      // If the exception is caused by primary key violation,
      // then such ActivityName already existed and we can ignore this exception
    }

为什么不先检查这样的 ActvityName 是否已经存在?因为如果您有许多来自同一用户或许多其他用户的并行请求,那么在您检查和插入新值之间的时间里,其他一些请求可以插入该值,并且您会遇到主键冲突异常。这就是为什么您无论如何都需要 try/catch 的原因。这就是为什么只插入而不进行任何检查并使用正确的 try/catch.