我不确定如何从SQL执行中获取受影响的行数.
我喜欢这个:
boolean isResultSet = statement.execute(arbitrarySQLCommand);
Run Code Online (Sandbox Code Playgroud)
我可以从该getUpdateCount()
方法获得受影响的行数.这一切都很好.我遇到的问题是更新计数为零时.这可能意味着:
这是一个DML语句,但它不会影响任何行.受影响的零行是有效的响应.我只是意味着某些条件没有得到满足.
这是一个非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语句.像这样的东西:
arbitrarySQLCommand
.单词由空格或EOL行字符终止.getUpdateCount()
相关,否则输出getUpdateCount()
是无关紧要的.丑陋且容易出错.但是这个问题出来的唯一可能的解决方案.:-(
您可以做的最好的事情是检查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)
也许我的答案对你提出的问题没有帮助,但是当我在运行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
归档时间: |
|
查看次数: |
14222 次 |
最近记录: |