如何判断从JDBC执行更改的行数

我不确定如何从SQL执行中获取受影响的行数。

我喜欢这个:

boolean isResultSet = statement.execute(arbitrarySQLCommand); 

我可以从getUpdateCount()方法获取受影响的行数。 这一切都很好。 我遇到的问题是更新计数为零时。 这可能意味着:

  1. 这是一个DML语句,但它不会影响任何行。 受影响的零行是有效的响应。 我只是意味着某些条件没有得到满足。

  2. 这是一个非DML语句(最有可能是DDL语句)..根据定义,它不会更改行,因此更新计数始终为零(呃!)。 或者换句话说:对于这样的陈述, 更新计数的概念毫无意义。

我想要的是能够区分上面的情况1和2 。 怎么样?

我对产生输出的语句不感兴趣,所以我也可以使用executeUpdate(),但正如我所看到的那样,该方法的返回值具有相同的缺陷:

返回:

(1)SQL数据操作语言(DML)语句的行数或(2)0表示不返回任何内容的SQL语句

Arghhh!
我希望它是:

返回:

(1)SQL数据操作语言(DML)语句的行计数或(2)-1表示不返回任何内容的SQL语句

(注意:我事先不知道arbitrarySQLCommand SVLCommand的内容)

最终选择的方案

似乎没有一个真正的类似JDBC的解决方案。 在我看来,JDBC的设计者在getUpdateCount上犯了一个严重的错误,它使用值0(零)来表示一个没有(按定义)影响行的语句,因为受影响的零行也是一个完全有效的结果值DML声明。

唯一可能的解决方案似乎是在SQL语句上进行某种模式匹配,以确定它是否是DML语句(INSERT,UPDATE,DELETE)或其他类型的SQL语句。 像这样的东西:

  1. arbitrarySQLCommand SFLCommand中提取第一个单词。 单词由空格或EOL行字符终止。
  2. 如果该单词(忽略大小写)是INSERT,UPDATE或DELETE,则它是DML语句, getUpdateCount()的输出是相关的,否则getUpdateCount()的输出是无关紧要的。

丑陋且容易出错。 但是这个问题出来的唯一可能的解决方案。 🙁

您可以做的最好的事情是检查SQL语句

 Set dmlCommands = new HashSet() { { add("UPDATE"); add("INSERT"); add("DELETE"); //Add more DML commands .... } }; int updateCount = statement.getUpdateCount(); for(String dml : dmlCommands) { if(arbitrarySQLCommand.toUpperCase().contains(dml) && updateCount == 0) { updateCount = -1; break; } } 

也许我的答案对你提出的问题没有帮助,但是在我搜索了如何在运行DML之后如何获得受影响的行数时,我找到了这里,没有找到行计数 – 使用MySQL。 我在这里写下我发现的帮助别人的东西。

我的问题是,当我运行一个没有在表中做任何更改的语句时,例如

 UPDATE table SET field=1 WHERE field=1 

方法Statement.executeUpdate(...)返回找到的行数,而不是已更改/受影响的行数。 所以我无法判断查询是否修改了表中的内容。

要更改此设置,应在创建连接时使用url(使用DriverManager.getConnection() )提供一个选项,如下所示:

jdbc:mysql://${jdbc.host}/${jdbc.db}? useAffectedRows=true

我在这里找到了:

http://mybatis-user.963551.n3.nabble.com/Return-number-of-changed-rows-tp3888464p3903155.html

和MySQL文档:

https://dev.mysql.com/doc/connector-j/5.1/en/connector-j-reference-configuration-properties.html