Collega Java a un database MySQL


322

Come ti connetti a un database MySQL in Java?

Quando provo, ottengo

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)

O

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

O

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

Ecco un breve video tutorial di 3 minuti che dimostra l'utilizzo di MySQL da Java.
Dai

Risposte:


208

DriverManagerè un modo abbastanza vecchio di fare le cose. Il modo migliore è quello di ottenere uno DataSource, cercando uno che il contenitore del tuo server app sia già configurato per te:

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

o creare un'istanza e configurarne uno direttamente dal driver del database:

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

e quindi ottenere connessioni da esso, come sopra:

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

1
come mai gli altri esempi usano com.mysql.jdbc.Driver? questo metodo è migliore?
Jason S,

7
Penso che questa sia la classe di driver vecchio stile che funziona con il meccanismo di driver vecchio stile. MysqlDataSourceimplementa javax.sql.DataSourceil meccanismo più recente.
Sean Owen,

1
Ciao @SeanOwen Mi chiedo, perché chiudiamo rse stmt? Perché non solo conn?
Kamuran Sönecek,

3
Forse dovresti aggiungere dataSource.setDatabaseName ("database").
Myoch,

1
È buona pratica chiudere esplicitamente () le cose, anche se si tratta di più codice. Qualsiasi buona implementazione dovrebbe chiudere le risorse alla chiusura della connessione, sì. Considera altri contesti in cui desideri riutilizzare un'istruzione o una connessione. Nelle risorse di prova di Java 7, ottieni comunque questo comportamento gratuitamente:
Sean Owen,

476

Ecco una spiegazione dettagliata su come installare MySQL e JDBC e come usarlo:

  1. Scarica e installa il server MySQL . Fallo nel solito modo. Ricorda il numero di porta ogni volta che lo hai modificato. È di default3306.

  2. Scarica il driver JDBC e inserisci il percorso di classe , estrai il file ZIP e inserisci il file JAR contenente nel percorso di classe. Il driver JDBC specifico del fornitore è un'implementazione concreta dell'API JDBC ( tutorial qui ).

    Se stai usando un IDE come Eclipse o Netbeans, puoi aggiungerlo al percorso di classe aggiungendo il file JAR come libreria al percorso di costruzione nelle proprietà del progetto.

    Se lo stai eseguendo "plain vanilla" nella console di comando, devi specificare il percorso del file JAR nell'argomento -cpo -classpathquando esegui la tua applicazione Java.

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

    È .lì solo per aggiungere la directory corrente anche al percorso di classe in modo che possa individuare com.example.YourClasse ;è il separatore del percorso di classe come in Windows. In Unix e cloni :dovrebbero essere usati.

  3. Crea un database in MySQL . Creiamo un database javabase. Naturalmente vuoi World Domination, quindi usiamo anche UTF-8.

    CREATE DATABASE javabase DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;
  4. Crea un utente per Java e concedi l'accesso . Semplicemente perché l'utilizzorootè una cattiva pratica.

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

    Sì, javaè il nome utente e passwordla password qui.

  5. Determina l'URL JDBC . Per connettere il database MySQL tramite Java è necessario un URL JDBC nella seguente sintassi:

    jdbc: mysql: // hostname: port / nomedatabase
    • hostname: Il nome host su cui è installato il server MySQL. Se è installato sullo stesso computer su cui esegui il codice Java, puoi semplicemente usare localhost. Può anche essere un indirizzo IP simile 127.0.0.1. Se riscontri problemi di connettività e utilizzi 127.0.0.1invece di localhostrisolverli, allora hai un problema nella tua configurazione di rete / DNS / hosts.

    • port: La porta TCP / IP su cui è in ascolto il server MySQL. Questo è di default 3306.

    • databasename: Il nome del database a cui desideri connetterti. Questo è javabase.

    Quindi l'URL finale dovrebbe apparire come:

    jdbc: mysql: // localhost: 3306 / javabase
  6. Testare la connessione a MySQL utilizzando Java . Crea una semplice classe Java con unmain()metodo per testare la connessione.

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

    Se ottieni un SQLException: No suitable driver, significa che o il driver JDBC non è stato caricato automaticamente o che l'URL JDBC è errato (cioè non è stato riconosciuto da nessuno dei driver caricati). Normalmente, un driver JDBC 4.0 deve essere caricato automaticamente quando lo si rilascia nel percorso di classe di runtime. Per escludere l'uno e l'altro, puoi sempre caricarlo manualmente come di seguito:

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

    Si noti che la newInstance()chiamata non è necessaria qui. È solo per riparare il vecchio e il passeggino org.gjt.mm.mysql.Driver. Spiegazione qui . Se questa riga viene generata ClassNotFoundException, il file JAR contenente la classe di driver JDBC non viene semplicemente inserito nel percorso di classe.

    Si noti che non è necessario caricare il driver ogni volta prima di connettersi. È sufficiente solo una volta durante l'avvio dell'applicazione.

    Se ottieni uno SQLException: Connection refusedo Connection timed outuno specifico di MySQL CommunicationsException: Communications link failure, significa che il DB non è affatto raggiungibile. Ciò può avere una o più delle seguenti cause:

    1. L'indirizzo IP o il nome host nell'URL JDBC è errato.
    2. Il nome host nell'URL JDBC non è riconosciuto dal server DNS locale.
    3. Numero porta mancante o errato nell'URL JDBC.
    4. Il server DB non è attivo.
    5. Il server DB non accetta connessioni TCP / IP.
    6. Il server DB ha esaurito le connessioni.
    7. Qualcosa tra Java e DB sta bloccando le connessioni, ad esempio un firewall o un proxy.

    Per risolvere l'uno o l'altro, seguire i seguenti consigli:

    1. Verificare e testarli con ping.
    2. Aggiorna DNS o utilizza invece l'indirizzo IP nell'URL JDBC.
    3. Verificare sulla base my.cnfdi MySQL DB.
    4. Avviare il DB.
    5. Verifica se mysqld è avviato senza --skip-networking option.
    6. Riavviare il DB e correggere il codice di conseguenza in cui chiude le connessioni finally.
    7. Disabilita il firewall e / o configura il firewall / proxy per consentire / inoltrare la porta.

    Si noti che la chiusura di Connectionè estremamente importante. Se non si chiudono le connessioni e si continua a ottenerne molte in breve tempo, il database potrebbe esaurire le connessioni e l'applicazione potrebbe interrompersi. Acquisisci sempre il Connectionin una try-with-resourcesdichiarazione . O se non sei ancora su Java 7, chiudilo esplicitamente in finallyun try-finallyblocco. Chiudere finallyè solo per assicurarsi che venga chiuso anche in caso di un'eccezione. Questo vale anche per Statement, PreparedStatemente ResultSet.

