Comment se connecter à une base de données avec JDBC en Java ?

La première étape pour faire quoi que ce soit avec une base de données est de s’y connecter. D’abord, nous vous montrons comment construire l’URL JDBC. Ensuite, nous vous montrons comment l’utiliser pour obtenir une Connection à la base de données.

Construction d’une URL JDBC

Pour accéder à un site web, vous devez connaître son URL. Pour accéder à votre email, vous devez connaître votre nom d’utilisateur et mot de passe. JDBC n’est pas différent. Pour accéder à une base de données, vous devez connaître ces informations à son sujet.

Contrairement aux URL web, les URL JDBC ont des formats variés. Elles ont trois parties en commun. La première partie est toujours la même. C’est le protocole jdbc. La deuxième partie est le sous-protocole, qui est le nom de la base de données, comme hsqldb, mysql, ou postgres. La troisième partie est le sous-nom, qui est un format spécifique à la base de données. Des deux-points (:) séparent les trois parties.

Le sous-nom contient généralement des informations sur la base de données comme son emplacement et/ou son nom. La syntaxe varie. Vous devez connaître les trois parties principales. Vous n’avez pas besoin de mémoriser les formats de sous-noms. Ouf! Vous avez déjà vu une telle URL :

jdbc:hsqldb:file:zoo

Notez les trois parties. Elle commence par jdbc, puis vient le sous-protocole hsqldb. Elle se termine par le sous-nom, qui nous indique que nous utilisons le système de fichiers. L’emplacement est alors le nom de la base de données.

D’autres exemples de sous-noms sont présentés ici :

jdbc:postgresql://localhost/zoo
jdbc:oracle:thin:@123.123.123.123:1521:zoo
jdbc:mysql://localhost:3306
jdbc:mysql://localhost:3306/zoo?profileSQL=true

Vous pouvez voir que chacune de ces URL JDBC commence par jdbc, suivi d’un deux-points, suivi du nom du vendeur/produit. Après cela, les URL varient. Remarquez comment elles incluent toutes l’emplacement de la base de données : localhost, 123.123.123.123:1521, et localhost:3306. Notez également que le port est facultatif lors de l’utilisation de l’emplacement par défaut.

Obtenir une Connection à une Base de Données

Il existe deux principales façons d’obtenir une Connection : DriverManager et DataSource. Un DataSource a plus de fonctionnalités que DriverManager. Par exemple, il peut regrouper les connexions ou stocker les informations de connexion à la base de données en dehors de l’application.

La classe DriverManager fait partie du JDK, car c’est une API qui vient avec Java. Elle utilise le modèle de fabrique (factory pattern), ce qui signifie que vous appelez une méthode statique pour obtenir une Connection plutôt que d’appeler un constructeur. Le modèle de fabrique signifie que vous pouvez obtenir n’importe quelle implémentation de l’interface lors de l’appel de la méthode. La bonne nouvelle est que la méthode a un nom facile à retenir : getConnection().

Pour obtenir une Connection depuis la base de données HyperSQL, vous écrivez ce qui suit :

import java.sql.*;
public class TestConnexion {
    public static void main(String[] args) throws SQLException {
        try (Connection conn = 
             DriverManager.getConnection("jdbc:hsqldb:file:zoo")) {
            System.out.println(conn);
        }
    }
}

Nous utilisons une instruction try-with-resources pour nous assurer que les ressources de la base de données sont fermées. Nous couvrirons la fermeture des ressources de base de données plus en détail plus tard dans ce chapitre. Nous lançons également l’exception vérifiée SQLException, ce qui signifie que quelque chose a mal tourné. Par exemple, vous avez peut-être oublié de définir l’emplacement du pilote de base de données dans votre classpath.

En supposant que le programme s’exécute avec succès, il imprime quelque chose comme ceci :

org.hsqldb.jdbc.JDBCConnection@3dfc5fb8

Les détails de la sortie ne sont pas importants. Remarquez simplement que la classe n’est pas Connection. C’est une implémentation du vendeur de Connection.

Il existe également une signature qui prend un nom d’utilisateur et un mot de passe.

import java.sql.*;
public class TestExterne {
    public static void main(String[] args) throws SQLException {
        try (Connection conn = DriverManager.getConnection(
            "jdbc:postgresql://localhost:5432/ocp-book",
            "nomutilisateur",
            "MotDePasse20182")) {
            System.out.println(conn);
        }
    }
}

Notez les trois paramètres qui sont passés à getConnection(). Le premier est l’URL JDBC que vous avez apprise dans la section précédente. Le deuxième est le nom d’utilisateur pour accéder à la base de données, et le troisième est le mot de passe pour accéder à la base de données. Il va sans dire que notre mot de passe n’est pas MotDePasse20182. De plus, ne mettez pas votre mot de passe dans du vrai code. C’est une pratique horrible. Chargez-le toujours à partir d’une sorte de configuration, idéalement une qui garde la valeur stockée cryptée.

Si vous exécutiez ceci avec le JAR du pilote Postgres, il imprimerait quelque chose comme ceci :

org.postgresql.jdbc4.Jdbc4Connection@eed1f14

Encore une fois, notez qu’il s’agit d’une classe d’implémentation spécifique au pilote. Vous pouvez le dire à partir du nom du package. Puisque le package est org.postgresql.jdbc4, il fait partie du pilote PostgreSQL.

La bonne chose à propos du modèle de fabrique est qu’il prend en charge la logique de création d’une classe pour vous. Vous n’avez pas besoin de connaître le nom de la classe qui implémente Connection, et vous n’avez pas besoin de savoir comment elle est créée. Vous êtes probablement un peu curieux, cependant.

DriverManager parcourt tous les pilotes qu’il peut trouver pour voir s’ils peuvent gérer l’URL JDBC. Si oui, il crée une Connection en utilisant ce Driver. Sinon, il abandonne et lance une SQLException.

Vous pourriez voir Class.forName() dans le code. C’était nécessaire avec les anciens pilotes (qui étaient conçus pour les anciennes versions de JDBC) avant d’obtenir une connection.