Знакомство со Statement
Все SQL-запросы можно условно разделить на две группы:
- Получение данных — к ним относится оператор SELECT.
- Изменение данных — к ним относятся операторы INSERT, UPDATE и DELETE.
Для первой группы используется уже знакомый нам метод интерфейса Statement — executeQuery(). В принципе для начала этого метода вполне достаточно. Он покрывает очень большой процент запросов, которые вам придется использовать на реальной работе.
Позже мы познакомимся с дополнительными возможностями, но на данный момент советую запомнить — если ты хочешь просто получить данные из таблицы, то метод 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() обычно применяется на практике.