Підключіть 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? чи краще цей метод?
Джейсон S

7
Я думаю, що це клас драйверів старого стилю, який працює з механізмом водія старого стилю. MysqlDataSourceреалізує, javax.sql.DataSourceщо є новішим механізмом.
Шон Оуен

1
Привіт @SeanOwen Цікаво , що, чому ми близькі rsі stmt? Чому б не просто conn?
Kamuran Sönecek

3
Можливо, вам слід додати dataSource.setDatabaseName ("база даних").
Міох

1
Добре практично закривати () речі явно, хоча це і є більше кодом. Будь-яка хороша реалізація повинна закрити ресурси, коли з'єднання закриється, так. Розгляньте інші контексти, де ви хочете повторно використовувати оператор або з'єднання. У спробу використання ресурсів Java 7 ви все одно отримаєте таку поведінку безкоштовно:
Шон Оуен

476

Ось покрокове пояснення, як встановити MySQL та JDBC та як ним користуватися:

  1. Завантажте та встановіть сервер MySQL . Просто зробіть це звичайним способом. Запам'ятайте номер порту кожного разу, коли ви його змінили. Це за замовчуванням3306.

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

    Якщо ви використовуєте такий IDE, як Eclipse або Netbeans, тоді ви можете додати його до classpath, додавши файл JAR як бібліотеку до шляху збірки у властивості проекту.

    Якщо ви робите це "звичайна ваніль" на консолі команди, тоді вам потрібно вказати шлях до файлу JAR у -cpабо -classpathаргументі під час виконання вашої програми Java.

    java -cp.; / шлях / до / mysql-connector.jar com.example.YourClass

    .Тільки там , щоб додати поточну директорію в шлях до класів, а так , що він може знайти com.example.YourClassі ;є сепаратор , як шлях до класам він знаходиться в Windows. У Unix :слід використовувати клони .

  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: // ім'я хоста: ім'я порту / бази даних
    • hostname: Ім'я хоста, де встановлено MySQL-сервер. Якщо він встановлений на тій же машині, де ви запускаєте код Java, тоді ви можете просто використовувати localhost. Це також може бути IP-адреса 127.0.0.1. Якщо ви зіткнулися з проблемами з підключенням і використовуєте 127.0.0.1замість їх localhostвирішення, то у вашій мережі / DNS / хості налаштована проблема.

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

    Якщо ви отримаєте 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 outMySQL CommunicationsException: Communications link failure, це означає, що БД взагалі недоступна. Це може бути однією або декількома з таких причин:

    1. IP-адреса або ім'я хоста в URL-адресі JDBC неправильно
    2. Місцеве DNS-сервер не розпізнає ім'я хосту в URL-адресі JDBC.
    3. У URL-адресі JDBC номер порту відсутній або неправильний.
    4. Сервер БД не працює.
    5. Сервер DB не приймає TCP / IP-з'єднання.
    6. Сервер БД закінчився.
    7. Щось між Java та БД блокує з'єднання, наприклад, брандмауер чи проксі.

    Щоб вирішити те чи інше, дотримуйтесь наступних порад:

    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слід використовувати, оскільки колишній застарілий.
Чаддрі Вакас

Якщо ви збираєтеся назвати обліковий запис, пароль, ім'я бази даних тощо, цей шлях дуже незграбний. Просто введіть усі ці деталі в рядок URL-адреси JDBC. (Включаючи розмір басейну ...)
Stephen C

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, весь цей підхід застарів. І назва класу водіїв змінилася і ....
Stephen 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

вам потрібно мати банку роз'ємів mysql на своєму класі.

в 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 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помилки class => BOOM не було.

Спосіб 2:

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

Примітка: Class.forName ("com.mysql.jdbc.Driver"); Це застаріле в цей момент 2019 року.

Сподіваюся, це може комусь допомогти!


-1

Підключення MySql JDBC:

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.