L'interface de programmation JDBC (Java Database Connectivity) permet aux applications Java d'accéder par le biais d'une interface commune à des sources de données. Il peut s'agir d'une base de données relationnelle et des pilotes JDBC sont disponibles pour tous les systèmes connus de bases de données relationnelles.
Dans cet article nous allons voir comment utiliser cette interface JDBC avec Java.
Un pilote JDBC est une implémentation d'API JDBC. Il est utilisée pour se connecter à une base de données. Il existe plusieurs types de pilotes JDBC :
Le type le plus couramment utilisé est le quatrième, car il présente l'avantage d'être indépendant de la plate-forme . L'inconvénient d'une connexion directe à un serveur de base de données, même si elle offre de meilleures performances par rapport aux autres types est qu'elle est spécifique à la base de données puisque chaque base de données a son propre protocole spécifique.
Pour cet article nous utiliserons une base de données PostegreSQL.
Dans le fichier pom.xml, insérer la dépendance suivante :
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>42.2.18</version>
</dependency>
Enregistrer le pilote via la commande suivante (optionel depuis java 1.6) :
Class.forName("org.postgresql.Driver");
Remplacer dans le code ci-dessous les variables IP, port, nomBaseDeDonnees, login et motDePasse par les informations correspondantes à la base de donnéees :
try (Connection connection = DriverManager.getConnection("jdbc:postgresql://IP:port/nomBaseDeDonnees", "login", "motDePasse")) {
}
Remarque : En général, le port par défaut est le 5432. Pour une IP local, remplacer par 127.0.0.1.
Attention : La base de données doit être créée au préalable. Sinon une erreur lors de la connexion sera levée.
L'interface Statement contient les méthodes essentielles pour l'exécution des commandes SQL. Il dispose des méthodes suivantes :
Création d'une instance Statment :
try (Statement stmt = connection.createStatement()) {
}
Exécution d'une requête de type SELECT (DQL) :
final String selectSql = "SELECT * FROM ll_content";
try (ResultSet resultSet = stmt.executeQuery(selectSql)) {
}
Exécution d'une requête de type INSERT, UPDATE ou DELETE :
final String selectSql = "INSERT INTO public.ll_category VALUES (1, 'Java', 'Java');";
stmt.executeUpdate(selectSql);
Remarque : La méthode renvoie le nombre de lignes affectées par la requête (DML) ou 0 si celle-ci met à jour la structure de la base de données (DDL).
Exécution d'une requête lorsque le résultat est inconnu :
final String selectSql = "INSERT INTO public.ll_category VALUES (1, 'Java', 'Java');";
stmt.execute(selectSql);
System.out.println("Nombre de ligne affecté : " + stmt.getUpdateCount());
Via la méthode getUpdateCount il est possible de récupérer le nombre de lignes affectées par la méthode execute.
Afin de fournir des paramètres et d'éviter des failles du type injection SQL, il est important d'utiliser les PreparedStatement.
final String selectSql = "SELECT * FROM ll_content where id = ?";
try (PreparedStatement stmt = connection.prepareStatement(selectSql)) {
stmt.setInt(1, 1);
try (ResultSet resultSet = stmt.executeQuery()) {
}
}
Le paramètre à inséré est fourni par le symbole "?" et est remplacé par la valeur "1" via la méthode setInt. Le premier paramètre de setInt est le numéro du paramètre et le second est la valeur à attribuer.
Remarque : D'autres méthodes que setInt existent afin de préparer la requête, comme par exemple setString ou encore setDouble.
Une fois la requête exécutée, la récupération des données est réalisée via le ResultSet retourné. Il est nécessaire d'itérer sur le ResultSet et de récupérer les données via les méthodes getInt, getString ou encore getDouble par exemple. Le paramètre attendue est le nom de la colonne à extraire. Exemple :
try (ResultSet resultSet = stmt.executeQuery()) {
while (resultSet.next()) {
System.out.println(resultSet.getInt("id"));
}
}
Si l'ouverture d'une connexion JDBC n'a pas été effectuée via un try-with-resources, alors il est nécessaire de le fermer manuellement. Pour ce faire, utiliser les méthodes closes des instances ouvertes (Connexion, ResultSet, Statements, PreparedStatements etc).