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

pet*_*erh 10 java jdbc

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

我喜欢这个:

boolean isResultSet = statement.execute(arbitrarySQLCommand);
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

我对产生输出的语句不感兴趣所以我也可以使用executeUpdate()但是我看到它的返回值有同样的缺陷:

返回:

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

Arghhh!
我希望它是:

返回:

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



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



最终选择的方案

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

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

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

丑陋且容易出错.但是这个问题出来的唯一可能的解决方案.:-(

san*_*hat 7

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

Set<String> dmlCommands = new HashSet<String>() {
  {
    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;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 你可能想做`startsWith()`而不是`contains()`来使它更安全一些.但是,它仍然不是解决问题的正确方法. (2认同)
  • 我会接受这个答案 - 不情愿.我不情愿的原因是我真的不喜欢这个解决方案,但它似乎只是*唯一的解决方案,为此您当然应该被认可.:-) (2认同)

Tru*_*oft 5

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

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

UPDATE table SET field=1 WHERE field=1
Run Code Online (Sandbox Code Playgroud)

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

要更改此设置,应在创建连接时使用url中的选项(with 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