Возвращает количество строк, затронутых инструкцией SQL UPDATE в Java

Я использую базу данных MySQL и обращаюсь к ней через Java.

PreparedStatement prep1 = this.connection.prepareStatement("UPDATE user_table 
                                                               SET Level = 'Super' 
                                                             WHERE Username = ?");
prep1.setString(1, username);

инструкция update выше отлично работает, однако я хотел бы получить количество строк, затронутых этим оператором. Это возможно, пожалуйста?

7 ответов


вызов executeUpdate() на вашем PreparedStatement должен возвращать int, количество обновленных записей.


Statement.executeUpdate() или execute() затем getUpdateCount() вернет количество строк соответствуют, а не обновлено, согласно спецификации JDBC. Если вы хотите обновить количество, вы можете указать useAffectedRows=true как нестандартная опция URL. Более подробная информация здесь.


  1. прежде всего, подготовьте объект "PreparedStatement", используя конструктор ниже:

    PreparedStatement pStmt = con.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
    //here variable 'sql' is your query ("UPDATE user_table SET Level = 'Super' WHERE Username = ?") 
    
  2. затем установите свой аргумент в "pStmt". В этом случае:

    prep1.setString(1, username);
    
  3. наконец, executeUpdate и получить затронутые строки как целое число

    int affectedRows = pStmt.executeUpdate();
    

глядя на это сейчас для другой подобной ситуации, где я хочу только сделать дополнительную работу, если что-то действительно изменилось, я думаю, что самый нейтральный способ сделать это-изменить запрос, чтобы исключить случай, когда поля набора совпадают:

UPDATE user_table SET Level = 'Super' WHERE Username = ? AND Level <> 'Super'

Это число возвращается при выполнении запроса:

int rows = prep1.executeUpdate(); 
System.out.printf("%d row(s) updated!", rows); 

Если необходимо знать, сколько строк будет затронуто без его выполнения, вам придется сначала запустить инструкцию SELECT.


число строк, затронутых обновлением SQL, может быть возвращено с помощью SQL%ROWCOUNT(для ORACLE) или @@ROWCOUNT (для SQL SERVER)

Примечание: Для того, чтобы вернуть количество обновленных строк, удалять и т. д.. мы должны использовать параметр в хранимой процедуре, который будет хранить количество обновленных,удаленных строк и т. д..

  1. получить количество обновленных строк,удалять и т. д.. мы должны использовать registerOutParameter метод в Java

  2. сохранить число строк, обновленных или удаленных и т. д.. в один из Параметр OUT в хранимой процедуре мы должны установить тип этого параметр в нашем скрипте перед выполнением команды. (В случае Обновить или удалить его будет числовым)

  3. после выполнения команды сохраните значение updated или deleted строки в переменную (это может быть новая переменная или переменные имеющеся в типе etc..) вызывая индекс этого параметра (например: A=cs.getInt (3) Если выход параметр в хранимой процедуре 2-й параметр)

  4. теперь переменная имеет значение обновленных или удаленных строк (Я. e.A=10)

пример для сохраненного porcedure

Function demo( A varchar2(10), B OUT NUMBER)RETURN NUMBER IS EXIST_LP NUMBER;
BEGIN
UPDATE demo_temp SET name=A where name="ABC";
B:=SQL%ROWCOUNT -- total number of rows updated
RETRUN EXIST_LP;
END demo;

пример для Java script

public void update(demo demo){
int rowCount = 0;
Connection conn = null;
CallableStatement cs = null;
try{
InitialContext ctx = new InitialContext();
DataSource ds = (DataSource) ctx.lookup("your data source path");
conn = ds.getConnection();
cs = conn.prepareCall("BEGIN ? :=demo_dbp.demo(?,?) ); END;"); // stored proc
cs.registerOutParameter(1, Types.INTEGER);
cs.setString(2, "XYZ");
cs.registerOutParameter(3, Types.NUMERIC);
rowCount=cs.execcuteUpdate();
demo.setUpdateCount(cs.getInt(3));
} catch (SQLException exc) {
  throw new DaoException("An SQL Exception has occurred.", exc);
} catch (NamingException ne) {
  throw new DaoException("A Naming Exception has occurred.", ne);
} catch (Exception e) {
  throw new DaoException("An Exception has occurred", e);
} finally {

  try {
            if (cs != null) {
                cs.close();
            }
} catch (SQLException ex1) {
}
try {
            if (conn != null) {
                conn.close();
            }
} catch (SQLException ex) {
}

}
}

Примечание: executeUpdate() не возвращает количество строк, обновленных или удаленных. Он просто возвращает 0 или 1.

  1. 0--выполнение Не удалось
  2. 1--Успех Исполнение