Verbinden Sie Java mit einer MySQL-Datenbank


322

Wie stellen Sie eine Verbindung zu einer MySQL-Datenbank in Java her?

Wenn ich es versuche, bekomme ich

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)

Oder

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

Oder

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

Hier ist ein kurzes 3-minütiges Video-Tutorial, das die Verwendung von MySQL aus Java demonstriert. Schauen Sie sich das hier an:
Kurzanleitung

Antworten:


208

DriverManagerist eine ziemlich alte Art, Dinge zu tun. Der bessere Weg ist, einen zu erhalten DataSource, indem Sie entweder einen nachschlagen, den Ihr App-Server-Container bereits für Sie konfiguriert hat:

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

oder einen von Ihrem Datenbanktreiber direkt instanziieren und konfigurieren:

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

und erhalten Sie dann Verbindungen von ihm, wie oben:

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

1
Wie kommt es, dass die anderen Beispiele verwendet werden com.mysql.jdbc.Driver? ist diese Methode besser?
Jason S

7
Ich denke, dies ist die Treiberklasse im alten Stil, die mit dem Treibermechanismus im alten Stil funktioniert. MysqlDataSourceimplementiert, javax.sql.DataSourcewelches der neuere Mechanismus ist.
Sean Owen

1
Hallo @ SeanOwen, ich frage mich, warum schließen wir rsund stmt? Warum nicht einfach conn?
Kamuran Sönecek

3
Vielleicht sollten Sie dataSource.setDatabaseName ("Datenbank") hinzufügen.
Myoch

1
Es ist empfehlenswert, Dinge explizit zu schließen, obwohl es sich um mehr Code handelt. Jede gute Implementierung müsste die Ressourcen schließen, wenn die Verbindung geschlossen wird, ja. Berücksichtigen Sie andere Kontexte, in denen Sie eine Anweisung oder Verbindung wiederverwenden möchten. In Java 7's Try-with-Resources erhalten Sie dieses Verhalten sowieso kostenlos:
Sean Owen

476

