Podłącz Javę do bazy danych MySQL


322

Jak połączyć się z bazą danych MySQL w Javie?

Kiedy próbuję, rozumiem

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)

Lub

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

Lub

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

Oto krótki 3-minutowy samouczek wideo demonstrujący używanie MySQL z Java. Sprawdź to tutaj: Szybki samouczek: Łączenie się z bazą danych MySQL przy użyciu Java
drorw

Odpowiedzi:


208

DriverManagerjest dość starym sposobem robienia rzeczy. Lepszym sposobem jest uzyskanie takiego DataSource, który jest już skonfigurowany dla Ciebie przez kontener serwera aplikacji:

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

lub tworzenie instancji i konfigurowanie bezpośrednio ze sterownika bazy danych:

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

a następnie uzyskaj z niego połączenia, tak jak powyżej:

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

1
skąd biorą się inne przykłady com.mysql.jdbc.Driver? czy ta metoda jest lepsza?
Jason S

7
Myślę, że jest to klasa Driver w starym stylu, która współpracuje z mechanizmem Driver w starym stylu. MysqlDataSourceimplementuje, javax.sql.DataSourcektóry jest nowszym mechanizmem.
Sean Owen

1
Cześć @SeanOwen Zastanawiam się, dlaczego zamykamy rsi stmt? Dlaczego nie tylko conn?
Kamuran Sönecek

3
Może powinieneś dodać dataSource.setDatabaseName („baza danych”).
Myoch

1
Dobrą praktyką jest jawne zamykanie () rzeczy, chociaż jest to więcej kodu. Każda dobra implementacja musiałaby zamknąć zasoby, gdy połączenie zostanie zamknięte, tak. Rozważ inne konteksty, w których chcesz ponownie użyć instrukcji lub połączenia. W wersji 7 try-with-resources Java 7 i tak otrzymujesz takie zachowanie za darmo:
Sean Owen

476

