Подключите Java к базе данных MySQL - PullRequest
301 голосов
/ 15 мая 2010

Как вы подключаетесь к базе данных 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

Ответы [ 13 ]

448 голосов
/ 15 мая 2010

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

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

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

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

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

    java -cp .;/path/to/mysql-connector.jar com.example.YourClass

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

  3. Создать базу данных в MySQL . Давайте создадим базу данных javabase. Вы, конечно же, хотите World Domination, поэтому давайте также использовать 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://hostname:port/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 неверен (т.е. он не был распознан ни одним из загруженных драйверов). Обычно драйвер JDBC 4.0 должен загружаться автоматически, когда вы просто отбрасываете его в путь к классам во время выполнения. Чтобы исключить одно и другое, вы всегда можете вручную загрузить его, как показано ниже:

    System.out.println("Loading driver...");
    
    try {
        Class.forName("com.mysql.jdbc.Driver");
        System.out.println("Driver loaded!");
    } catch (ClassNotFoundException e) {
        throw new IllegalStateException("Cannot find the driver in the classpath!", e);
    }
    

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

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

    Если вы получаете 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 . Или, если вы еще не используете Java 7, явно закройте его в finally блока try-finally. Закрытие в finally просто для гарантии того, что оно также будет закрыто в случае исключения. Это также относится к Statement, PreparedStatement и ResultSet.

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


Использование шаблона Singleton для подключения к БД - плохой подход. См. Среди других вопросов: http://stackoverflow.com/q/9428573/. Это ошибка № 1 для начала.

195 голосов
/ 15 мая 2010

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

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

или его создание и настройка непосредственно из драйвера базы данных:

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();
35 голосов
/ 14 июня 2015

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

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

// init database constants
private static final String DATABASE_DRIVER = "com.mysql.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;

Создать свойства

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

// 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 непосредственно после изменения имени_базы данных, имени пользователя и пароля и т. Д.

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.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();
}

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

23 голосов
/ 15 мая 2010
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);
13 голосов
/ 15 мая 2010

Вот тот минимум, который вам нужен для получения данных из базы данных MySQL:

Class.forName("com.mysql.jdbc.Driver").newInstance();
Connection conn = DriverManager.getConnection
   ("jdbc:mysql://localhost:3306/foo", "root", "password");

Statement stmt = conn.createStatement();
stmt.execute("SELECT * FROM `FOO.BAR`");
stmt.close();
conn.close();

Добавьте обработку исключений, настройку и т. Д. По вкусу.

4 голосов
/ 01 апреля 2017

MySQL JDBC Соединение с useSSL.

private String db_server = BaseMethods.getSystemData("db_server");
private String db_user = BaseMethods.getSystemData("db_user");
private String db_password = BaseMethods.getSystemData("db_password");

private String connectToDb() throws Exception {
   String jdbcDriver = "com.mysql.jdbc.Driver";
   String dbUrl = "jdbc:mysql://" + db_server  +
        "?verifyServerCertificate=false" +
        "&useSSL=true" +
        "&requireSSL=true";
    System.setProperty(jdbcDriver, "");
    Class.forName(jdbcDriver).newInstance();

    Connection conn = DriverManager.getConnection(dbUrl, db_user, db_password);
    Statement statement = conn.createStatement();
    String query = "SELECT EXTERNAL_ID FROM offer_letter where ID =" + "\"" + letterID + "\"";
    ResultSet resultSet = statement.executeQuery(query);
    resultSet.next();
    return resultSet.getString(1);
}
3 голосов
/ 06 октября 2015

Короткий и сладкий код.

try
    {       
        Class.forName("com.mysql.jdbc.Driver");
        System.out.println("Driver Loaded");
        conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/testDB","root","");
        //Database Name - testDB, Username - "root", Password - ""
        System.out.println("Connected...");         
    }
    catch(Exception e)
    {
        e.printStackTrace();
    }

Для SQL Server 2012

try
    {
        String url = "jdbc:sqlserver://KHILAN:1433;databaseName=testDB;user=Khilan;password=Tuxedo123"; 
       //KHILAN is Host and 1433 is port number     
        Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
        System.out.println("Driver Loaded");
        conn = DriverManager.getConnection(url);
        System.out.println("Connected...");
    }
    catch(Exception e)
    {
        e.printStackTrace();
    }
3 голосов
/ 15 августа 2013

у вас должен быть jar соединителя mysql в вашем classpath.

в Java JDBC API делает все с базами данных. используя JDBC, мы можем писать Java-приложения для
1. Отправлять запросы или обновлять SQL в БД (любая реляционная база данных) 2. Получить и обработать результаты из БД

ниже трех шагов мы можем получить данные из любой базы данных

Connection con = DriverManager.getConnection(
                     "jdbc:myDriver:DatabaseName",
                     dBuserName,
                     dBuserPassword);

Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery("SELECT a, b, c FROM Table");

while (rs.next()) {
    int x = rs.getInt("a");
    String s = rs.getString("b");
    float f = rs.getFloat("c");
}
3 голосов
/ 21 января 2012

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

Визит http://apekshit.com/t/51/Steps-to-connect-Database-using-JAVA

2 голосов
/ 28 мая 2015

Connection Я использовал некоторое время назад, это выглядело как самый простой способ, но также была рекомендация сделать там if заявление - точно

Connection con = DriverManager.getConnection(
                     "jdbc:myDriver:DatabaseName",
                     dBuserName,
                     dBuserPassword);
if (con != null){
 //..handle your code there 
}

Или что-то вроде этого:)

Возможно, есть какой-то случай, в то время как getConnection может вернуть null:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...