Connectez Java à une base de données MySQL

322

Comment vous connectez-vous à une base de données MySQL en Java?

Quand j'essaye, je reçois

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)

Ou

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

Ou

java.lang.ClassNotFoundException: com.mysql.cj.jdbc.Driver
abson
la source
Voici un court didacticiel vidéo de 3 minutes qui illustre l'utilisation de MySQL à partir de Java. Découvrez-le ici: Tutoriel rapide:
Se

Réponses:

208

DriverManagerest une façon assez ancienne de faire les choses. La meilleure façon est d'en obtenir un DataSource, soit en recherchant un que votre conteneur de serveur d'applications déjà configuré pour vous:

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

ou en instanciant et en configurant un directement depuis votre pilote de base de données:

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

puis en obtenir des connexions, comme ci-dessus:

Connection conn = dataSource.getConnection();
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT ID FROM USERS");
...
rs.close();
stmt.close();
conn.close();
Sean Owen
la source
1
comment se font les autres exemples com.mysql.jdbc.Driver? cette méthode est-elle meilleure?
Jason S
7
Je pense que c'est la classe Driver à l'ancienne qui fonctionne avec le mécanisme de pilote à l'ancienne. MysqlDataSourceimplémente javax.sql.DataSourcequi est le mécanisme le plus récent.
Sean Owen
1
Salut @SeanOwen Je me demande cela, pourquoi fermons-nous rset stmt? Pourquoi pas juste conn?
Kamuran Sönecek
3
Vous devriez peut-être ajouter dataSource.setDatabaseName ("base de données").
Myoch
1
C'est une bonne pratique de fermer les choses explicitement, bien que ce soit plus de code. Toute bonne implémentation devrait fermer les ressources à la fermeture de la connexion, oui. Considérez d'autres contextes où vous souhaitez réutiliser une instruction ou une connexion. Dans la version d'essai de Java 7, vous obtenez de toute façon ce comportement gratuitement:
Sean Owen
476