Oto wyjaśnienie krok po kroku, jak zainstalować MySQL i JDBC i jak go używać:

  1. Pobierz i zainstaluj serwer MySQL . Po prostu zrób to w zwykły sposób. Zapamiętaj numer portu, ilekroć go zmienisz. Domyślnie jest3306.

  2. Pobierz sterownik JDBC i umieść w ścieżce klasy , wyodrębnij plik ZIP i umieść zawierający plik JAR w ścieżce klasy. Sterownik JDBC specyficzny dla dostawcy jest konkretną implementacją interfejsu API JDBC ( samouczek tutaj ).

    Jeśli używasz środowiska IDE, takiego jak Eclipse lub Netbeans, możesz dodać go do ścieżki klas, dodając plik JAR jako bibliotekę do ścieżki kompilacji we właściwościach projektu.

    Jeśli robisz to jako „zwykłą wanilię” w konsoli poleceń, musisz określić ścieżkę do pliku JAR w argumencie -cplub -classpathpodczas uruchamiania aplikacji Java.

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

    .Jest właśnie tam, aby dodać aktualny katalog do ścieżki klasy, jak również tak, że można go zlokalizować com.example.YourClassi ;jest separator classpath tak jak w systemie Windows. W Uniksie i klonach :powinno się używać.

  3. Utwórz bazę danych w MySQL . Stwórzmy bazę danych javabase. Oczywiście chcesz World Domination, więc użyjmy także UTF-8.

    CREATE DATABASE javabase DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;
  4. Utwórz użytkownika dla Java i udziel mu dostępu . Po prostu dlatego, że używanierootjest złą praktyką.

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

    Tak, tutaj javajest nazwa użytkownika i passwordhasło.

  5. Określ adres URL JDBC . Aby połączyć bazę danych MySQL za pomocą Java, potrzebujesz adresu URL JDBC w następującej składni:

    jdbc: mysql: // nazwa hosta: port / nazwa bazy danych
    • hostname: Nazwa hosta, na którym jest zainstalowany serwer MySQL. Jeśli jest zainstalowany na tym samym komputerze, na którym uruchamiasz kod Java, możesz po prostu użyć localhost. Może to być również adres IP jak 127.0.0.1. Jeśli napotkasz problemy z połączeniem i używanie 127.0.0.1zamiast localhostrozwiązania, oznacza to, że masz problem z konfiguracją sieci / DNS / hostów.

    • port: Port TCP / IP, na którym nasłuchuje serwer MySQL. To jest domyślnie 3306.

    • databasename: Nazwa bazy danych, z którą chcesz się połączyć. To javabase.

    Tak więc końcowy adres URL powinien wyglądać następująco:

    jdbc: mysql: // localhost: 3306 / javabase
  6. Przetestuj połączenie z MySQL przy użyciu Java . Utwórz prostą klasę Java za pomocąmain()metody testowania połączenia.

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

    Jeśli otrzymasz a SQLException: No suitable driver, oznacza to, że albo sterownik JDBC nie został w ogóle automatycznie załadowany, albo że adres URL JDBC jest nieprawidłowy (tzn. Nie został rozpoznany przez żaden z załadowanych sterowników). Zwykle sterownik JDBC 4.0 powinien zostać automatycznie załadowany, gdy tylko upuścisz go w ścieżce klasy środowiska wykonawczego. Aby wykluczyć jedno i drugie, zawsze możesz ręcznie załadować go w następujący sposób:

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

    Pamiętaj, że newInstance()połączenie nie jest tutaj potrzebne. To tylko naprawić stary i buggy org.gjt.mm.mysql.Driver. Wyjaśnienie tutaj . Jeśli ten wiersz zostanie zgłoszony ClassNotFoundException, plik JAR zawierający klasę sterownika JDBC po prostu nie zostanie umieszczony w ścieżce klasy.

    Pamiętaj, że nie musisz ładować sterownika za każdym razem przed połączeniem. Wystarczy tylko raz podczas uruchamiania aplikacji.

    Jeśli masz SQLException: Connection refusedlub Connection timed outlub konkretnego MySQL CommunicationsException: Communications link failure, to oznacza to, że DB nie jest osiągalny w ogóle. Może to mieć jedną lub więcej z następujących przyczyn:

    1. Adres IP lub nazwa hosta w adresie URL JDBC jest niepoprawna.
    2. Nazwa hosta w adresie URL JDBC nie jest rozpoznawana przez lokalny serwer DNS.
    3. Brak numeru portu lub jest on niepoprawny w adresie URL JDBC.
    4. Serwer DB jest wyłączony.
    5. Serwer DB nie akceptuje połączeń TCP / IP.
    6. W serwerze DB zabrakło połączeń.
    7. Coś pomiędzy Javą a DB blokuje połączenia, np. Firewall lub proxy.

    Aby rozwiązać jedno lub drugie, postępuj zgodnie z następującymi wskazówkami:

    1. Sprawdź i przetestuj je ping.
    2. Odśwież DNS lub użyj adresu IP w adresie URL JDBC.
    3. Sprawdź to na podstawie my.cnfMySQL DB.
    4. Uruchom DB.
    5. Sprawdź, czy mysqld jest uruchamiany bez --skip-networking option.
    6. Uruchom ponownie bazę danych i popraw odpowiednio kod, aby zamykał połączenia finally.
    7. Wyłącz zaporę i / lub skonfiguruj zaporę / serwer proxy, aby zezwolić / przekierować port.

    Pamiętaj, że zamknięcie Connectionjest niezwykle ważne. Jeśli nie zamykasz połączeń i otrzymujesz wiele z nich w krótkim czasie, baza danych może kończyć się połączenia, a twoja aplikacja może się zepsuć. Zawsze zdobywaj Connectionw try-with-resourcesoświadczeniu . Lub jeśli nie jesteś jeszcze na Java 7, wyraźnie zamknąć go w finallyz try-finallybloku. Zamknięcie finallyma na celu zapewnienie zamknięcia również w przypadku wyjątku. Dotyczy to także Statement, PreparedStatementa ResultSet.

To tyle, jeśli chodzi o łączność. Znajdziesz tutaj bardziej zaawansowany samouczek, jak ładować i przechowywać w pełni godne zaufania obiekty modelu Java w bazie danych przy pomocy podstawowej klasy DAO.


Używanie wzorca singletonu dla połączenia DB jest złym podejściem. Zobacz między innymi pytania: http://stackoverflow.com/q/9428573/ . Jest to błąd nr 1 na początek.


39

Zainicjuj stałe bazy danych

Utwórz stałą nazwę użytkownika bazy danych, hasło, adres URL i sterowniki, limit odpytywania itp.

// 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

Zainicjuj połączenie i właściwości

Po nawiązaniu połączenia lepiej jest przechowywać w celu ponownego użycia.

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

