Вопрос-ответ

Connect Java to a MySQL database

Подключение Java к базе данных MySQL

Как подключиться к базе данных MySQL на Java?

Когда я пытаюсь, я получаю

java.sql.SQLException: No suitable driver found for jdbc:mysql://database/table
at java.sql.DriverManager.getConnection(DriverManager.java:689)
at java.sql.DriverManager.getConnection(DriverManager.java:247)

Или

java.lang.ClassNotFoundException: com.mysql.jdbc.Driver

Или

java.lang.ClassNotFoundException: com.mysql.cj.jdbc.Driver
Переведено автоматически
Ответ 1

Вот пошаговое объяснение, как установить MySQL и JDBC и как их использовать:


  1. Загрузите и установите сервер MySQL. Просто сделайте это обычным способом. Запоминайте номер порта всякий раз, когда вы его меняли. Это по умолчанию 3306.



  2. Загрузите драйвер JDBC и введите classpath, извлеките ZIP-файл и поместите содержащий JAR-файл в classpath. Драйвер JDBC для конкретного поставщика представляет собой конкретную реализацию JDBC API (учебное пособие здесь).


    Если вы используете IDE, такую как Eclipse или Netbeans, вы можете добавить ее в classpath, добавив файл JAR в качестве библиотеки в путь сборки в свойствах проекта.


    Если вы делаете это "обычным способом" в командной консоли, то вам нужно указать путь к файлу JAR в аргументе -cp или -classpath при выполнении вашего Java-приложения.


    java -cp .;/path/to/mysql-connector.jar com.пример.YourClass

    . Используется только для добавления текущего каталога в путь к классам, чтобы его можно было найти, а com.example.YourClass ; является разделителем путей к классам, как и в Windows. В Unix следует использовать и клоны :.


    Если вы разрабатываете WAR-приложение на основе сервлетов и хотите вручную управлять подключениями (плохая практика, на самом деле), то вам нужно убедиться, что JAR заканчивается в /WEB-INF/lib части сборки. Смотрите также Как добавить библиотеки JAR в проект WAR, не сталкиваясь с java.lang.ClassNotFoundException? Путь к классам против пути сборки против /WEB-INF /lib. Лучше всего установить JAR-файл физического драйвера JDBC на самом сервере и настроить сервер для создания пула подключений JDBC. Вот пример для Tomcat: Как я должен подключиться к базе данных / источнику данных JDBC в приложении на основе сервлетов?



  3. Создайте базу данных в MySQL. Давайте создадим базу данных javabase. Вы, конечно, хотите мирового господства, поэтому давайте также использовать UTF-8.


     CREATE DATABASE javabase DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;


  4. Создайте пользователя для Java и предоставьте ему доступ. Просто потому, что использование root - плохая практика.


     CREATE USER 'java'@'localhost' IDENTIFIED BY 'password';
    GRANT ALL ON javabase.* TO 'java'@'localhost' IDENTIFIED BY 'password';

    Да, здесь java имя пользователя и password пароль.



  5. Определите URL-адрес JDBC. Для подключения базы данных MySQL с использованием Java вам нужен URL-адрес JDBC в следующем синтаксисе:


    jdbc: mysql://имя хоста: порт/databasename


    • hostname: Имя хоста, на котором установлен сервер MySQL. Если он установлен на том же компьютере, где вы запускаете Java-код, тогда вы можете просто использовать localhost. Это также может быть IP-адрес типа 127.0.0.1. Если вы столкнулись с проблемами подключения и использование 127.0.0.1 вместо localhost решило это, значит, у вас проблема в конфигурации сети / DNS / hosts.



    • port: Порт TCP / IP, через который прослушивается сервер MySQL. Это по умолчанию 3306.



    • databasename: Имя базы данных, к которой вы хотели бы подключиться. Это javabase.




    Итак, окончательный URL-адрес должен выглядеть следующим образом:


    jdbc: mysql://localhost: 3306/javabase


  6. Протестируйте соединение с MySQL с помощью Java. Создайте простой класс Java с main() методом для проверки соединения.


     String url = "jdbc:mysql://localhost:3306/javabase";
    String username = "java";
    String password = "password";

    System.out.println("Connecting database ...");

    try (Connection connection = DriverManager.getConnection(url, username, password)) {
    System.out.println("Database connected!");
    } catch (SQLException e) {
    throw new IllegalStateException("Cannot connect the database!", e);
    }

    Если вы получаете SQLException: No suitable driver , то это означает, что либо драйвер JDBC вообще не был загружен автоматически, либо что URL JDBC неверен (т. Е. Он не был распознан ни одним из загруженных драйверов). Смотрите также печально известное исключение java.sql.SQLException: подходящий драйвер не найден. Обычно драйвер JDBC 4.0 должен загружаться автоматически, когда вы просто добавляете его в runtime classpath . Чтобы исключить одно и другое, вы всегда можете загрузить его вручную, как показано ниже:


     System.out.println("Loading driver ...");

    try {
    Class.forName("com.mysql.cj.jdbc.Driver"); // Use com.mysql.jdbc.Driver if you're not on MySQL 8+ yet.
    System.out.println("Driver loaded!");
    } catch (ClassNotFoundException e) {
    throw new IllegalStateException("Cannot find the driver in the classpath!", e);
    }

    Обратите внимание, что newInstance() вызов здесь не нужен. В случае MySQL это просто для исправления старого и глючного org.gjt.mm.mysql.Driver. Объяснение здесь. Если эта строка выдает ошибку ClassNotFoundException, то файл JAR, содержащий класс драйвера JDBC, просто не был помещен в classpath. Пожалуйста, также обратите внимание, что очень важно генерировать исключение, чтобы выполнение кода было немедленно заблокировано, вместо того, чтобы подавлять его простым выводом трассировки стека и последующим продолжением остальной части кода.


    Также обратите внимание, что вам не нужно каждый раз перед подключением загружать драйвер. Достаточно всего лишь одного раза при запуске приложения.


    Если вы получаете SQLException: Connection refused или Connection timed out или специфичный для MySQL CommunicationsException: Communications link failure, то это означает, что база данных вообще недоступна. Это может быть вызвано одной или несколькими из следующих причин:



    1. IP-адрес или имя хоста в URL JDBC неверны.

    2. Имя хоста в URL-адресе JDBC не распознается локальным DNS-сервером.

    3. В URL-адресе JDBC отсутствует или указан неверный номер порта.

    4. Сервер базы данных не работает.

    5. Сервер БД не принимает соединения TCP / IP.

    6. У сервера БД закончились подключения.

    7. Что-то среднее между Java и DB блокирует соединения, например брандмауэр или прокси.



    Чтобы решить ту или иную проблему, следуйте следующим советам:



    1. Проверьте и протестируйте их с помощью ping.

    2. Обновите DNS или используйте вместо этого IP-адрес в URL JDBC.

    3. Проверьте это на основе my.cnf базы данных MySQL.

    4. Запустите базу данных.

    5. Проверьте, запущен ли mysqld без --skip-networking option.

    6. Перезапустите базу данных и исправьте свой код таким образом, чтобы он закрывал соединения в finally.

    7. Отключите брандмауэр и / или настройте брандмауэр / прокси для разрешения / переадресации порта.



    Обратите внимание, что закрытие Connection является чрезвычайно важным. Если вы не закрываете соединения и продолжаете получать их большое количество за короткое время, то в базе данных могут закончиться соединения, и ваше приложение может выйти из строя. Всегда приобретайте Connection в try-with-resources инструкции. Это также относится к Statement, PreparedStatement и ResultSet. Смотрите также Как часто следует закрывать Connection, Statement и ResultSet в JDBC?



