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


322

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

Вот короткое 3-минутное видеоурок, демонстрирующий использование MySQL из Java. Проверьте это здесь: Краткое руководство: Соединение с базой данных MySQL с помощью Java
drorw

Ответы:


208

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

1
почему другие примеры используют com.mysql.jdbc.Driver? этот метод лучше?
Джейсон С

7
Я думаю, что это класс Driver старого стиля, который работает с механизмом драйвера старого стиля. MysqlDataSourceреализует, javax.sql.DataSourceкоторый является более новым механизмом.
Шон Оуэн

1
Привет @SeanOwen Интересно, почему мы закрываем rsи stmt? Почему не просто conn?
Камуран Сонечек

3
Возможно, вам следует добавить dataSource.setDatabaseName («база данных»).
Миох

1
Рекомендуется явно закрывать (), хотя это больше кода. Любая хорошая реализация должна была бы закрыть ресурсы, когда соединение закрывается, да. Рассмотрим другие контексты, в которых вы хотите повторно использовать оператор или соединение. В Java 7 try-with-resources вы все равно получаете это поведение бесплатно:
Шон Оуэн,

476

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

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

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

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

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

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

    .Только там , чтобы добавить текущую директорию в путь к классам, а так , что он может найти 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: Имя хоста, на котором установлен сервер 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: // локальный: 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);
    }

    Если вы получаете a 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, то это означает , что DB не доступен на всех. Это может иметь одну или несколько из следующих причин:

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

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


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


39

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

Создать постоянную базу данных свойств, имя пользователя, пароль, 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;

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

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

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

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


Марк, каждый класс должен постоянно поддерживать свой отдельный экземпляр MysqlConnect открытым - при условии, что им нужно взаимодействовать с данными? Мне просто интересно, как эта установка работает между классами.
Майкл Симс

вместо com.mysql.jdbc.Driverэтого jdbc:mysql://localhost:3306/stocksследует использовать, так как первое устарело.
Chaudhry Waqas

Если вы собираетесь использовать имя учетной записи, пароль, имя базы данных и т. Д., Этот способ очень неуклюжий. Просто поместите все эти детали в строку URL JDBC. (Включая размер бассейна ...)
Стивен С

24
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);

какая ваша база данных здесь? имя базы данных?
Корай Тугай

newInstance () не является необходимым. Это?
Мохамед Эннахди Эль Идрисси

Нет. Это не так. А начиная с Java 6 весь этот подход устарел. И название класса водителя изменилось и ....
Стивен C

12

Вот тот минимум, который вам нужен для получения данных из базы данных 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();

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


3
зачем вам это нужно Class.forName(...).newInstance()?
Дон Чидл

5
@mmcrae Вы не, с 2007 года.
Маркиз Лорн

3

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

2

у вас должен быть 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");
}

2

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

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

1

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

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

Или как-то так :)

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


1

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

Посетите http://apekshit.com/t/51/Steps-to-connect-Database-using-JAVA


1
КАК
  • Чтобы настроить драйвер для запуска быстрого образца
1. Go to https://dev.mysql.com/downloads/connector/j/, get the latest version of Connector/J

2. Remember to set the classpath to include the path of the connector jar file.
If we don't set it correctly, below errors can occur:

No suitable driver found for jdbc:mysql://127.0.0.1:3306/msystem_development

java.lang.ClassNotFoundException: com.mysql.jdbc:Driver
  • Чтобы настроить CLASSPATH

Метод 1: установите переменную CLASSPATH.

export CLASSPATH=".:mysql-connector-java-VERSION.jar"
java MyClassFile

В приведенной выше команде я установил для CLASSPATH текущую папку и файл mysql-connector-java-VERSION.jar. Поэтому, когда java MyClassFileкоманда будет выполнена, программа запуска приложений java попытается загрузить все классы Java в CLASSPATH. И это нашлоDrive ошибки класса => BOOM пропали.

Способ 2:

java -cp .:mysql-connector-java-VERSION.jar MyClassFile

Примечание. Class.forName ("com.mysql.jdbc.Driver"); Это не рекомендуется в данный момент 2019 апр.

Надеюсь, что это может помочь кому-то!


-1

MySql JDBC Connection:

Class.forName("com.mysql.jdbc.Driver");     

Connection con=DriverManager.getConnection("jdbc:mysql://localhost:3306/DatabaseName","Username","Password");         
Statement stmt=con.createStatement();            
stmt = con.createStatement();
ResultSet rs=stmt.executeQuery("Select * from Table");  

-1

Скачать драйвер JDBC

Ссылка для скачивания (выберите платформу независимо): https://dev.mysql.com/downloads/connector/j/

Переместить драйвер JDBC на диск C

Разархивируйте файлы и перейдите на диск C: \. Ваш путь к драйверу должен быть такимC:\mysql-connector-java-8.0.19\mysql-connector-java-8.0.19

Запустите свою Java

java -cp "C:\mysql-connector-java-8.0.19\mysql-connector-java-8.0.19\mysql-connector-java-8.0.19.jar" testMySQL.java

testMySQL.java

import java.sql.*;
import java.io.*;

public class testMySQL {
    public static void main(String[] args) {
    // TODO Auto-generated method stub
        try
        {  
            Class.forName("com.mysql.cj.jdbc.Driver");  
            Connection con=DriverManager.getConnection(  
                "jdbc:mysql://localhost:3306/db?useSSL=false&useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC","root","");  
            Statement stmt=con.createStatement();  
            ResultSet rs=stmt.executeQuery("show databases;");  
            System.out.println("Connected");  
        }
        catch(Exception e)
        {
            System.out.println(e);
        }

    }  

}

введите описание изображения здесь


-2

Короткий номер

public class DB {

    public static Connection c;

    public static Connection getConnection() throws Exception {
        if (c == null) {
            Class.forName("com.mysql.jdbc.Driver");
            c =DriverManager.getConnection("jdbc:mysql://localhost:3306/DATABASE", "USERNAME", "Password");
        }
        return c;
    }

    // Send data TO Database
    public static void setData(String sql) throws Exception {
        DB.getConnection().createStatement().executeUpdate(sql);
    }

    // Get Data From Database
    public static ResultSet getData(String sql) throws Exception {
        ResultSet rs = DB.getConnection().createStatement().executeQuery(sql);
        return rs;
    }
}
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.