Hier finden Sie eine schrittweise Erklärung zur Installation von MySQL und JDBC und zur Verwendung:

  1. Laden Sie den MySQL-Server herunter und installieren Sie ihn . Mach es einfach wie gewohnt. Merken Sie sich die Portnummer, wenn Sie sie geändert haben. Es ist standardmäßig3306.

  2. Laden Sie den JDBC-Treiber herunter und geben Sie den Klassenpfad ein , extrahieren Sie die ZIP-Datei und fügen Sie die enthaltene JAR-Datei in den Klassenpfad ein. Der herstellerspezifische JDBC-Treiber ist eine konkrete Implementierung der JDBC-API ( Tutorial hier ).

    Wenn Sie eine IDE wie Eclipse oder Netbeans verwenden, können Sie sie dem Klassenpfad hinzufügen, indem Sie die JAR-Datei als Bibliothek zum Erstellungspfad in den Projekteigenschaften hinzufügen .

    Wenn Sie es "Plain Vanilla" in der Befehlskonsole tun, müssen Sie den Pfad zur JAR-Datei im Argument -cpoder angeben, -classpathwenn Sie Ihre Java-Anwendung ausführen.

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

    Das .ist nur da, um das aktuelle Verzeichnis zum Klassenpfad hinzuzufügen, damit es es finden kann, com.example.YourClassund das ;ist das Klassenpfadtrennzeichen, wie es in Windows ist. Unter Unix :sollten Klone verwendet werden.

  3. Erstellen Sie eine Datenbank in MySQL . Lassen Sie uns eine Datenbank erstellen javabase. Sie möchten natürlich die Weltherrschaft, also verwenden wir auch UTF-8.

    CREATE DATABASE javabase DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;
  4. Erstellen Sie einen Benutzer für Java und gewähren Sie ihm Zugriff . Einfach weil das Verwendenrooteine schlechte Praxis ist.

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

    Ja, javaist der Benutzername und passwordist das Passwort hier.

  5. Bestimmen Sie die JDBC-URL . Um die MySQL-Datenbank mit Java zu verbinden, benötigen Sie eine JDBC-URL mit der folgenden Syntax:

    jdbc: mysql: // hostname: port / datenbankname
    • hostname: Der Hostname, auf dem der MySQL-Server installiert ist. Wenn es auf demselben Computer installiert ist, auf dem Sie den Java-Code ausführen, können Sie ihn einfach verwenden localhost. Es kann auch eine IP-Adresse wie sein 127.0.0.1. Wenn Sie auf Verbindungsprobleme stoßen und diese verwenden, 127.0.0.1anstatt sie zu localhostlösen, liegt ein Problem in Ihrer Netzwerk- / DNS- / Hosts-Konfiguration vor.

    • port: Der TCP / IP-Port, an dem der MySQL-Server lauscht. Dies ist standardmäßig 3306.

    • databasename: Der Name der Datenbank, zu der Sie eine Verbindung herstellen möchten. Das ist javabase.

    Die endgültige URL sollte also folgendermaßen aussehen:

    jdbc: mysql: // localhost: 3306 / javabase
  6. Testen Sie die Verbindung zu MySQL mit Java . Erstellen Sie eine einfache Java-Klasse mit einermain()Methode zum Testen der Verbindung.

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

    Wenn Sie eine erhalten SQLException: No suitable driver, bedeutet dies, dass entweder der JDBC-Treiber überhaupt nicht automatisch geladen wurde oder dass die JDBC-URL falsch ist (dh von keinem der geladenen Treiber erkannt wurde). Normalerweise sollte ein JDBC 4.0-Treiber automatisch geladen werden, wenn Sie ihn einfach im Laufzeitklassenpfad ablegen. Um das eine oder andere auszuschließen, können Sie es jederzeit wie folgt manuell laden:

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

    Beachten Sie, dass der newInstance()Anruf hier nicht benötigt wird. Es ist nur um den alten und fehlerhaften zu reparieren org.gjt.mm.mysql.Driver. Erklärung hier . Wenn diese Zeile ausgelöst wird ClassNotFoundException, wird die JAR-Datei mit der JDBC-Treiberklasse einfach nicht in den Klassenpfad eingefügt.

    Beachten Sie, dass Sie den Treiber nicht jedes Mal laden müssen, bevor Sie eine Verbindung herstellen. Nur einmal während des Anwendungsstarts reicht aus.

    Wenn Sie ein SQLException: Connection refusedoder Connection timed outoder ein MySQL-spezifisches erhalten CommunicationsException: Communications link failure, bedeutet dies, dass die Datenbank überhaupt nicht erreichbar ist. Dies kann eine oder mehrere der folgenden Ursachen haben:

    1. Die IP-Adresse oder der Hostname in der JDBC-URL ist falsch.
    2. Der Hostname in der JDBC-URL wird vom lokalen DNS-Server nicht erkannt.
    3. Portnummer fehlt oder ist in der JDBC-URL falsch.
    4. DB-Server ist ausgefallen.
    5. Der DB-Server akzeptiert keine TCP / IP-Verbindungen.
    6. Dem DB-Server sind die Verbindungen ausgegangen.
    7. Etwas zwischen Java und DB blockiert Verbindungen, z. B. eine Firewall oder ein Proxy.

    Befolgen Sie die folgenden Hinweise, um das eine oder andere Problem zu lösen:

    1. Überprüfen und testen Sie sie mit ping.
    2. Aktualisieren Sie DNS oder verwenden Sie stattdessen die IP-Adresse in der JDBC-URL.
    3. Überprüfen Sie es basierend auf my.cnfMySQL DB.
    4. Starten Sie die DB.
    5. Überprüfen Sie, ob mysqld ohne das gestartet wird --skip-networking option.
    6. Starten Sie die Datenbank neu und korrigieren Sie Ihren Code entsprechend, damit Verbindungen in geschlossen werden finally.
    7. Deaktivieren Sie die Firewall und / oder konfigurieren Sie die Firewall / den Proxy so, dass der Port zugelassen / weitergeleitet wird.

    Beachten Sie, dass das Schließen Connectionist extrem wichtig. Wenn Sie keine Verbindungen schließen und in kurzer Zeit immer wieder viele davon erhalten, gehen der Datenbank möglicherweise die Verbindungen aus und Ihre Anwendung kann unterbrochen werden. Erwerben Sie das immer Connectionin einer try-with-resourcesErklärung . Wenn Sie noch nicht mit Java 7 arbeiten, schließen Sie es explizit in finallyeinem try-finallyBlock. Das Schließen finallydient nur dazu, sicherzustellen, dass es im Falle einer Ausnahme auch geschlossen wird. Dies gilt auch für Statement, PreparedStatementund ResultSet.

Das war es, was die Konnektivität betrifft. Sie können finden hier eine erweiterte Tutorial , wie zu laden und zu speichern fullworthy Java Modell - Objekte in einer Datenbank mit Hilfe einer grundlegenden DAO - Klasse.


Die Verwendung eines Singleton-Musters für die DB-Verbindung ist ein schlechter Ansatz. Siehe unter anderem: http://stackoverflow.com/q/9428573/ . Dies ist ein Starterfehler Nr. 1.


39

Datenbankkonstanten initialisieren

Erstellen Sie einen Benutzernamen, ein Kennwort, eine URL und Treiber für die Datenbank mit konstanten Eigenschaften, ein Abruflimit usw.

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

Verbindung und Eigenschaften initialisieren

Sobald die Verbindung hergestellt ist, ist es besser, sie für Wiederverwendungszwecke zu speichern.

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

Eigenschaften erstellen