Что касается подключения, то на этом все. Вы можете найти здесь более подробное руководство по загрузке и хранению полноценных объектов Java model в базе данных с помощью базового класса DAO.


Использование одноэлементного шаблона и / или static переменной для базы данных Connection является плохой практикой. Смотрите, среди прочего, Безопасно ли использовать статический экземпляр java.sql.Connection в многопоточной системе? Это ошибка № 1 для начинающих. Убедитесь, что вы не попадетесь в эту ловушку.

Ответ 2

DataSource

DriverManager это довольно старый способ ведения дел. Лучший способ - получить DataSource объект. Либо с помощью JNDI для поиска того, что контейнер вашего сервера приложений уже настроен для вас:

Context context = new InitialContext();
DataSource dataSource = (DataSource) context.lookup("java:comp/env/jdbc/myDB");

... или создав экземпляр и настроив его непосредственно из вашего драйвера базы данных, например, com.mysql.cj.jdbc.MysqlDataSource (см. Документацию):

MysqlDataSource dataSource = new MysqlDataSource();
dataSource.setUser("scott");
dataSource.setPassword("tiger");
dataSource.setServerName("myDBHost.example.org");

... а затем получите от нее подключения, такие же, как указано выше:

Connection conn = dataSource.getConnection();
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT ID FROM USERS");

