Как использовать MySQL в Java
В современном мире разработчикам приходиться работать с большими объёмами информации. Чтобы не запутаться в потоке данных, были разработаны специальные программы – базы данных. Но со временем их размеры тоже увеличивались. Эта проблема была решена после появления Систем управления БД. MySQL является одной из таких систем.
Что такое MySQL и базы данных?
База данных представляет собой упорядоченную специальным образом информацию. Например, фотографии в вашем телефоне – это данные, а галерея – база. БД делятся на два вида: реляционные и не реляционные. Первые представляют собой простую таблицу, где каждый объект имеет свой номер. Примером реляционной базы данных может быть любая таблица, составленная в Excel.
MySQL
Система впервые была разработана одноимённой шведской компанией в 1994 году. Через 14 лет американский производитель микросхем Sun Microsystem приобрела право на СУРБД, а с 2010 года MySQL фактический принадлежит Oracle. Несмотря на простоту работы, MySQL довольно быстро завоевала доверие разработчиков. Кроме удобства, разработчики предоставили программистам возможность смотреть и изменять исходный код СУРБД. Сегодня эта технология используется в Google, YouTube, Facebook и других.
MySQL представляет собой систему для управления БД на основе клиент-серверной модели. Эта модель подразумевает наличие двух компьютеров — клиента и сервера. На сервере хранятся все данные в виде таблицы. Когда клиент хочет получить к ним доступ, он обращается с запросом на сервер.
MySQL и SQL – одно и тоже?
Среди неопытных разработчиков бытует мнение, что это одна и та же технология. На самом деле, SQL– это язык запросов. Он был разработан ещё в 1970 году Тедом Коддом. Чтобы клиент и сервер могли взаимодействовать без перебоев, они должны оправлять запросы в соответствии с требованиями. Эти требования описывает SQL.
MySQL использует язык SQL, но не является им. В названии многих технологий есть эта приставка. Вы могли слышать про Postgre SQL, Microsoft SQL и многие другие. Все они используют один язык для обеспечения своей работы.
Как работает MySQL?
Клиент или несколько клиентов делают запрос на сервер. Если сервер получит корректный запрос, то он должен отправить ответ. По сути среда MySQL выполняет 3 основных операции:
- Создание и хранение базы данных.
- Обработка поступающих запросов.
- Отправка ответа.
Базы данных в Java
Как уже упоминалось ранее, в мире существует огромное количество баз данных. Большинство из них использует язык SQL для организации работы. Из-за большого количества разнообразных технологий, разработчики Java ещё в 1996 году создали специальный API – JDBC. Он необходим для взаимодействия со всеми остальными технологиями.
Если разработчику нужно использовать базу данных, то придётся разбираться с JDBC. API представлен в библиотеке java.sql. Для версии EE есть специальный файл – javax.sql. Но далеко не все БД могут работать с этими библиотеками.
Для каждой конкретной технологии есть свои реализации JDBC, которые называются драйверами. Они представленные в JAR файлах. Найти эти файлы можно на сайте разработчика БД. Драйвера позволяют разработчику не вникать в особенности строения и работы конкретной БД, а использовать абстрагированный интерфейс.
Для отправки запросов в JDBC используется SQL, но некоторые базы имеют свой язык обработки запросов. Например, Microsoft SQL Server использует T-SQL.
Устанавливаем драйвер Connector/J
Для того, чтобы взаимодействовать с MySQL необходим драйвер Connector/J. Скачать его можно с официального сайта dev.mysql.com. Заходим на вкладку Download и ищем нужный файл. После этого, на компьютер будет загружен архив. В нём находится наш драйвер в формате .jar. Чтобы взаимодействовать с базой данных, нужно положить этот файл в папку, где находится программа. На этом установка заканчивается.
Проверка драйвера
Перед тем, как идти дальше, проверим работоспособностью скаченного файла. Это можно сделать следующим образом:
publicclassProgram{
publicstaticvoidmain(String[] args) {
try{
Class.forName(«com.mysql.cj.jdbc.Driver»).getDeclaredConstructor().newInstance();
System.out.println(«Connection succesfull!»);
}
catch(Exception ex){
System.out.println(«Connection failed…»);
System.out.println(ex);
} }}
В этом фрагменте мы вызываем метод Class.forName(). В качестве параметра он принимает строку, содержащую полный путь к классу драйвера. У класса, который будет возвращён методом Class.forName, вызывается конструктор с помощью getDeclaredConstructor(). В конце мы из конструктора вызываем метод newInstance(). В результате создаётся объект для работы с БД. Если ни каких ошибок не возникнет, то на экран выведется сообщение: «Connectionsuccesfull!». Если возникнет исключение, то выполниться блок catch.
Подключение к БД
Перед подключением давайте создадим базу store, которая будет хранить модели телефонов и их цену. Создать БД можно через консоль MySQL либо использовать графическое приложение.
В java.sql есть класс Connector, в котором определены методы для работы с подключением к БД. Чтобы создать его объект, нужно вызвать метод getConnection (url, username, password) класса DriverManager. Первый параметр – путь к базе, второй и третий – логин и пароль от БД. Если база данных расположена на вашем компьютере, то в качестве пути можно прописать jdbc:mysql://localhost/name. Name – имя БД, в нашем случае база называется store.
Подключение к store:
Connection connection = DriverManager.getConnection(«jdbc:mysql://localhost/store», «root», «password»);
//работа с БД
Connection.close();
В конце мы вызываем метод close(); Он нужен, чтобы прекратить работу с базой. Вместо него можно использовать блок try{}. Просто поместите строку, в которой создаётся объект, внутрь этого блока.
Проблемы с подключением
У начинающих разработчиков могут возникнуть проблемы. Например, может быть неправильно указан часовой пояс, или могут возникнуть проблемы с сертификатом SSL.
Для примера возьмём простую программу:
public class Program{
public static void main(String[] args) {
try{
String url = «jdbc:mysql://localhost/store»;
String username = «root»;
String password = «password»;
Class.forName(«com.mysql.cj.jdbc.Driver»).getDeclaredConstructor().newInstance();
try (Connection conn = DriverManager.getConnection(url, username, password)){
System.out.println(«Connection to Store DB succesfull!»);
}
}
catch(Exception ex){
System.out.println(«Connection failed…»);
System.out.println(ex);
}
}
}
Здесь мы просто подключаемся к базе данных и, если проблем не возникнет, то выводим сообщение: «Connection to Store DB succesfull!». Если возникнет исключение, то его текст выведется на консоль. В данном примере может возникнуть проблема: The server timezone value ’RTZ 2 (????)’… Такая ошибка возникает из-за отсутствия часового пояса и настроек SSL.
Пример правильно составленного адреса:
Stringurl = «jdbc:mysql://localhost/store?serverTimezone=Europe/Moscow&useSSL=false»;
После store ставится знак вопроса и указывается часовой пояс. Далее идёт параметр useSSL, который мы устанавливаем в false.
Конфигурация
Конфигурационные файлы нужны, чтобы хранить настройки программы. В примере выше мы задаём url, username и password прямо в программе. Если программисту потребуется изменить эти настройки, то программа будет скомпилирована заново. В случае небольших проектов – это не так страшно. Но иногда на компилирование уходит очень много времени. Избежать этого помогут файлы с конфигурациями.
Все конфигурации представляют собой простые текстовые файлы. Создадим файл database.txt. Затем, изменим его расширение на .propertiesили любое другое. В конфигурации записываем:
url = jdbc:mysql://localhost/store?serverTimezone=Europe/Moscow&useSSL=false
username = root
password = password
Использование файла в программе:
public class Program{
public static void main(String[] args) {
try{
Class.forName(«com.mysql.cj.jdbc.Driver»).getDeclaredConstructor().newInstance();
try (Connection conn = getConnection()){
System.out.println(«Connection to Store DB succesfull!»);
}
}
catch(Exception ex){
System.out.println(«Connection failed…»);
System.out.println(ex);
}
}
public static Connection getConnection() throws SQLException, IOException{
Properties props = new Properties();
try(InputStream in = Files.newInputStream(Paths.get(«database.properties»))){
props.load(in);
}
String url = props.getProperty(«url»);
String username = props.getProperty(«username»);
String password = props.getProperty(«password»);
returnDriverManager.getConnection(url, username, password);
}
}
В методе main мы изменили Connection conn = getConnection(). Если раньше объект Connection создавался прямо в блоке try, то теперь за его создание отвечает метод getConnection.
Выполнение команд
До этого мы только создавали базу данных и устанавливали с ней соединение. Но функционал на этом не ограничивается. Для выполнения команд нужен объект класса statement:
Statementstatement = conn.createStatement();
В классе есть 3 объекта, которые позволяют выполнять SQL команды:
- ExecuteUpdate – выполняет команду, в качестве результата возвращает количество изменённых строк таблицы. 0 будет возвращён, когда программа создаёт таблицу.
- ExecuteQuery – метод выполняет только команду select, а возвращает объект ResultSet.Он содержит результат SQLзапроса.
- Execute – самый простой метод для работы с запросами. Вернёт true, если запрос выполнен успешно, иначе false.
Метод ExecuteUpdate
Чтобы продемонстрировать выполнение команд, вызовем метод ExecuteUpdate. В качестве команды передадим запрос на создание таблицы из 3 столбцов.
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, ProductNameVARCHAR(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);
}
}
}
Часто приходится выполнять не одну команду, а несколько. Для этого не нужно заново создавать объект класса statement.
Statement statement = conn.createStatement();
statement.executeUpdate(«Команда_SQL1»);
statement.executeUpdate(«Команда_SQL2»);
statement.executeUpdate(«Команда_SQL3»);
Метод ExecuteQuery
Этот метод позволяет выбрать строки таблицы. В качестве результата возвращает объект ResultSet. Чтобы получить данные из строки, используется метод next(). Пока в объекте есть информация, метод будет возвращать true, когда строки закончатся – вернёт false.Обычно, по строкам таблицы проходят так:
ResultSetresultSet = statement.executeQuery(«SELECT * FROM Products»);
while(resultSet.next()) {//Работа со строками }
В первой строке мы выполняем запрос и записываем его в переменную resultSet. Затем, с помощью цикла while проходим по данным таблицы.
Получить информацию, которая содержится в таблице, мы можем методами getInt, getBoolean, getString и другие. Полный список можно найти в документации. Каждый метод имеет два варианта. Например, intgetInt(int index) и intgetInt(string Caption). Первый вариант вернёт информацию по индексу столбца, второй – по его заголовку. Нумерация столбцов начинается с единицы.
Ранее мы создали таблицу, которая содержит 3 столбца. Прочитаем данные из неё:
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();
try (Connection conn = DriverManager.getConnection(url, username, password)){
Statement statement = conn.createStatement();
ResultSetresultSet = statement.executeQuery(«SELECT * FROM Products»);
while(resultSet.next()){
intid = resultSet.getInt(1); //получаем данные из первого столбца
String name = resultSet.getString(2); //из второго
int price = resultSet.getInt(3); //из третьего
System.out.printf(«%d. %s — %d \n», id, name, price);
}
}
}
catch(Exception ex){
System.out.println(«Connection failed…»);
System.out.println(ex);
}
}
}
Добавление, удаление и редактирование строк
Для полноценной картины, стоит рассмотреть возможность редактирования строк БД. Для этого используют метод ExecuteUpdate().
Добавление
Возьмём таблицу, созданную ранее и добавим в неё 3 строки:
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();
try (Connection conn = DriverManager.getConnection(url, username, password)){
Statement statement = conn.createStatement();
int rows = statement.executeUpdate(«INSERT Products(ProductName, Price) VALUES (‘iPhone X’, 76000),» +
«(‘Galaxy S9’, 45000), (‘Nokia 9’, 36000)»);
System.out.printf(«Added %d rows», rows);
}
}
catch(Exception ex){
System.out.println(«Connection failed…»);
System.out.println(ex);
}
}
}
Чтобы добавить строку, используется SQL команда insert. После выполнения программы, в таблицу будут занесены три строки с информацией об IPhoneX, Nokia 9 и GalaxyS9.
Удаление и редактирование
Удаление делается следующим образом:
introws = statement.executeUpdate(«DELETEFROMProductsWHEREId = 3»);
Для этого используется SQL команда DELETE. Чтобы изменить информацию в строке, используется команда Update.
Изменим цену у товара на 1000:
int rows = statement.executeUpdate(«UPDATE Products SET Price = Price — 1000»);