Как определить количество строк, измененных из выполнения JDBC
Я не уверен, как получить количество строк, затронутых выполнением SQL.
мне нравится это:
boolean isResultSet = statement.execute(arbitrarySQLCommand);
и я могу получить количество строк, обработанных от getUpdateCount()
метод. Все в порядке. Проблема у меня есть, когда количество обновлений равно нулю. Это может означать:
это был оператор DML, но он не повлиял ни на какие строки. Затронутые нулевые строки-это допустимый ответ. Я просто имею в виду, что некоторые условия не были встретились.
это был оператор не-DML (оператор DDL, скорее всего) .. который по определению не изменяет строки, поэтому количество обновлений всегда равно нулю (duh!). Или, другими словами, понятие обновить бессмысленно для таких утверждений.
то, что я хотел бы иметь возможность различать ситуации 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. Что-то вроде этого:--8-->
- извлечь первое слово из
arbitrarySQLCommand
. Слово завершается либо пробелом, либо символом линии EOL. - если это слово (игнорируя
случай) является ли INSERT, UPDATE или DELETE, то это оператор DML
и выход из
getUpdateCount()
имеет значение, в противном случае вывод изgetUpdateCount()
не имеет значения.
уродливый и склонный к ошибкам. Но единственное возможное решение, которое вышло из этого так вопроса. :-(
2 ответов
лучшее, что вы можете сделать, это проверить инструкцию 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;
}
}
может быть, мой ответ не поможет вам с тем, что вы спросили точно, но я попал сюда, когда я искал, как получить влияет количество строк после запуска 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