Voici une explication étape par étape comment installer MySQL et JDBC et comment l'utiliser:

  1. Téléchargez et installez le serveur MySQL . Faites-le comme d'habitude. N'oubliez pas le numéro de port chaque fois que vous l'avez modifié. C'est par défaut3306.

  2. Téléchargez le pilote JDBC et placez-le dans le chemin de classe , extrayez le fichier ZIP et placez le fichier JAR contenant dans le chemin de classe. Le pilote JDBC spécifique au fournisseur est une implémentation concrète de l' API JDBC ( tutoriel ici ).

    Si vous utilisez un IDE comme Eclipse ou Netbeans, vous pouvez l'ajouter au chemin de classe en ajoutant le fichier JAR en tant que bibliothèque au chemin de génération dans les propriétés du projet.

    Si vous le faites "plain vanilla" dans la console de commande, vous devez spécifier le chemin d'accès au fichier JAR dans l' argument -cpou -classpathlors de l'exécution de votre application Java.

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

    Le .est juste là pour ajouter le répertoire courant au chemin de classe afin qu'il puisse le localiser com.example.YourClasset le ;séparateur de chemin de classe comme il l'est dans Windows. Sous Unix et les clones :doivent être utilisés.

  3. Créez une base de données dans MySQL . Créons une base de données javabase. Vous voulez bien sûr World Domination, alors utilisons également UTF-8.

    CREATE DATABASE javabase DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;
  4. Créez un utilisateur pour Java et accordez- lui l'accès . Tout simplement parce que l'utilisationrootest une mauvaise pratique.

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

    Oui, javac'est le nom d'utilisateur et passwordle mot de passe ici.

  5. Déterminez l'URL JDBC . Pour connecter la base de données MySQL à l'aide de Java, vous avez besoin d'une URL JDBC dans la syntaxe suivante:

    jdbc: mysql: // hostname: port / databasename
    • hostname: Le nom d'hôte sur lequel le serveur MySQL est installé. S'il est installé sur la même machine où vous exécutez le code Java, vous pouvez simplement l'utiliser localhost. Il peut également s'agir d'une adresse IP comme 127.0.0.1. Si vous rencontrez des problèmes de connectivité et que vous les utilisez 127.0.0.1au lieu de les localhostrésoudre, vous avez un problème dans votre configuration réseau / DNS / hôtes.

    • port: Le port TCP / IP sur lequel le serveur MySQL écoute. C'est par défaut 3306.

    • databasename: Nom de la base de données à laquelle vous souhaitez vous connecter. Voilà javabase.

    L'URL finale devrait donc ressembler à:

    jdbc: mysql: // localhost: 3306 / javabase
  6. Testez la connexion à MySQL en utilisant Java . Créez une classe Java simple avec unemain()méthode pour tester la connexion.

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

    Si vous obtenez un SQLException: No suitable driver, cela signifie que le pilote JDBC n'a pas du tout été chargé automatiquement ou que l'URL JDBC est incorrecte (c'est-à-dire qu'elle n'a été reconnue par aucun des pilotes chargés). Normalement, un pilote JDBC 4.0 doit être chargé automatiquement lorsque vous le déposez simplement dans le chemin de classe d'exécution. Pour exclure l'un et l'autre, vous pouvez toujours le charger manuellement comme ci-dessous:

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

    Notez que l' newInstance()appel n'est pas nécessaire ici. C'est juste pour réparer l'ancien et le buggy org.gjt.mm.mysql.Driver. Explication ici . Si cette ligne apparaît ClassNotFoundException, le fichier JAR contenant la classe de pilote JDBC n'est tout simplement pas placé dans le chemin de classe.

    Notez que vous n'avez pas besoin de charger le pilote à chaque fois avant de vous connecter. Une seule fois au démarrage de l'application suffit.

    Si vous obtenez un SQLException: Connection refusedou Connection timed outou un MySQL spécifique CommunicationsException: Communications link failure, cela signifie que la base de données n'est pas accessible du tout. Cela peut avoir une ou plusieurs des causes suivantes:

    1. L'adresse IP ou le nom d'hôte dans l'URL JDBC est incorrect.
    2. Le nom d'hôte dans l'URL JDBC n'est pas reconnu par le serveur DNS local.
    3. Le numéro de port est manquant ou incorrect dans l'URL JDBC.
    4. Le serveur DB est en panne.
    5. Le serveur DB n'accepte pas les connexions TCP / IP.
    6. Le serveur de base de données n'a plus de connexions.
    7. Quelque chose entre Java et DB bloque les connexions, par exemple un pare-feu ou un proxy.

    Pour résoudre l'un ou l'autre, suivez les conseils suivants:

    1. Vérifiez-les et testez-les avec ping.
    2. Actualisez le DNS ou utilisez plutôt l'adresse IP dans l'URL JDBC.
    3. Vérifiez-le sur la base my.cnfde la base de données MySQL.
    4. Démarrez la base de données.
    5. Vérifiez si mysqld est démarré sans le --skip-networking option.
    6. Redémarrez la base de données et corrigez votre code en conséquence pour qu'il ferme les connexions finally.
    7. Désactivez le pare-feu et / ou configurez le pare-feu / proxy pour autoriser / transférer le port.

    Notez que la fermeture du Connectionest extrêmement importante. Si vous ne fermez pas les connexions et continuez à en obtenir beaucoup en peu de temps, la base de données risque de manquer de connexions et votre application risque de se casser. Acquérir toujours le Connectiondans une try-with-resourcesdéclaration . Ou si vous n'êtes pas encore sur Java 7, fermez-le explicitement dans finallyun try-finallybloc. La fermeture finallyest juste pour s'assurer qu'elle se ferme également en cas d'exception. Cela vaut également pour Statement, PreparedStatementet ResultSet.

C'était tout pour les problèmes de connectivité. Vous pouvez trouver ici un didacticiel plus avancé sur le chargement et le stockage d'objets de modèle Java complets dans une base de données à l'aide d'une classe DAO de base.


L'utilisation d'un modèle Singleton pour la connexion DB est une mauvaise approche. Voir entre autres questions: http://stackoverflow.com/q/9428573/ . Il s'agit d'une erreur de démarrage n ° 1.

BalusC
la source
39

Initialiser les constantes de la base de données

Créez un nom d'utilisateur, un mot de passe, une URL et des pilotes de base de données de propriétés constantes, une limite d'interrogation, etc.

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

Initialiser la connexion et les propriétés

Une fois la connexion établie, il est préférable de la stocker à des fins de réutilisation.

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

Créer des propriétés

L'objet de propriétés contient les informations de connexion, vérifiez si elles sont déjà définies.

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

Connectez la base de données

Connectez-vous maintenant à la base de données en utilisant les constantes et les propriétés initialisées.

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

Déconnectez la base de données

Une fois que vous avez terminé les opérations de base de données, fermez simplement la connexion.

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

Tout ensemble

Utilisez cette classe MysqlConnectdirectement après avoir changé nom_base_de_données, nom d'utilisateur et mot de passe, etc.

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

Comment utiliser?

Initialisez la classe de base de données.

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

Quelque part ailleurs dans votre 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();
}