Utwórz właściwości

Obiekt właściwości przechowuje informacje o połączeniu, sprawdź, czy jest już ustawiony.

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

Połącz bazę danych

Teraz połącz się z bazą danych, używając zainicjowanych stałych i właściwości.

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

Odłącz bazę danych

Po zakończeniu operacji na bazie danych po prostu zamknij połączenie.

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

Wszystko razem

Użyj tej klasy MysqlConnectbezpośrednio po zmianie nazwy bazy danych, nazwy użytkownika i hasła itp.

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

Jak używać?

Zainicjuj klasę bazy danych.

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

Gdzie indziej w twoim kodzie ...

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

To wszystko :) Jeśli coś poprawić, edytuj! Mam nadzieję, że to jest pomocne.


Zaznacz, czy każda klasa musi utrzymywać swoją osobną instancję MysqlConnect otwartą przez cały czas - zakładając, że potrzebuje interakcji z danymi? Zastanawiam się tylko, jak ta konfiguracja działa między klasami.
Michael Sims,

zamiast com.mysql.jdbc.Drivertego jdbc:mysql://localhost:3306/stocksnależy zastosować, ponieważ ten pierwszy jest przestarzały.
Chaudhry Waqas

Jeśli zamierzasz podać nazwę konta, hasło, nazwę bazy danych itp., Ten sposób jest bardzo niezdarny. Wystarczy umieścić wszystkie te szczegóły w ciągu adresu URL JDBC. (W tym rozmiar basenu ...)
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);

jaka jest tutaj twoja baza danych? nazwa bazy danych?
Koray Tugay

newInstance () nie jest konieczne. Czy to jest
Mohamed Ennahdi El Idrissi,

Nie. To nie jest A od wersji Java 6 całe to podejście jest nieaktualne. A nazwa klasy kierowcy uległa zmianie i ...
Stephen C

12

Oto minimalne zapotrzebowanie na dane z bazy danych 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();

Dodaj obsługę wyjątków, konfigurację itp. Do smaku.


3
dlaczego trzeba Class.forName(...).newInstance()?
Don Cheadle

5
@mmcrae Nie masz, od 2007.
Markiz Lorne

3

Połączenie MySQL JDBC z 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

musisz mieć słoik łącznika mysql w ścieżce klasy.

w Java JDBC API tworzy wszystko z bazami danych. za pomocą JDBC możemy pisać aplikacje Java do
1. Wysyłania zapytań lub aktualizacji SQL do DB (dowolna relacyjna baza danych) 2. Pobieranie i przetwarzanie wyników z DB

poniżej trzech kroków możemy pobrać dane z dowolnej bazy danych

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

Krótki i słodki kod.

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

Dla 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

ConnectionUżyłem jakiś czas temu, wyglądało to na najłatwiejszy sposób, ale było też zalecenie, aby złożyć ifoświadczenie - dokładnie

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

Lub coś w ten sposób :)

Prawdopodobnie jest jakaś sprawa, póki getConnectionmoże wrócić null :)



1
W JAKI SPOSÓB
  • Aby skonfigurować sterownik, aby uruchomić szybką próbkę
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
  • Aby skonfigurować CLASSPATH

Metoda 1: ustaw zmienną CLASSPATH.

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

W powyższym poleceniu ustawiłem CLASSPATH na bieżący folder i plik mysql-connector-java-VERSION.jar. Gdy więc java MyClassFilepolecenie zostanie wykonane, program uruchamiający aplikację Java spróbuje załadować całą klasę Java w CLASSPATH. I okazało się, że Drivebłędy klasy => BOOM zniknęły.

Metoda 2:

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

Uwaga: Class.forName („com.mysql.jdbc.Driver”); To jest przestarzałe w tym momencie 2019 kwietnia.

Mam nadzieję, że to może komuś pomóc!


-1

Połączenie JSBC MySql:

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

Pobierz sterownik JDBC

Link do pobrania (Wybierz niezależny od platformy): https://dev.mysql.com/downloads/connector/j/

Przenieś sterownik JDBC na dysk C.

Rozpakuj pliki i przejdź na dysk C: \. Twoja ścieżka sterownika powinna być jakC:\mysql-connector-java-8.0.19\mysql-connector-java-8.0.19

Uruchom swoją Javę

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

    }  

}

wprowadź opis zdjęcia tutaj


-2

Krótki kod

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;
    }
}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.