Знакомство со Statement

Все SQL-запросы можно условно разделить на две группы:

  • Получение данных — к ним относится оператор SELECT.
  • Изменение данных — к ним относятся операторы INSERT, UPDATE и DELETE.

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

Позже мы познакомимся с дополнительными возможностями, но на данный момент советую запомнить — если ты хочешь просто получить данные из таблицы, то метод executeQuery() в подавляющем большинстве случаев будет самым правильным выбором.

Для второй группы запросов нужно использовать другой метод интерфейса Statement — executeUpdate(). В отличии от метода executeQuery(), который возвращает ResultSet, этот метод возвращает целое число, которое говорит сколько строк в таблице было изменено при исполнении вашего запроса.

Например, ты можешь оператором DELETE FROM employee удалить все строки (посему будьте очень аккуратны). В этом случае метод executeUpdate() вернет количество удаленных строк. В некоторых ситуациях знание о количестве измененных строк бывает удобным для построения алгоритмов работы с данными.

В принципе с этим вопросов можно закончить — главное мы уже увидели. Для выборки данных — executeQuery(). Для изменения данных — executeUpdate().

Получим количество пользователей в таблице user с помощью методa executeQuery():

ResultSet results = statement.executeQuery("SELECT Count(*) FROM user");
results.next();
    int count = results.getInt(1);

executeUpdate()

Метод executeUpdate() используется тогда, когда твой запрос что-то меняет в таблице. Это может быть что угодно:

  • оператор UPDATE
  • оператор INSERT
  • оператор DELETE
  • оператор CALL PROCEDURE

Этот метод возвращает количество измененный (или удаленных) строк.

Давай напишем запрос, который увеличит зарплату всех наших сотрудников на 1000 рублей.

int rowsCount = statement.executeUpdate("UPDATE  employee SET salary = salary+1000");

После того как я выполнил этот код, на своей таблице он вернул число 6. В моей таблице было 6 строк. Значит все строки были изменены.

execute ()

Иногда в твоей жизни могут возникнуть ситуации, когда ты точно не знаешь, какой запрос тебе приходится исполнять — выборка или изменение данных. На этот случай создатели JDBC добавили в него еще один универсальный метод — execute().

Этот метод можно использовать вместо executeQuery() и executeUpdate() методов. А помнишь, чем эти методы отличались? Правильно. Типом результата. Поэтому создатели JDBC придумали такое решение.

Метод execute() возвращает boolean. Если это значение равно true, то значит выполнялся запрос на получение данных, и тебе нужно вызвать метод getResultSet(), чтобы получить данные. Пример:

boolean hasResults = statement.execute("SELECT Count(*) FROM user");
    if ( hasResults ) {
        	ResultSet results =  statement.getResultSet();
        	results.next();
        	int count = results.getInt(1);
}

Если это значение равно false, то значит выполнялся запрос на изменение данных, и тебе нужно вызвать метод getUpdateCount(), чтобы получить количество измененных строк. Пример:

boolean hasResults = statement.execute("UPDATE  employee SET salary = salary+1000");
    if ( !hasResults ) {
      	int count = statement.getUpdateCount();
}

Давай напишем метод, который выводит на экран результат запроса:

public void executeAndPrintSQLQuery(String sqlQuery) {

        boolean hasResults = statement.execute(sqlQuery);
        if ( hasResults ) {
 	          ResultSet results =  statement.getResultSet();
           	System.out.println(“Строки вашего запроса ниже:);

           	while (results.next()) {
 	                 Integer id = results.getInt(1);
     	             String name = results.getString(2);
                      System.out.println(results.getRow() + ". " + id + "\t"+ name);
  	        }
       }
 	  else {
            int count = statement.getUpdateCount();
        	System.out.println(“Количество именных строк:+ count);
  	}
}

Вот так метод execute() обычно применяется на практике.