Das Eigenschaftenobjekt enthält die Verbindungsinformationen. Überprüfen Sie, ob diese bereits festgelegt sind.

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

Verbinden Sie die Datenbank

Stellen Sie nun mithilfe der initialisierten Konstanten und Eigenschaften eine Verbindung zur Datenbank her.

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

Trennen Sie die Datenbank

Wenn Sie mit den Datenbankoperationen fertig sind, schließen Sie einfach die Verbindung.

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

Alles zusammen

Verwenden Sie diese Klasse MysqlConnectdirekt nach dem Ändern von Datenbankname, Benutzername und Kennwort usw.

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

Wie benutzt man?

Initialisieren Sie die Datenbankklasse.

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

Irgendwo anders in Ihrem Code ...

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

Das ist alles :) Wenn etwas zu verbessern, bearbeiten Sie es! Hoffe das ist hilfreich.


Mark, muss jede Klasse ihre eigene separate MysqlConnect-Instanz aufrechterhalten, die jederzeit geöffnet ist - vorausgesetzt, sie muss mit den Daten interagieren? Ich frage mich nur, wie dieses Setup zwischen den Klassen funktioniert.
Michael Sims

anstelle von com.mysql.jdbc.Driverdiesem jdbc:mysql://localhost:3306/stockssollte als die ehemaligen verwendet werden veraltet.
Chaudhry Waqas

Wenn Sie den Kontonamen, das Kennwort, den Datenbanknamen usw. fest verdrahten, ist dieser Weg sehr umständlich. Fügen Sie einfach alle diese Details in die JDBC-URL-Zeichenfolge ein. (Einschließlich der Poolgröße ...)
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);

Was ist deine Datenbank hier? Name der Datenbank?
Koray Tugay

newInstance () ist nicht erforderlich. Ist es?
Mohamed Ennahdi El Idrissi

Nee. Ist es nicht. Und seit Java 6 ist dieser gesamte Ansatz veraltet. Und der Name der Fahrerklasse hat sich geändert und ...
Stephen C

12

Hier ist das Minimum, das Sie benötigen, um Daten aus einer MySQL-Datenbank abzurufen:

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

Fügen Sie nach Belieben Ausnahmebehandlung, Konfiguration usw. hinzu.


3
Warum brauchen Sie Class.forName(...).newInstance()?
Don Cheadle

5
@mmcrae Sie nicht, seit 2007.
Marquis von Lorne

3

MySQL JDBC-Verbindung mit 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

Sie müssen MySQL Connector Jar in Ihrem Klassenpfad haben.

in Java JDBC API macht alles mit Datenbanken. Mit JDBC können wir Java-Anwendungen schreiben, um
1. Abfragen zu senden oder SQL an die DB (eine beliebige relationale Datenbank) zu aktualisieren. 2. Die Ergebnisse aus der DB abzurufen und zu verarbeiten

Mit den folgenden drei Schritten können wir Daten aus jeder Datenbank abrufen

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

Kurz- und Süßcode.

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

Für 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

ConnectionIch habe es vor einiger Zeit benutzt, es sah nach dem einfachsten Weg aus, aber es gab auch Empfehlungen, ifgenau dort eine Aussage zu machen

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

Oder so ähnlich :)

Wahrscheinlich gibt es einen Fall, während zurückkehren getConnectionkann null :)


Zu viele Vermutungen in dieser Antwort und einige davon falsch
Stephen C


1
WIE
  • So richten Sie den Treiber so ein, dass eine schnelle Probe ausgeführt wird
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
  • Einrichten des CLASSPATH

Methode 1: Setzen Sie die Variable CLASSPATH.

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

Im obigen Befehl habe ich CLASSPATH auf den aktuellen Ordner und die Datei mysql-connector-java-VERSION.jar gesetzt. Wenn der java MyClassFileBefehl ausgeführt wird, versucht der Java Application Launcher, die gesamte Java-Klasse in CLASSPATH zu laden. Und es stellte sich heraus, dass die DriveKlasse => BOOM-Fehler verschwunden waren.

Methode 2:

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

Hinweis: Class.forName ("com.mysql.jdbc.Driver"); Dies ist in diesem Moment 2019 Apr veraltet.

Hoffe das kann jemandem helfen!


-1

MySql JDBC-Verbindung:

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

Laden Sie den JDBC-Treiber herunter

Download-Link (Plattformunabhängig auswählen): https://dev.mysql.com/downloads/connector/j/

Verschieben Sie den JDBC-Treiber auf das Laufwerk C.

Entpacken Sie die Dateien und wechseln Sie zu Laufwerk C: \. Ihr Fahrerpfad sollte so seinC:\mysql-connector-java-8.0.19\mysql-connector-java-8.0.19

Führen Sie Ihr Java aus

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

    }  

}

Geben Sie hier die Bildbeschreibung ein


-2

Funktionscode

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;
    }
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.