Questo è quanto riguarda la connettività. Potete trovare qui un tutorial più avanzato come caricare e memorizzare fullworthy Java oggetti del modello in un database con l'aiuto di una classe DAO base.


L'uso di un modello Singleton per la connessione DB è un approccio errato. Vedi tra le altre domande: http://stackoverflow.com/q/9428573/ . Questo è un errore n. 1 per i principianti.


39

Inizializza le costanti del database

Creare nome utente, password, URL e driver del database delle proprietà costanti, limite di polling, ecc.

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

Inizializza connessione e proprietà

Una volta stabilita la connessione, è meglio conservare per scopi di riutilizzo.

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

Crea proprietà

L'oggetto proprietà contiene le informazioni sulla connessione, controlla se è già impostato.

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

Connetti il ​​database

Ora connettiti al database usando le costanti e le proprietà inizializzate.

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

Disconnetti il ​​database

Una volta terminate le operazioni con il database, basta chiudere la connessione.

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

Tutto insieme

Utilizzare questa classe MysqlConnectdirettamente dopo aver modificato database_name, nome utente, password ecc.

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

Come usare?

Inizializza la classe del database.

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

Da qualche altra parte nel tuo codice ...

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

Questo è tutto :) Se non altro per migliorarlo, modificalo! Spero sia utile.


Mark, ogni classe deve mantenere sempre aperta la propria istanza separata di MysqlConnect - supponendo che debbano interagire con i dati? Mi chiedo solo come funziona questa configurazione tra le classi.
Michael Sims,

al posto di com.mysql.jdbc.Driverquesto jdbc:mysql://localhost:3306/stocksdovrebbe essere usato come il primo è deprecato.
Chaudhry Waqas,

Se stai andando al nome dell'account, alla password, al nome del database ecc., Questo modo è molto goffo. Inserisci tutti questi dettagli nella stringa URL JDBC. (Incluse le dimensioni della piscina ...)
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);

qual è il tuo database qui? nome del database?
Koray Tugay,

newInstance () non è necessario. È?
Mohamed Ennahdi El Idrissi,

No. Non lo è. E da Java 6 l'intero approccio non è aggiornato. E il nome della classe del conducente è cambiato e ...
Stephen C

12

Ecco il minimo necessario per estrarre i dati da un database 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();

Aggiungi gestione delle eccezioni, configurazione ecc. A piacere.


3
perché hai bisogno Class.forName(...).newInstance()?
Don Cheadle,

5
@mmcrae No, dal 2007.
Marchese di Lorne,

3

Connessione JDBC MySQL con 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

devi avere il jar del connettore mysql nel tuo percorso di classe.

in Java JDBC API rende tutto con i database. usando JDBC possiamo scrivere applicazioni Java su
1. Invia query o aggiorna SQL a DB (qualsiasi database relazionale) 2. Recupera ed elabora i risultati dal DB

con i tre passaggi seguenti siamo in grado di recuperare i dati da qualsiasi database

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

Codice breve e dolce.

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

Per 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

ConnectionStavo usando un po 'di tempo fa, sembrava il modo più semplice, ma c'erano anche delle raccomandazioni per fare ifesattamente questa affermazione

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

O qualcosa del genere in quel modo :)

Probabilmente c'è qualche caso, mentre getConnectionpuò tornare null :)



1
COME
  • Per impostare il driver per eseguire un campione rapido
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
  • Per impostare il CLASSPATH

Metodo 1: imposta la variabile CLASSPATH.

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

Nel comando sopra, ho impostato CLASSPATH sulla cartella corrente e sul file mysql-connettore-java-VERSION.jar. Quindi, quando il java MyClassFilecomando viene eseguito, il programma di avvio dell'applicazione Java tenterà di caricare tutta la classe Java in CLASSPATH. E ha scoperto che gli Driveerrori class => BOOM erano spariti.

Metodo 2:

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

Nota: Class.forName ("com.mysql.jdbc.Driver"); Questo è deprecato in questo momento 2019 aprile

Spero che questo possa aiutare qualcuno!


-1

Connessione 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

Scarica il driver JDBC

Link per il download (selezionare piattaforma indipendente): https://dev.mysql.com/downloads/connector/j/

Spostare il driver JDBC sull'unità C.

Decomprimi i file e passa a C: \ drive. Il percorso del conducente dovrebbe essere simileC:\mysql-connector-java-8.0.19\mysql-connector-java-8.0.19

Esegui il tuo 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);
        }

    }  

}

inserisci qui la descrizione dell'immagine


-2

Codice corto

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;
    }
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.