C'est tout :) Si quelque chose à améliorer, éditez-le! J'espère que cela vous sera utile.

Madan Sapkota
la source
Mark, chaque classe doit-elle maintenir sa propre instance distincte de MysqlConnect ouverte à tout moment - en supposant qu'elle ait besoin d'interagir avec les données? Je me demande simplement comment cette configuration fonctionne entre les classes.
Michael Sims
à la place de com.mysql.jdbc.Drivercela jdbc:mysql://localhost:3306/stocksdevrait être utilisé car le premier est obsolète.
Chaudhry Waqas
Si vous allez câbler le nom de compte, le mot de passe, le nom de la base de données, etc., cette méthode est très maladroite. Mettez simplement tous ces détails dans la chaîne d'URL JDBC. (Y compris la taille de la piscine ...)
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);
heffaklump
la source
quelle est votre base de données ici? nom de la base de données?
Koray Tugay
newInstance () n'est pas nécessaire. C'est ça?
Mohamed Ennahdi El Idrissi
Nan. Ce n'est pas le cas. Et depuis Java 6, toute cette approche est obsolète. Et le nom de la classe de conducteur a changé et ....
Stephen C
12

Voici le minimum dont vous avez besoin pour extraire des données d'une base de données 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();

Ajoutez la gestion des exceptions, la configuration, etc. au goût.

Kilian Foth
la source
3
pourquoi as-tu besoin Class.forName(...).newInstance()?
Don Cheadle
5
@mmcrae Vous n'avez pas, depuis 2007.
Marquis de Lorne
3

Connexion MySQL JDBC avec 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);
}
AJC
la source
2

vous devez avoir le pot de connecteur mysql dans votre chemin de classe.

en Java JDBC API fait tout avec des bases de données. en utilisant JDBC, nous pouvons écrire des applications Java pour
1. Envoyer des requêtes ou mettre à jour SQL vers DB (n'importe quelle base de données relationnelle) 2. Récupérer et traiter les résultats depuis DB

avec ci-dessous trois étapes, nous pouvons récupérer des données de n'importe quelle base de données

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");
}
kapil das
la source
2

Code court et doux.

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

Pour 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();
}
KhiLan PaTeL
la source
1

ConnectionJ'utilisais il y a quelque temps, cela ressemblait à la façon la plus simple, mais il y avait aussi une recommandation de faire une ifdéclaration - exactement

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

Ou quelque chose comme ça :)

Il y a probablement un cas, alors que getConnectionpeut revenir null :)

xxxvodnikxxx
la source
1

Vous pouvez voir toutes les étapes pour connecter la base de données MySQL à partir d'une application Java ici . Pour les autres bases de données, il vous suffit de changer le pilote à la première étape uniquement. Veuillez vous assurer que vous fournissez le bon chemin d'accès à la base de données et le nom d'utilisateur et le mot de passe corrects.

Visitez http://apekshit.com/t/51/Steps-to-connect-Database-using-JAVA

Jwalant
la source
1
COMMENT
  • Pour configurer le pilote pour exécuter un échantillon rapide
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
  • Pour configurer le CLASSPATH

Méthode 1: définissez la variable CLASSPATH.

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

Dans la commande ci-dessus, j'ai défini le CLASSPATH sur le dossier actuel et le fichier mysql-connector-java-VERSION.jar. Ainsi, lorsque la java MyClassFilecommande est exécutée, le lanceur d'application Java essaiera de charger toute la classe Java dans CLASSPATH. Et il a constaté que les Driveerreurs class => BOOM avaient disparu.

Méthode 2:

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

Remarque: Class.forName ("com.mysql.jdbc.Driver"); Ceci est déconseillé en ce moment 2019 Avr.

J'espère que cela peut aider quelqu'un!

Nhat Dinh
la source
-1

Connexion JDBC 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");  
Sarat Chandra
la source
-1

Télécharger le pilote JDBC

Lien de téléchargement (sélectionnez une plate-forme indépendante): https://dev.mysql.com/downloads/connector/j/

Déplacer le pilote JDBC vers le lecteur C

Décompressez les fichiers et accédez au lecteur C: \. Votre chemin de conducteur devrait être commeC:\mysql-connector-java-8.0.19\mysql-connector-java-8.0.19

Exécutez votre 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);
        }

    }  

}

entrez la description de l'image ici

Chew Zai
la source
-2

Petit code

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;
    }
}
Corrupted_S.K
la source