Краткое руководство. Использование Java и JDBC с База данных Azure для MySQL
ОБЛАСТЬ ПРИМЕНЕНИЯ: База данных Azure для MySQL — отдельный сервер
База данных Azure для MySQL — отдельный сервер находится на пути выхода на пенсию. Настоятельно рекомендуем выполнить обновление до База данных Azure для MySQL — гибкий сервер. Дополнительные сведения о миграции на База данных Azure для MySQL — гибкий сервер см. в статье о том, что происходит с одним сервером База данных Azure для MySQL?
В этой статье показано создание примера приложения, использующего Java и JDBC для хранения и получения сведений в База данных Azure для MySQL.
JDBC — это стандартный API Java для подключения к классическим реляционным базам данных.
В этой статье мы рассмотрим два метода проверки подлинности: проверку подлинности Microsoft Entra и проверку подлинности MySQL. На вкладке «Без пароля» показана проверка подлинности Microsoft Entra, а на вкладке «Пароль » отображается проверка подлинности MySQL.
Проверка подлинности Microsoft Entra — это механизм подключения к База данных Azure для MySQL с помощью удостоверений, определенных в идентификаторе Microsoft Entra. С помощью проверки подлинности Microsoft Entra можно управлять удостоверениями пользователей базы данных и другими службы Майкрософт в центральном расположении, что упрощает управление разрешениями.
Проверка подлинности MySQL использует учетные записи, хранящиеся в MySQL. Если вы решили использовать пароли в качестве учетных данных для учетных записей, эти учетные данные будут храниться в user таблице. Так как эти пароли хранятся в MySQL, вам потребуется самостоятельно управлять сменой паролей.
Необходимые компоненты
- Учетная запись Azure. Если у вас ее нет, получите бесплатную пробную версию.
- Azure Cloud Shell или Azure CLI Мы рекомендуем использовать Azure Cloud Shell, так вы автоматически войдете в систему и получите доступ ко всем необходимым средствам.
- Поддерживаемый пакет средств разработки Java (JDK) версии 8 (включена в Azure Cloud Shell).
- Средство сборки Apache Maven.
- Клиент командной строки MySQL. Вы можете подключиться к серверу с помощью средства командной строки mysql.exe с помощью Azure Cloud Shell. Кроме того, можно использовать командную mysql строку в локальной среде.
Подготовка среды выполнения
Сначала настройте некоторые переменные среды. В Azure Cloud Shell выполните следующие команды:
- Без пароля (рекомендуется)
- Пароль
export AZ_RESOURCE_GROUP=database-workshop export AZ_DATABASE_SERVER_NAME= export AZ_DATABASE_NAME=demo export AZ_LOCATION= export AZ_MYSQL_AD_NON_ADMIN_USERNAME=demo-non-admin export AZ_LOCAL_IP_ADDRESS= export CURRENT_USERNAME=$(az ad signed-in-user show --query userPrincipalName -o tsv) export CURRENT_USER_OBJECTID=$(az ad signed-in-user show --query id -o tsv)
Замените заполнители следующими значениями, которые используются в этой статье:
- : имя сервера MySQL, который должен быть уникальным в Azure.
- : регион Azure, который вы будете использовать. Вы можете использовать eastus по умолчанию, но мы рекомендуем настроить регион, расположенный близко к месту проживания. Полный список доступных регионов можно просмотреть, введя az account list-locations .
- : IP-адрес локального компьютера, с которого вы запустите приложение. Один из удобных способов найти его — открыть whatismyip.akamai.com.
export AZ_RESOURCE_GROUP=database-workshop export AZ_DATABASE_SERVER_NAME= export AZ_DATABASE_NAME=demo export AZ_LOCATION= export AZ_MYSQL_ADMIN_USERNAME=demo export AZ_MYSQL_ADMIN_PASSWORD= export AZ_MYSQL_NON_ADMIN_USERNAME=demo-non-admin export AZ_MYSQL_NON_ADMIN_PASSWORD= export AZ_LOCAL_IP_ADDRESS=
Замените заполнители следующими значениями, которые используются в этой статье:
- : имя сервера MySQL, который должен быть уникальным в Azure.
- : регион Azure, который вы будете использовать. Вы можете использовать eastus по умолчанию, но мы рекомендуем настроить регион, расположенный близко к месту проживания. Полный список доступных регионов можно получить, введя az account list-locations .
- и : пароль сервера базы данных MySQL. Такой пароль должен содержать не менее восьми символов и включать знаки всех следующих типов: прописные латинские буквы, строчные латинские буквы, цифры (0–9) и небуквенно-цифровые знаки (!, $, #, % и т. д.).
- : IP-адрес локального компьютера, с которого будет запускаться приложение Java. Один из удобных способов найти его — открыть whatismyip.akamai.com.
Чтобы создать группу ресурсов, выполните следующую команду:
az group create \ --name $AZ_RESOURCE_GROUP \ --location $AZ_LOCATION \ --output tsv
Создание экземпляра Базы данных Azure для MySQL
Создание сервера MySQL и настройка пользователя администратора
Первое, что вы создадите, — это управляемый сервер MySQL.
- Без пароля (рекомендуется)
- Пароль
Если вы используете Azure CLI, выполните следующую команду, чтобы убедиться, что у вас достаточно разрешений:
az login --scope https://graph.microsoft.com/.default
Затем выполните следующую команду, чтобы создать сервер:
az mysql server create \ --resource-group $AZ_RESOURCE_GROUP \ --name $AZ_DATABASE_SERVER_NAME \ --location $AZ_LOCATION \ --sku-name B_Gen5_1 \ --storage-size 5120 \ --output tsv
Затем выполните следующую команду, чтобы задать пользователя администратора Microsoft Entra:
az mysql server ad-admin create \ --resource-group $AZ_RESOURCE_GROUP \ --server-name $AZ_DATABASE_SERVER_NAME \ --display-name $CURRENT_USERNAME \ --object-id $CURRENT_USER_OBJECTID
При настройке администратора в Базу данных Azure для сервера MySQL добавляется новый пользователь со всеми разрешениями администратора. На сервере MySQL можно создать только одного администратора Microsoft Entra. Выбор другого пользователя перезаписывает существующего администратора Microsoft Entra, настроенного для сервера.
Эта команда создает небольшой сервер MySQL и задает администратору Active Directory имя пользователя, выполнившего вход.
az mysql server create \ --resource-group $AZ_RESOURCE_GROUP \ --name $AZ_DATABASE_SERVER_NAME \ --location $AZ_LOCATION \ --sku-name B_Gen5_1 \ --storage-size 5120 \ --admin-user $AZ_MYSQL_ADMIN_USERNAME \ --admin-password $AZ_MYSQL_ADMIN_PASSWORD \ --output tsv
Эта команда создает небольшой сервер MySQL.
Настройка правила брандмауэра для сервера MySQL
По умолчанию службы «Базы данных Azure для MySQL» защищены. Эти экземпляры имеют брандмауэр, который не разрешает входящее подключение. Чтобы вы могли использовать нашу базу данных, добавьте правило брандмауэра, которое разрешит локальному IP-адресу обращаться к серверу базы данных.
Так как вы настроили локальный IP-адрес ранее, вы можете открыть брандмауэр сервера, выполнив следующую команду:
az mysql server firewall-rule create \ --resource-group $AZ_RESOURCE_GROUP \ --name $AZ_DATABASE_SERVER_NAME-database-allow-local-ip \ --server $AZ_DATABASE_SERVER_NAME \ --start-ip-address $AZ_LOCAL_IP_ADDRESS \ --end-ip-address $AZ_LOCAL_IP_ADDRESS \ --output tsv
Если вы подключаетесь к серверу MySQL из подсистема Windows для Linux (WSL) на компьютере Windows, необходимо добавить идентификатор узла WSL в брандмауэр.
Получите IP-адрес хост-компьютера, выполнив следующую команду в WSL:
cat /etc/resolv.conf
Скопируйте IP-адрес после термина nameserver , а затем используйте следующую команду, чтобы задать переменную среды для IP-адреса WSL:
AZ_WSL_IP_ADDRESS=
Затем используйте следующую команду, чтобы открыть брандмауэр сервера в приложении на основе WSL:
az mysql server firewall-rule create \ --resource-group $AZ_RESOURCE_GROUP \ --name $AZ_DATABASE_SERVER_NAME-database-allow-local-ip-wsl \ --server $AZ_DATABASE_SERVER_NAME \ --start-ip-address $AZ_WSL_IP_ADDRESS \ --end-ip-address $AZ_WSL_IP_ADDRESS \ --output tsv
Настройка базы данных MySQL
Созданный вами ранее сервер MySQL пуст. Чтобы создать новую базу данных, используйте следующую команду.
az mysql db create \ --resource-group $AZ_RESOURCE_GROUP \ --name $AZ_DATABASE_NAME \ --server-name $AZ_DATABASE_SERVER_NAME \ --output tsv
Создание пользователя, отличного от администратора MySQL, и предоставление разрешений
Затем создайте пользователя без администратора и предоставьте всем разрешения для базы данных.
Дополнительные сведения о создании пользователей MySQL см. в статье «Создание пользователей» в База данных Azure для MySQL.
- Без пароля (рекомендуется)
- Пароль
Создайте скрипт SQL с именем create_ad_user.sql для создания пользователя без администратора. Добавьте следующее содержимое и сохраните его локально:
export AZ_MYSQL_AD_NON_ADMIN_USERID=$CURRENT_USER_OBJECTID cat create_ad_user.sql SET aad_auth_validate_oids_in_tenant = OFF; CREATE AADUSER '$AZ_MYSQL_AD_NON_ADMIN_USERNAME' IDENTIFIED BY '$AZ_MYSQL_AD_NON_ADMIN_USERID'; GRANT ALL PRIVILEGES ON $AZ_DATABASE_NAME.* TO '$AZ_MYSQL_AD_NON_ADMIN_USERNAME'@'%'; FLUSH privileges; EOF
Затем выполните следующую команду, чтобы запустить скрипт SQL для создания пользователя, отличного от администратора Microsoft Entra:
mysql -h $AZ_DATABASE_SERVER_NAME.mysql.database.azure.com --user $CURRENT_USERNAME@$AZ_DATABASE_SERVER_NAME --enable-cleartext-plugin --password=$(az account get-access-token --resource-type oss-rdbms --output tsv --query accessToken) < create_ad_user.sql
Теперь используйте следующую команду, чтобы удалить временный файл скрипта SQL:
rm create_ad_user.sql
Создайте скрипт SQL с именем create_user.sql для создания пользователя без администратора. Добавьте следующее содержимое и сохраните его локально:
cat create_user.sql CREATE USER '$AZ_MYSQL_NON_ADMIN_USERNAME'@'%' IDENTIFIED BY '$AZ_MYSQL_NON_ADMIN_PASSWORD'; GRANT ALL PRIVILEGES ON $AZ_DATABASE_NAME.* TO '$AZ_MYSQL_NON_ADMIN_USERNAME'@'%'; FLUSH PRIVILEGES; EOF
Затем выполните следующую команду, чтобы запустить скрипт SQL для создания пользователя, отличного от администратора Microsoft Entra:
mysql -h $AZ_DATABASE_SERVER_NAME.mysql.database.azure.com --user $AZ_MYSQL_ADMIN_USERNAME@$AZ_DATABASE_SERVER_NAME --enable-cleartext-plugin --password=$AZ_MYSQL_ADMIN_PASSWORD < create_user.sql
Теперь используйте следующую команду, чтобы удалить временный файл скрипта SQL:
rm create_user.sql
Создание нового проекта Java
Используя любимую интегрированную среду разработки, создайте проект Java с помощью Java 8 или более поздней версии. Создайте файл pom.xml в корневом каталоге и добавьте следующее содержимое:
- Без пароля (рекомендуется)
- Пароль
4.0.0 com.example demo 0.0.1-SNAPSHOT demo 1.8 1.8 1.8 mysql mysql-connector-java 8.0.30 com.azure azure-identity-extensions 1.0.0
4.0.0 com.example demo 0.0.1-SNAPSHOT demo 1.8 1.8 1.8 mysql mysql-connector-java 8.0.30
Этот файл — это файл Apache Maven , который настраивает проект для использования Java 8 и недавнего драйвера MySQL для Java.
Подготовка файла конфигурации для подключения к Базе данных Azure для MySQL
Выполните следующий скрипт в корневом каталоге проекта, чтобы создать файл src/main/resources/database.properties и добавить сведения о конфигурации:
- Без пароля (рекомендуется)
- Пароль
mkdir -p src/main/resources && touch src/main/resources/database.properties cat src/main/resources/database.properties url=jdbc:mysql://$.mysql.database.azure.com:3306/$?sslMode=REQUIRED&serverTimezone=UTC&defaultAuthenticationPlugin=com.azure.identity.extensions.jdbc.mysql.AzureMysqlAuthenticationPlugin&authenticationPlugins=com.azure.identity.extensions.jdbc.mysql.AzureMysqlAuthenticationPlugin user=$@$ EOF
Если вы используете класс Mysql Подключение ionPoolDataSource в качестве источника данных в приложении, удалите значение defaultAuthenticationPlugin=com.azure.identity.extensions.jdbc.mysql.AzureMysqlAuthenticationPlugin» в URL-адресе.
mkdir -p src/main/resources && touch src/main/resources/database.properties cat src/main/resources/database.properties url=jdbc:mysql://$.mysql.database.azure.com:3306/$?sslMode=REQUIRED&serverTimezone=UTC&authenticationPlugins=com.azure.identity.extensions.jdbc.mysql.AzureMysqlAuthenticationPlugin user=$@$ EOF
mkdir -p src/main/resources && touch src/main/resources/database.properties cat src/main/resources/database.properties url=jdbc:mysql://$.mysql.database.azure.com:3306/$?useSSL=true&sslMode=REQUIRED&serverTimezone=UTC user=$@$ password=$ EOF
Свойство url конфигурации добавлено ?serverTimezone=UTC , чтобы сообщить драйверу JDBC использовать формат даты UTC (или универсальное время координированного времени) при подключении к базе данных. В противном случае сервер Java не будет использовать тот же формат даты, что и база данных, что приведет к ошибке.
Создание файла SQL для генерации схемы базы данных
Затем вы будете использовать src/main/resources/schema.sql-файл для создания схемы базы данных. Создайте этот файл, а затем добавьте следующее содержимое:
touch src/main/resources/schema.sql cat src/main/resources/schema.sql DROP TABLE IF EXISTS todo; CREATE TABLE todo (id SERIAL PRIMARY KEY, description VARCHAR(255), details VARCHAR(4096), done BOOLEAN); EOF
Добавление кода приложения
Подключение к базе данных
Затем добавьте код Java, который будет использовать JDBC для сохранения и извлечения данных на сервере MySQL.
Создайте файл src/main/java/DemoApplication.java и добавьте следующее содержимое:
package com.example.demo; import com.mysql.cj.jdbc.AbandonedConnectionCleanupThread; import java.sql.*; import java.util.*; import java.util.logging.Logger; public class DemoApplication < private static final Logger log; static < System.setProperty("java.util.logging.SimpleFormatter.format", "[%4$-7s] %5$s %n"); log =Logger.getLogger(DemoApplication.class.getName()); >public static void main(String[] args) throws Exception < log.info("Loading application properties"); Properties properties = new Properties(); properties.load(DemoApplication.class.getClassLoader().getResourceAsStream("database.properties")); log.info("Connecting to the database"); Connection connection = DriverManager.getConnection(properties.getProperty("url"), properties); log.info("Database connection test: " + connection.getCatalog()); log.info("Create database schema"); Scanner scanner = new Scanner(DemoApplication.class.getClassLoader().getResourceAsStream("schema.sql")); Statement statement = connection.createStatement(); while (scanner.hasNextLine()) < statement.execute(scanner.nextLine()); >/* Prepare to store and retrieve data from the MySQL server. Todo todo = new Todo(1L, "configuration", "congratulations, you have set up JDBC correctly!", true); insertData(todo, connection); todo = readData(connection); todo.setDetails("congratulations, you have updated data!"); updateData(todo, connection); deleteData(todo, connection); */ log.info("Closing database connection"); connection.close(); AbandonedConnectionCleanupThread.uncheckedShutdown(); > >
Этот код Java будет использовать database.properties и файлы schema.sql , созданные ранее. После подключения к серверу MySQL можно создать схему для хранения данных.
В этом файле можно увидеть, что мы закомментировали методы вставки, чтения, обновления и удаления данных. Эти методы будут реализованы в остальной части этой статьи, и вы сможете раскомментировать их друг за другом.
Учетные данные базы данных хранятся в свойствах пользователя и пароля файла database.properties . Эти учетные данные используются при выполнении DriverManager.getConnection(properties.getProperty("url"), properties); , так как файл свойств передается в качестве аргумента.
Строка AbandonedConnectionCleanupThread.uncheckedShutdown(); в конце — это команда драйвера MySQL, чтобы уничтожить внутренний поток при завершении работы приложения. Эту строку можно безопасно игнорировать.
Теперь вы можете выполнить класс main в любом удобном инструменте.
- В любой среде IDE щелкните правой кнопкой мыши класс DemoApplication и выполните его.
- С помощью Maven можно запустить приложение с помощью следующей команды: mvn exec:java -Dexec.mainClass="com.example.demo.DemoApplication"
Приложение должно подключиться к База данных Azure для MySQL, создать схему базы данных и закрыть подключение. Вы должны увидеть выходные данные, аналогичные следующему примеру, в журналах консоли:
[INFO ] Loading application properties [INFO ] Connecting to the database [INFO ] Database connection test: demo [INFO ] Create database schema [INFO ] Closing database connection
Создание доменного класса
Создайте новый класс Java Todo рядом с классом DemoApplication и добавьте следующий код:
package com.example.demo; public class Todo < private Long id; private String description; private String details; private boolean done; public Todo() < >public Todo(Long id, String description, String details, boolean done) < this.id = id; this.description = description; this.details = details; this.done = done; >public Long getId() < return id; >public void setId(Long id) < this.id = id; >public String getDescription() < return description; >public void setDescription(String description) < this.description = description; >public String getDetails() < return details; >public void setDetails(String details) < this.details = details; >public boolean isDone() < return done; >public void setDone(boolean done) < this.done = done; >@Override public String toString() < return "Todo'; > >
Этот класс является доменной моделью, сопоставленной с таблицей todo , которую вы создали при выполнении скрипта schema.sql.
Вставка данных в Базу данных Azure для MySQL
В файле src/main/java/demoapplication.java добавьте после метода main следующий метод, который вставляет данные в базу данных.
private static void insertData(Todo todo, Connection connection) throws SQLException
Теперь можно раскомментировать две следующие строки в методе main .
Todo todo = new Todo(1L, "configuration", "congratulations, you have set up JDBC correctly!", true); insertData(todo, connection);
Теперь при запуске класса main вы увидите следующие выходные данные.
[INFO ] Loading application properties [INFO ] Connecting to the database [INFO ] Database connection test: demo [INFO ] Create database schema [INFO ] Insert data [INFO ] Closing database connection
Считывание данных из Базы данных Azure для MySQL
Затем прочтите ранее вставленные данные, чтобы убедиться, что код работает правильно.
В файле src/main/java/demoapplication.java добавьте после метода insertData следующий метод, который считывает данные из базы данных.
private static Todo readData(Connection connection) throws SQLException < log.info("Read data"); PreparedStatement readStatement = connection.prepareStatement("SELECT * FROM todo;"); ResultSet resultSet = readStatement.executeQuery(); if (!resultSet.next()) < log.info("There is no data in the database!"); return null; >Todo todo = new Todo(); todo.setId(resultSet.getLong("id")); todo.setDescription(resultSet.getString("description")); todo.setDetails(resultSet.getString("details")); todo.setDone(resultSet.getBoolean("done")); log.info("Data read from the database: " + todo.toString()); return todo; >
Теперь можно раскомментировать следующую строку в методе main .
todo = readData(connection);
Теперь при запуске класса main вы увидите следующие выходные данные.
[INFO ] Loading application properties [INFO ] Connecting to the database [INFO ] Database connection test: demo [INFO ] Create database schema [INFO ] Insert data [INFO ] Read data [INFO ] Data read from the database: Todo [INFO ] Closing database connection
Обновление данных в Базе данных Azure для MySQL
Затем обновите ранее вставленные данные.
В том же файле src/main/java/demoapplication.java добавьте после метода readData следующий метод, который обновляет данные в базе данных.
private static void updateData(Todo todo, Connection connection) throws SQLException
Теперь можно раскомментировать две следующие строки в методе main .
todo.setDetails("congratulations, you have updated data!"); updateData(todo, connection);
Теперь при запуске класса main вы увидите следующие выходные данные.
[INFO ] Loading application properties [INFO ] Connecting to the database [INFO ] Database connection test: demo [INFO ] Create database schema [INFO ] Insert data [INFO ] Read data [INFO ] Data read from the database: Todo [INFO ] Update data [INFO ] Read data [INFO ] Data read from the database: Todo [INFO ] Closing database connection
Удаление данных в Базе данных Azure для MySQL
Наконец, удалите ранее вставленные данные.
В том же файле src/main/java/demoapplication.java добавьте после метода updateData следующий метод, который удаляет данные из базы данных.
private static void deleteData(Todo todo, Connection connection) throws SQLException
Теперь можно раскомментировать следующую строку в методе main .
deleteData(todo, connection);
Теперь при запуске класса main вы увидите следующие выходные данные.
[INFO ] Loading application properties [INFO ] Connecting to the database [INFO ] Database connection test: demo [INFO ] Create database schema [INFO ] Insert data [INFO ] Read data [INFO ] Data read from the database: Todo [INFO ] Update data [INFO ] Read data [INFO ] Data read from the database: Todo [INFO ] Delete data [INFO ] Read data [INFO ] There is no data in the database! [INFO ] Closing database connection
Очистка ресурсов
Поздравляем! Вы создали приложение Java, которое использует JDBC для сохранения данных в Базе данных Azure для MySQL и их извлечения из нее.
Чтобы очистить все ресурсы, используемые во время этого краткого руководства, удалите группу ресурсов с помощью следующей команды:
az group delete \ --name $AZ_RESOURCE_GROUP \ --yes
Как использовать базу данных MySQL в Java
В этой статье мы научимся подключаться к базе данных MySQL из Java-кода и выполнять простые запросы для получения и обновления данных. Для того, чтобы получить доступ к базе данных, мы будем использовать JDBC (Java Database Connectivity) API, который входит в стандартную библиотеку Java. JDBC позволяет подключиться к любой базе данных: Postgres, MySQL, SQL Server, Oracle и т. д. — при наличии соответствующей реализации драйвера, необходимого для подключения. Для базы данных MySQL мы будем использовать драйвер Type 4 JDBC из пакета mysql-connector-java-5.1.23-bin.jar . Он написан на чистой Java, а значит, нам не понадобятся какие-либо нативные библиотеки или ODBC-мост. Все, что нам надо будет сделать — это положить JAR-файл в директорию, содержащуюся в CLASSPATH. JAR-файл содержит класс com.mysql.jdbc.Driver , необходимый для подключения к MySQL. Если его не окажется в CLASSPATH, во время выполнения программы выбросится исключение java.lang.ClassNotFoundException , поэтому убедитесь, что вы правильно настроили пути.
Кстати, если вы ищете хорошую книгу по использованию JDBC, обратите внимание на Practical Database Programming with Java (Ying Bai). Это относительно новая книга, и в ней рассматриваются две самые популярные базы данных: Oracle и SQL Server 2008. В книге используется IDE NetBeans для примеров и описываются все инструменты, необходимые для работы с базами данных в Java. Это отличная книга для начинающих и опытных программистов.
Подключаем базу данных MySQL с помощью JDBC
Для того, чтобы подключить базу данных MySQL, нам потребуется четыре вещи:
- Строка подключения JDBC (например:
jdbc:mysql://localhost:3306/test). - Имя пользователя (root).
- Пароль (root).
- База данных с некоторым количеством таблиц для примера (например, база данных книг).
Строка подключения для MySQL начинается с jdbc:mysql . Это название протокола соединения, за которым следуют хост и порт подключения, на которых запущена база данных. В нашем случае это localhost с портом по умолчанию 3306 (если вы его не поменяли при установке). Следующая часть — test — имя базы данных, которая уже существует в MySQL. Мы можем создать таблицу Books :
CREATE TABLE `books` ( `id` int(11) NOT NULL, `name` varchar(50) NOT NULL, `author` varchar(50) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1
и наполнить её хорошими книгами:
INSERT INTO test.books (id, `name`, author) VALUES (1, 'Effective Java', 'Joshua Bloch'); INSERT INTO test.books (id, `name`, author) VALUES (2, 'Java Concurrency in Practice', 'Brian Goetz');
Программа на Java, которая использует базу данных
Теперь давайте напишем программу на Java, которая будет подключаться к нашей базе данных, запущенной на localhost . Важно помнить о том, что необходимо закрывать соединение, запросы и результат выполнения после завершения работы с ними. Также важно закрывать их в finally-блоке, со своей try/catch оберткой, поскольку сам метод close() может кинуть исключение, что приведет к утечке ресурсов. За подробной информацией вы можете обратиться к этой статье. Кроме того, вы можете использовать обертку try-with-resource, которая появилась в Java 7. Более того, это стандартный способ работы с ресурсами в Java 1.7.
import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; /** * Simple Java program to connect to MySQL database running on localhost and * running SELECT and INSERT query to retrieve and add data. * @author Javin Paul */ public class JavaToMySQL < // JDBC URL, username and password of MySQL server private static final String url = "jdbc:mysql://localhost:3306/test"; private static final String user = "root"; private static final String password = "root"; // JDBC variables for opening and managing connection private static Connection con; private static Statement stmt; private static ResultSet rs; public static void main(String args[]) < String query = "select count(*) from books"; try < // opening database connection to MySQL server con = DriverManager.getConnection(url, user, password); // getting Statement object to execute query stmt = con.createStatement(); // executing SELECT query rs = stmt.executeQuery(query); while (rs.next()) < int count = rs.getInt(1); System.out.println("Total number of books in the table : " + count); >> catch (SQLException sqlEx) < sqlEx.printStackTrace(); >finally < //close connection ,stmt and resultset here try < con.close(); >catch(SQLException se) < /*can't do anything */ >try < stmt.close(); >catch(SQLException se) < /*can't do anything */ >try < rs.close(); >catch(SQLException se) < /*can't do anything */ >> > >
При первом запуске у вас, возможно, будет ошибка No suitable driver found for jdbc:mysql , если драйвера MySQL нет в CLASSPATH:
java.sql.SQLException: No suitable driver found for jdbc:mysql://localhost:3306/test/book at java.sql.DriverManager.getConnection(DriverManager.java:689) at java.sql.DriverManager.getConnection(DriverManager.java:247) at JavaToMySQL.main(JavaToMySQL.java:29) Exception in thread "main" java.lang.NullPointerException at JavaToMySQL.main(JavaToMySQL.java:46) Java Result: 1
Добавим нужный JAR-файл в путь и снова запустим программу. Другая частая ошибка — указать таблицу в строке соединения: jdbc:mysql://localhost:3306/test/book . В этом случае вылетит следущее исключение:
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown database 'test/book' at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance (NativeConstructorAccessorImpl.java:62) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance (DelegatingConstructorAccessorImpl.java:45) at java.lang.reflect.Constructor.newInstance(Constructor.java:408) at com.mysql.jdbc.Util.handleNewInstance(Util.java:411) at com.mysql.jdbc.Util.getInstance(Util.java:386) at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1053)
Успешный запуск программы выведет на экран следующее:
Total number of books in the table: 2
Результат верный, поскольку у нас в таблице только две книги: «Effective Java» и «Java Concurrency in Practice».
Кстати, если у вас был драйвер при компиляции, но отсутствует при запуске, вы получите исключение java.lang.ClassNotFoundException: com.mysql.jdbc.Driver . О том, как исправить эту ошибку, вы можете прочитать здесь.
Получаем данные с помощью SELECT-запроса в JDBC
Для получения данных из БД вы можете выполнить SELECT-запрос. В первом примере мы уже его использовали, но получили только количество строк. Теперь мы вернем сами строки. Большая часть программы останется без изменений, за исключением SQL-запроса и кода, возвращающего данные из объекта ResultSet :
String query = "select id, name, author from books"; rs = stmt.executeQuery(query); while (rs.next())
Этот код выведет на экран следующее:
id: 1, name: Effective Java, author: Joshua Bloch id: 2, name: Java Concurrency in Practice, author: Brian Goetz
Тут есть пара моментов, на которые следует обратить внимание. Метод rs.getInt(1) используется для получения столбца с целочисленным типом, в нашем случае это столбец «id». Индексы в JDBC начинаются с единицы, поэтому rs.getInt(1) вернет значение первого столбца как целое число. В случае, если вы укажете неверный индекс (многие разработчики вызывают rs.getInt(0) для получения первого столбца), выбросится исключение InvalidColumnIndexException . Доступ к столбцам по индексу чреват ошибками, поэтому лучше использовать имя столбца, например, rs.getInt("id") . Подробнее об этом вы можете прочитать в этой статье. Метод getString() используется для получения строковых значений из базы (например, VARCHAR ). Цикл будет выполняться, пока rs.next() не вернет false . Это значит, что строки закончились. В нашем случае в таблице две строки, поэтому цикл выполнится два раза, выводя информацию о книгах из таблицы на экран.
Добавляем данные с помощью INSERT-запроса в JDBC
Добавление данных мало отличается от их получения: мы просто используем INSERT-запрос вместо SELECT-запроса и метод executeUpdate() вместо executeQuery() . Этот метод используется для запросов INSERT, UPDATE и DELETE, а также для SQL DDL выражений, таких как CREATE, ALTER или DROP. Эти команды не возвращают результата, поэтому мы убираем все упоминания ResultSet ‘а в коде и изменяем запрос соответственно:
String query = "INSERT INTO test.books (id, name, author) \n" + " VALUES (3, 'Head First Java', 'Kathy Sieara');"; // executing SELECT query stmt.executeUpdate(query);
После запуска программы вы можете проверить таблицу в СУБД. На этот раз вы увидите три записи в таблице:
Теперь вы умеете подключаться к MySQL из Java-приложения и выполнять SELECT, INSERT, DELETE и UPDATE-запросы так же, как и в MySQL GUI. Для подключения мы используем объект Connection , для чтения результатов запроса — ResultSet . Убедитесь перед подключением, что сервер MySQL запущен и mysql-connector-java-5.1.17-bin.jar находится в CLASSPATH, чтобы избежать ClassNotFoundException .
Когда разберетесь с подключением и простыми запросами, имеет смысл изучить, как использовать подготавливаемые запросы (Prepared Statement) в Java для избежания SQL-инъекции. В боевом коде всегда следует использовать подготавливаемые запросы и связывание переменных.
Если вам понравилось это руководство и не терпится узнать больше о подключении и работе с базой данных из Java-программ, обратите внимание на следующие статьи:
- Как подключиться к БД Oracle из Java-приложения;
- Отличия межу Connected RowSet и Disconnected RowSet в Java;
- Как использовать пул соединений в Spring;
- 5 способов улучшить производительность БД в приложениях на Java;
- Отличия между java.util.Date и java.sql.Date в Java;
- Как выполнить INSERT или UPDATE, используя пакетные запросы JDBC;
- Десять вопросов по JDBC на собеседованиях.
Полезные ссылки
- Если у вас нет базы данных MySQL, вы можете ее скачать здесь;
- Есди у вас нет драйвера MySQL для JDBC, вы можете скачать его отсюда;
- Рекомендованную книгу «Practical Database Programming with Java» можно купить на Amazon.
Перевод статьи «How to Connect to MySQL database in Java with Example»
Как подключиться к MySQL с помощью Java
Узнайте, как подключиться к базе данных MySQL с использованием Java и JDBC, выполнять SQL-запросы и обрабатывать результаты в этой практической статье!
Алексей Кодов
Автор статьи
9 июня 2023 в 16:31
В этой статье мы рассмотрим процесс подключения к базе данных MySQL с использованием Java и JDBC (Java Database Connectivity). JDBC — это API, предоставляющее возможность выполнять SQL-запросы и обрабатывать результаты с помощью Java.
Шаг 1: Установка и настройка MySQL
Для начала убедитесь, что у вас установлен MySQL Server на вашем компьютере или доступен удаленный сервер с MySQL. Если нет, то установите его, следуя инструкциям на официальном сайте: MySQL Server.
Шаг 2: Добавление JDBC драйвера
Для подключения к MySQL с помощью Java нам потребуется JDBC драйвер. Вы можете скачать его с официального сайта: MySQL Connector/J.
После скачивания jar-файла добавьте его в ваш проект. В зависимости от используемой среды разработки процесс может немного отличаться. Например, в IntelliJ IDEA следует выполнить следующие действия:
- Откройте свойства проекта (File → Project Structure).
- Выберите вкладку «Libraries».
- Нажмите на «+» и выберите «Java».
- Укажите путь к скачанному jar-файлу и нажмите «OK».
Java-разработчик: новая работа через 11 месяцев
Получится, даже если у вас нет опыта в IT

Шаг 3: Создание подключения к базе данных
Теперь мы можем написать код, который будет подключаться к базе данных MySQL. Вот пример:
import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; public class Main < public static void main(String[] args) < String url = "jdbc:mysql://localhost:3306/my_database?useSSL=false&serverTimezone=UTC"; String user = "my_user"; String password = "my_password"; try < Connection connection = DriverManager.getConnection(url, user, password); System.out.println("Подключение к базе данных успешно установлено!"); connection.close(); >catch (SQLException e) < System.out.println("Ошибка при подключении к базе данных:"); e.printStackTrace(); >> >
В этом примере мы используем класс DriverManager для получения соединения с базой данных. Важно указать правильный URL, имя пользователя и пароль для вашей базы данных.
Обратите внимание на параметры useSSL=false и serverTimezone=UTC в URL. Эти параметры отключают использование SSL и устанавливают временную зону сервера соответственно. Вы можете изменить их в соответствии с конфигурацией вашего сервера.
Шаг 4: Выполнение SQL-запросов
После подключения к базе данных вы можете выполнять SQL-запросы, используя Java и JDBC. Вот пример выполнения SELECT-запроса:
import java.sql.*; public class Main < public static void main(String[] args) < String url = "jdbc:mysql://localhost:3306/my_database?useSSL=false&serverTimezone=UTC"; String user = "my_user"; String password = "my_password"; try < Connection connection = DriverManager.getConnection(url, user, password); Statement statement = connection.createStatement(); ResultSet resultSet = statement.executeQuery("SELECT * FROM my_table"); while (resultSet.next()) < System.out.println(resultSet.getString("column_name")); >resultSet.close(); statement.close(); connection.close(); > catch (SQLException e) < System.out.println("Ошибка при выполнении SQL-запроса:"); e.printStackTrace(); >> >
В этом примере мы создаем Statement и выполняем SQL-запрос с помощью метода executeQuery . Результаты запроса хранятся в объекте ResultSet , который мы обрабатываем с помощью цикла while .
Не забывайте закрывать соединение, Statement и ResultSet после использования!
Теперь вы знаете, как подключиться к базе данных MySQL с помощью Java и JDBC, и выполнять SQL-запросы. Удачи вам в изучении Java-разработки!
И если вам нужна дополнительная помощь или обучение, рекомендуем посетить нашу онлайн-школу:
Подключение к MySQL базе данных с помощью Java
Проблема подключения к базе данных MySQL в Java является типичной для начинающих разработчиков. При попытке подключения к базе данных часто возникают ошибки, связанные с отсутствием подходящего драйвера.
java.sql.SQLException: No suitable driver found for jdbc:mysql://database/table
Другая распространенная ошибка связана с ненахождением класса драйвера:
java.lang.ClassNotFoundException: com.mysql.jdbc.Driver
java.lang.ClassNotFoundException: com.mysql.cj.jdbc.Driver
Эти ошибки обычно возникают, когда в проекте отсутствует необходимый JDBC драйвер, либо он не был правильно подключен.
Решение проблемы
Для подключения к базе данных MySQL с помощью Java необходимо выполнить несколько шагов.
- Сначала нужно установить MySQL JDBC драйвер. Он доступен на официальном сайте MySQL. После загрузки файла нужно добавить его в проект.
- Затем необходимо загрузить драйвер с помощью следующего кода:
Class.forName("com.mysql.cj.jdbc.Driver");
Если этот шаг выполнен успешно, значит, драйвер был правильно установлен.
- После загрузки драйвера можно подключиться к базе данных. Для этого используется следующий код:
Connection con = DriverManager.getConnection( "jdbc:mysql://hostname:port/dbname","username", "password");
В этом коде hostname — это имя хоста, на котором размещена база данных, port — порт, dbname — имя базы данных, username и password — имя пользователя и пароль соответственно.
Если все шаги выполнены правильно, то подключение к базе данных будет установлено. В противном случае будет выброшено исключение, описывающее проблему.
