Java 如何判断从JDBC执行中更改的行数
我不确定如何获得受SQL执行影响的行数 我喜欢这样:Java 如何判断从JDBC执行中更改的行数,java,jdbc,Java,Jdbc,我不确定如何获得受SQL执行影响的行数 我喜欢这样: boolean isResultSet=statement.execute(arbitrarySQLCommand); 我可以通过getUpdateCount()方法获得受影响的行数。那很好。我的问题是当更新计数为零时。这可能意味着: 这是一个DML语句,但它不影响任何行。受影响的零行是有效响应。我只是说有些条件没有满足 这是一个非DML语句(很可能是DDL语句)。。根据定义,它不会更改行,因此更新计数始终为零(duh!)。或者换一种说法:
boolean isResultSet=statement.execute(arbitrarySQLCommand);
我可以通过getUpdateCount()
方法获得受影响的行数。那很好。我的问题是当更新计数为零时。这可能意味着:
我希望是: 返回: (1)SQL数据操作语言(DML)语句的行数,或(2)-1(不返回任何内容的SQL语句)
(注意:我事先不知道
arbitrarySQLCommand
的内容)
最终选择的解决方案 对于这个问题,似乎没有一个真正的类似JDBC的解决方案。在我看来,JDBC的设计者在
getUpdateCount
上犯了一个严重的错误,使用值0(零)表示一个(根据定义)不影响行的语句,因为受影响的零行也是DML语句结果的一个完全有效的值
唯一可能的解决方案似乎是对SQL语句进行某种模式匹配,以确定它是DML语句(INSERT、UPDATE、DELETE)还是其他类型的SQL语句。大概是这样的:
任意SQLCommand
中提取第一个单词。一个字被终止
通过空格或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;
}
}
Set-dmlCommands=new-HashSet(){
{
添加(“更新”);添加(“插入”);添加(“删除”);//添加更多DML命令。。。。
}
};
int updateCount=statement.getUpdateCount();
for(字符串dml:dmlCommands){
if(arbitrarySQLCommand.toUpperCase().contains(dml)&&updateCount==0){
updateCount=-1;
打破
}
}
也许我的答案对你的提问没有帮助,但我是在运行DML后搜索如何获得受影响的行数,而不是发现的行数-使用MySQL。我在这里写下了我的发现,以帮助其他人
我的问题是,例如,当我运行一条语句时,它不会对表进行任何更改
UPDATE table SET field=1 WHERE field=1
方法语句。executeUpdate(…)
返回找到的行数,而不是更改/受影响的行数。因此我无法判断查询是否修改了表中的某些内容
要更改这一点,在创建连接时(使用DriverManager.getConnection()
),应在url中提供一个选项,如下所示:
jdbc:mysql://${jdbc.host}/${jdbc.db}?
useffectedrows=true
我在这里找到的:
和MySQL文档:
你读过吗?@新白痴:谢谢,但在我看来,这个博客只是指出了JDBC中与我遇到的相同的设计问题。通常你会知道你的SQL语句是否是update语句,所以你会知道是否调用executeQuery(),executeUpdate()@EJP:如果我正在创建一个GUI应用程序,用户可以在其中输入任意SQL语句,那么我事先不知道SQL语句。如果我使用
executeQuery()
,executeUpdate()
,等等,其实并不重要,因为它们都会遇到所描述的问题。@EJP:让我们回顾一下:作为一个例子(您所说的符合要求)让我们看看从executeUpdate()
返回的值:(1)SQL数据操作语言(DML)语句的行数,(2)对于不返回任何内容的SQL语句的行数为0。问题是0(零)也是DML语句的可能返回值,因此我无法从返回值区分DML语句和非DML语句。这不是一个完整的证明解决方案。我可以将列名作为insert或UPDATE。您可能希望执行startsWith()
而不是contains())
让它更安全一点。但是,我觉得它仍然不是解决问题的正确方法。我将不情愿地接受这个答案。我之所以不情愿,是因为我确实不喜欢这个解决方案,但它似乎是唯一的解决方案,对此,你当然应该受到表扬。:-)