Connectez Java à une base de données MySQL
Comment vous connectez - vous à une base de données MySQL en Java?
Quand j'essaie, j'obtiens
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
14 answers
DriverManager
est une façon assez ancienne de faire les choses. Le meilleur moyen est d'obtenir un DataSource
, soit en recherchant un conteneur que votre serveur d'applications a déjà configuré pour vous:
Context context = new InitialContext();
DataSource dataSource = (DataSource) context.lookup("java:comp/env/jdbc/myDB");
Ou instancier et configurer un de votre pilote de base de données directement:
MysqlDataSource dataSource = new MysqlDataSource();
dataSource.setUser("scott");
dataSource.setPassword("tiger");
dataSource.setServerName("myDBHost.example.org");
Puis obtenir des connexions à partir de celui-ci, 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();
Voici une explication étape par étape, comment installer MySQL et JDBC et comment l'utiliser:
Téléchargez et installez le serveur MySQL . Faites-le simplement de la manière habituelle. Rappelez - vous le numéro de port chaque fois que vous l'avez modifié. C'est par défaut
3306
.-
Téléchargez le pilote JDBC et placez-le dans classpath, extrayez le fichier ZIP et placez le fichier JAR contenant dans le classpath. Le pilote JDBC spécifique au fournisseur est une implémentation concrète de l'API JDBC (tutoriel ici ).
Si vous utilisez unE comme Eclipse ou Netbeans, vous pouvez l'ajouter au classpath en ajoutant le fichier JAR en tant que Libraryau Build Path 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
-cp
ou-classpath
lors de l'exécution de votre application Java.java -cp .;/path/to/mysql-connector.jar com.example.YourClass
Le
.
est juste là pour ajoutez également le répertoire current au chemin de classe afin qu'il puisse localisercom.example.YourClass
et que le;
soit le séparateur de chemin de classe tel qu'il est dans Windows. Dans Unix et clones:
devrait être utilisé. -
Créer unebase de données dans MySQL . Créons une base de données
javabase
. Vous voulez bien sûr la Domination du monde, alors utilisons UTF-8 aussi.CREATE DATABASE javabase DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;
-
Créer un utilisateur Java et subvention accès. Tout simplement parce que utiliser
root
est une mauvaise pratique.CREATE USER 'java'@'localhost' IDENTIFIED BY 'password'; GRANT ALL ON javabase.* TO 'java'@'localhost' IDENTIFIED BY 'password';
Oui
java
est le nom d'utilisateur etpassword
est le mot de passe ici. -
Déterminer l'URL JDBC. Pour connecter la base de données MySQL en utilisant Java, vous avez besoin d'une URL JDBC dans la syntaxe suivante:
jdbc:mysql://hostname:port/databasename
hostname
: Le nom d'hôte où le serveur MySQL est installé. S'il est installé sur la même machine sur laquelle vous exécutez le code Java, vous pouvez simplement utiliserlocalhost
. Il peut également s'agir d'une adresse IP comme127.0.0.1
. Si vous rencontrez des problèmes de connectivité et que l'utilisation de127.0.0.1
au lieu delocalhost
l'a résolu, vous avez un problème dans votre configuration réseau/DNS/hosts.port
: Le port TCP / IP sur lequel le serveur MySQL écoute. C'est par défaut3306
.databasename
: le nom de La base de données que vous souhaitez vous connecter. C'estjavabase
.
Donc l'URL finale devrait ressembler à:
jdbc:mysql://localhost:3306/javabase
-
Testez le connexion à MySQL en utilisant Java . Créez une classe Java simple avec une méthode
main()
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 runtime classpath. 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); }
Note le
newInstance()
appel est pas nécessaire ici. C'est juste pour réparer l'ancien et le buggyorg.gjt.mm.mysql.Driver
. Explication ici. Si cette ligne lanceClassNotFoundException
, alors 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 connexion. Une seule fois au démarrage de l'application suffit.
Si vous obtenez un
SQLException: Connection refused
ouConnection timed out
ou unCommunicationsException: Communications link failure
spécifique à MySQL, alors cela signifie que le DB n'est pas accessible à tous. Cela peut avoir une ou plusieurs des causes suivantes:- L'adresse IP ou le nom d'hôte dans l'URL JDBC est incorrect.
- Le nom d'hôte dans l'URL JDBC n'est pas reconnu par le serveur DNS local.
- Le numéro de port est manquant ou incorrect dans l'URL JDBC.
- Le serveur DB est en panne.
- DB server n'accepte pas les connexions TCP/IP.
- Le serveur DB n'a plus de connexions.
- 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:
- Vérifiez-les et testez-les avec
ping
. - Actualisez le DNS ou utilisez plutôt l'adresse IP dans l'URL JDBC.
- Vérifiez-le sur la base de
my.cnf
de MySQL DB. - Démarrer la base de données.
- Vérifiez si mysqld est démarré sans le
--skip-networking option
. - Redémarrez la base de données et corrigez votre code en conséquence pour qu'il ferme les connexions dans
finally
. - Désactiver le pare-feu et / ou configurez le pare-feu/proxy pour autoriser/transférer le port.
Notez que la fermeture du
Connection
estextrêmement importante. Si vous ne fermez pas les connexions et continuez à en obtenir beaucoup en peu de temps, la base de données peut manquer de connexions et votre application peut se casser. Toujours acquérir leConnection
dans untry-with-resources
déclaration de. Ou si vous n'êtes pas encore sur Java 7, fermez-le explicitement dansfinally
d'un bloctry-finally
. Fermerfinally
est juste pour assurer qu'il soit fermé aussi en cas d'exception. Cela vaut également pourStatement
,PreparedStatement
etResultSet
.
C'était en ce qui concerne la connectivité. Vous pouvez trouver ici un tutoriel plus avancé sur la façon de charger et de stocker des objets de modèle Java fullworthy 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 / . Ceci est une erreur de démarrage # 1.
Initialiser les constantes de base de données
Créez le nom d'utilisateur, le mot de passe, l'URL et les pilotes de la base de données des propriétés constantes, la 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 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 properties 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;
}
Connecter la base de données
Connectez-vous maintenant à la base de données utilisation des constantes et des 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éconnecter 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 MysqlConnect
directement après avoir changé database_name, 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?
Initialise la classe de base de données.
// !_ note _! this is just init
// it will not create a connection
MysqlConnect mysqlConnect = new MysqlConnect();
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 pour améliorer le modifier! Espérons que cela est utile.
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);
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();
Ajouter la gestion des exceptions, la configuration, etc. goûter.
Connexion JDBC MySQL 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);
}
, Vous devez avoir mysql connector jar dans votre classpath.
En Java, l'API JDBC fait tout avec des bases de données. en utilisant JDBC, nous pouvons écrire des applications Java sur
1. Envoyer des requêtes ou mettre à jour SQL vers DB(toute base de données relationnelle)
2. Récupérer et traiter les résultats de DB
Avec trois étapes ci-dessous, nous pouvons récupérer des données à partir 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");
}
Vous pouvez voir toutes les étapes pour connecter la base de données MySQL à partir de l'application Java ici. D'autres bases de données, il vous suffit de changer le pilote dans la première étape seulement. Assurez-vous de fournir le bon chemin d'accès à la base de données et le nom d'utilisateur et le mot de passe corrects.
Visite http://apekshit.com/t/51/Steps-to-connect-Database-using-JAVA
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();
}
Connection
J'utilisais il y a quelque temps, cela ressemblait au moyen le plus simple, mais il y avait aussi des recommandations à faire là if
déclaration - exactement
Connection con = DriverManager.getConnection(
"jdbc:myDriver:DatabaseName",
dBuserName,
dBuserPassword);
if (con != null){
//..handle your code there
}
Ou quelque chose comme de cette façon:)
Il y a probablement un cas, tandis que getConnection
peut retourner null
:)
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 CHEMIN DE CLASSE
Méthode 1: définit 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 mysql-connector-java-VERSION.fichier jar. Ainsi, lorsque la commande java MyClassFile
est exécutée, java application launcher essaiera de charger toute la classe Java dans CLASSPATH.
Et il a trouvé que les erreurs Drive
class => BOOM avaient disparu.
Méthode 2:
java -cp .:mysql-connector-java-VERSION.jar MyClassFile
Remarque: La Classe.forName ("com.mysql.jdbc.Pilote"); Ceci est obsolète en ce moment 2019 Avr.
J'Espère que cela peut aider quelqu'un!
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");
Code abrégé
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;
}
}
Télécharger le pilote JDBC
Lien de téléchargement (Sélectionnez indépendant de la plate-forme): https://dev.mysql.com/downloads/connector/j/
Déplacer le pilote JDBC vers le lecteur C
Décompressez les fichiers et passez au lecteur C:\. Votre chemin de pilote devrait être comme C:\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);
}
}
}