Java sql statement executeupdate
Для взаимодействия с базой данных приложение отправляет серверу MySQL команды на языке SQL. Чтобы выполнить команду, вначале необходимо создаеть объект Statement .
Для его создания у объекта Connection вызывается метод createStatement() :
Statement statement = conn.createStatement();
Для выполнения команд SQL в классе Statement определено три метода:
- executeUpdate : выполняет такие команды, как INSERT, UPDATE, DELETE, CREATE TABLE, DROP TABLE. В качестве результата возвращает количество строк, затронутых операцией (например, количество добавленных, измененных или удаленных строк), или 0, если ни одна строка не затронута операцией или если команда не изменяет содержимое таблицы (например, команда создания новой таблицы)
- executeQuery : выполняет команду SELECT. Возвращает объект ResultSet, который содержит результаты запроса.
- execute() : выполняет любые команды и возвращает значение boolean: true — если команда возвращает набор строк (SELECT), иначе возвращается false.
Рассмотрим метод executeUpdate() . В качестве параметра в него передается собственно команда SQL:
int executeUpdate("Команда_SQL")
Ранее была создана база данных store, но она пустая, в ней нет таблиц и соответственно данных. Создадим таблицу и добавим в нее начальные данные:
import java.sql.*; public class Program < public static void main(String[] args) < try< String url = "jdbc:mysql://localhost/store?serverTimezone=Europe/Moscow&useSSL=false"; String username = "root"; String password = "password"; Class.forName("com.mysql.cj.jdbc.Driver").getDeclaredConstructor().newInstance(); // команда создания таблицы String sqlCommand = "CREATE TABLE products (Id INT PRIMARY KEY AUTO_INCREMENT, ProductName VARCHAR(20), Price INT)"; try (Connection conn = DriverManager.getConnection(url, username, password))< Statement statement = conn.createStatement(); // создание таблицы statement.executeUpdate(sqlCommand); System.out.println("Database has been created!"); >> catch(Exception ex) < System.out.println("Connection failed. "); System.out.println(ex); >> >
То есть в данном случае мы выполняем команду CREATE TABLE products (Id INT PRIMARY KEY AUTO_INCREMENT, ProductName VARCHAR(20), Price INT) , которая создает таблицу Products с тремя столбцами: Id — индентификатор стоки, ProductName — строковое название товара и Price — числовая цена товара.
При этом если необходимо выполнить сразу несколько команд, то необязательно создавать новый объект Statement:
Statement statement = conn.createStatement(); statement.executeUpdate("Команда_SQL1"); statement.executeUpdate("Команда_SQL2"); statement.executeUpdate("Команда_SQL3");
Выполнение запросов
Все 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 )
Если это значение равно false , то значит выполнялся запрос на изменение данных, и тебе нужно вызвать метод getUpdateCount() , чтобы получить количество измененных строк. Пример:
boolean hasResults = statement.execute("UPDATE employee SET salary = salary+1000"); if ( !hasResults )
Давай напишем метод, который выводит на экран результат запроса:
public void executeAndPrintSQLQuery(String sqlQuery) < boolean hasResults = statement.execute(sqlQuery); if ( hasResults ) < ResultSet results = statement.getResultSet(); System.out.println(“Строки вашего запроса ниже: ”); while (results.next()) < Integer String name = results.getString(2); System.out.println(results.getRow() + ". " + id + "\t"+ name); >> else < int count = statement.getUpdateCount(); System.out.println(“Количество именных строк: ” + count); >>
Вот так метод execute() обычно применяется на практике.