rs.close();
stmt.close();
conn.close();

В современной Java используйте синтаксис try-with-resources для автоматического закрытия ресурсов JDBC (сейчас AutoCloseable).

try (
Connection conn = dataSource.getConnection();
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT ID FROM USERS");
) {

}
Ответ 3

Инициализация констант базы данных

Создайте постоянные свойства имени пользователя базы данных, пароля, URL и драйверов, лимита опроса и т.д.

// init database constants
// com.mysql.jdbc.Driver
private static final String DATABASE_DRIVER = "com.mysql.cj.jdbc.Driver";
private static final String DATABASE_URL = "jdbc:mysql://localhost:3306/database_name";
private static final String USERNAME = "root";
private static final String PASSWORD = "";
private static final String MAX_POOL = "250"; // set your own limit

Инициализация подключения и свойств

Как только соединение установлено, его лучше сохранить для повторного использования.

// init connection object
private Connection connection;
// init properties object
private Properties properties;

Создание свойств

Объект properties содержит информацию о подключении, проверьте, установлено ли оно уже.

// create properties
private Properties getProperties() {
if (properties == null) {
properties = new Properties();
properties.setProperty("user", USERNAME);
properties.setProperty("password", PASSWORD);
properties.setProperty("MaxPooledStatements", MAX_POOL);
}
return properties;
}

Подключите базу данных

Теперь подключайтесь к базе данных, используя инициализированные константы и свойства.

// connect database
public Connection connect() {
if (connection == null) {
try {
Class.forName(DATABASE_DRIVER);
connection = DriverManager.getConnection(DATABASE_URL, getProperties());
} catch (ClassNotFoundException | SQLException e) {
// Java 7+
e.printStackTrace();
}
}
return connection;
}

Отключите базу данных

Как только вы закончите операции с базой данных, просто закройте соединение.

// disconnect database
public void disconnect() {
if (connection != null) {
try {
connection.close();
connection = null;
} catch (SQLException e) {
e.printStackTrace();
}
}
}

Все вместе

Используйте этот класс MysqlConnect непосредственно после изменения database_name, имени пользователя и пароля и т.д.

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;

public class MysqlConnect {
// init database constants
private static final String DATABASE_DRIVER = "com.mysql.cj.jdbc.Driver";
private static final String DATABASE_URL = "jdbc:mysql://localhost:3306/database_name";
private static final String USERNAME = "root";
private static final String PASSWORD = "";
private static final String MAX_POOL = "250";

// init connection object
private Connection connection;
// init properties object
private Properties properties;

// create properties
private Properties getProperties() {
if (properties == null) {
properties = new Properties();
properties.setProperty("user", USERNAME);
properties.setProperty("password", PASSWORD);
properties.setProperty("MaxPooledStatements", MAX_POOL);
}
return properties;
}

// connect database
public Connection connect() {
if (connection == null) {
try {
Class.forName(DATABASE_DRIVER);
connection = DriverManager.getConnection(DATABASE_URL, getProperties());
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
}
}
return connection;
}

// disconnect database
public void disconnect() {
if (connection != null) {
try {
connection.close();
connection = null;
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}

Как использовать?

Инициализируйте класс базы данных.

// !_ note _! this is just init
// it will not create a connection
MysqlConnect mysqlConnect = new MysqlConnect();

Где - нибудь еще в вашем коде ...

String sql = "SELECT * FROM `stackoverflow`";
try {
PreparedStatement statement = mysqlConnect.connect().prepareStatement(sql);
... go on ...
... go on ...
... DONE ....
} catch (SQLException e) {
e.printStackTrace();
} finally {
mysqlConnect.disconnect();
}

Это все :) Если есть что улучшить, отредактируйте это! Надеюсь, это полезно.

Ответ 4
String url = "jdbc:mysql://127.0.0.1:3306/yourdatabase";
String user = "username";
String password = "password";

// Load the Connector/J driver
Class.forName("com.mysql.jdbc.Driver").newInstance();
// Establish connection to MySQL
Connection conn = DriverManager.getConnection(url, user, password);
java mysql jdbc