Dernière modification : 23/08/2022

Mémo JDBC (Java Database Connectivity)

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.

1. Introduction

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 :

  • Type 1 : mapping vers un autre API d'accès aux données, comme par exemple JDBC-ODBC
  • Type 2 : implémentation utilisant les bibliothèques côté client de la base de données cible
  • Type 3 : utilisation d'un middleware en vue de convertir les appels JDBC en appels spécifiques à la base de données
  • Type 4 : connection direct à une base de données en convertissant les appels JDBC en appels spécifiques à la base de données

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.

2. Connexion à la base de données

2.1 Préparation des pilotes

Pour cet article nous utiliserons une base de données PostegreSQL.

Dans le fichier pom.xml, insérer la dépendance suivante :


	org.postgresql
	postgresql
	42.2.18

Enregistrer le pilote via la commande suivante (optionel depuis java 1.6) :

Class.forName("org.postgresql.Driver");

2.2 Création de la connexion

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.

3. Exécution d'une requête SQL

3.1 Statement

L'interface Statement contient les méthodes essentielles pour l'exécution des commandes SQL. Il dispose des méthodes suivantes :

  • executeQuery () pour les requêtes SELECT
  • executeUpdate () pour mettre à jour les données ou la structure de la base de données
  • execute () peut être utilisé dans les deux cas ci-dessus

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.

3.2 PreparedStatement

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.

4. Parser les données reçus

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

5. Fermer la ressource

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).