Как определить количество строк, измененных из выполнения JDBC

Я не уверен, как получить количество строк, затронутых выполнением SQL.

мне нравится это:

boolean isResultSet = statement.execute(arbitrarySQLCommand);

и я могу получить количество строк, обработанных от getUpdateCount() метод. Все в порядке. Проблема у меня есть, когда количество обновлений равно нулю. Это может означать:

  1. это был оператор DML, но он не повлиял ни на какие строки. Затронутые нулевые строки-это допустимый ответ. Я просто имею в виду, что некоторые условия не были встретились.

  2. это был оператор не-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-->

  1. извлечь первое слово из arbitrarySQLCommand. Слово завершается либо пробелом, либо символом линии EOL.
  2. если это слово (игнорируя случай) является ли 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