Introduction à Java JDBC
Ce qu'est JDBC, comment il abstrait l'accès aux bases de données en Java, et l'architecture de l'API JDBC.
JDBC (Java Database Connectivity) est l'API standard pour communiquer avec une base de données relationnelle depuis Java. Elle réside dans les packages java.sql et javax.sql et vous offre une manière neutre vis-à-vis du fournisseur d'ouvrir une connexion, d'envoyer du SQL et de lire des résultats — que la base de données soit PostgreSQL, MySQL, Oracle, SQL Server ou un moteur embarqué comme H2. Apprenez l'API une fois, et seule l'URL de connexion change lorsque vous changez de base de données.
L'idée principale : une couche mince et uniforme sur de nombreuses bases de données
Votre code est écrit contre des interfaces — Connection, Statement, ResultSet. Les classes concrètes qui les implémentent sont fournies dans un JAR de driver fourni par le vendeur. Le rôle de JDBC est de maintenir votre code du côté interface de cette frontière, de sorte qu'un changement de base de données soit une modification de configuration, et non une réécriture.
Les types fondamentaux
Quelques interfaces apparaissent dans presque tous les programmes JDBC :
| Interface | Rôle |
|---|---|
DriverManager | Trouve un driver pour votre URL et renvoie une Connection |
Connection | Une session active avec la base de données ; la fabrique d'instructions |
Statement | Envoie une chaîne SQL fixe |
PreparedStatement | Envoie un modèle SQL paramétré (la valeur par défaut sûre) |
CallableStatement | Invoque une procédure stockée |
ResultSet | Un curseur sur les lignes renvoyées par une requête |
SQLException | L'exception vérifiée que tout appel JDBC peut lever |
La structure de tout programme JDBC
Presque tous les accès aux données suivent les cinq mêmes étapes. Voici un exemple contre une base de données en direct, en utilisant try-with-resources pour que chaque ressource se ferme automatiquement :
String url = "jdbc:postgresql://localhost:5432/shop";
String sql = "SELECT id, name FROM product WHERE price < ?";
try (Connection conn = DriverManager.getConnection(url, "app", "secret");
PreparedStatement ps = conn.prepareStatement(sql)) {
ps.setBigDecimal(1, new BigDecimal("9.99"));
try (ResultSet rs = ps.executeQuery()) {
while (rs.next()) {
System.out.println(rs.getInt("id") + " " + rs.getString("name"));
}
}
}Soit : (1) nommer une base de données avec une URL, (2) ouvrir une Connection, (3) créer une instruction, (4) l'exécuter, (5) lire le ResultSet — puis fermer tout dans l'ordre inverse. Le reste de cette partie développe chaque étape.
Un système de types neutre vis-à-vis du fournisseur
Les colonnes SQL ne sont pas des types Java. JDBC fait le pont entre les deux avec les constantes java.sql.Types — VARCHAR, INTEGER, TIMESTAMP, et ainsi de suite — et un ensemble parallèle de méthodes getXxx/setXxx. Vous vous battez rarement contre ce mappage, mais c'est la raison pour laquelle une colonne DATE effectue un aller-retour vers java.sql.Date et une colonne NUMERIC vers BigDecimal.
Un exemple concret : la porte d'entrée, sans driver installé
Ce programme ne se connecte à rien — il inspecte le mécanisme JDBC lui-même. Il demande à DriverManager quels drivers sont enregistrés, montre le contrat exact obtenu lorsqu'aucun ne correspond à une URL, et affiche quelques-unes des constantes de type sur lesquelles l'API est construite.
Ce qu'il faut retenir de l'exécution :
getConnectionest le point d'entrée unique, et il est médiatisé parDriverManager. Vous ne faites jamais unnewsur une connexion — vous nommez une base de données avec une URL et JDBC route la requête. L'environnement d'exécution ici n'a aucun driver enregistré, donc le compteur est0.- Quand aucun driver ne revendique l'URL, JDBC ne retourne pas
nullni ne se bloque — il lève uneSQLExceptionavec le message 'No suitable driver found'. Chaque méthode JDBC signale les erreurs de cette façon, c'est pourquoiSQLExceptionest vérifiée et doit être gérée partout. - L'exception portait un SQLState (
08001, la classe standard 'client unable to establish connection'). Les codes SQLState sont portables entre les fournisseurs, contrairement aux codes d'erreur entiers, qui sont spécifiques au fournisseur. - Les constantes
java.sql.Typessont de simplesints (VARCHARvaut 12,INTEGERvaut 4). C'est ainsi que l'API nomme les types SQL indépendamment de toute base de données, et vous les passerez àsetNulletregisterOutParameterdans les chapitres suivants. - Rien ici n'a nécessité une base de données. L'API JDBC fait partie du JDK ; seul le driver est externe. Cette séparation est toute la conception — votre code compile et raisonne sur les types
java.sqlsans aucune base de données en vue.
Quand utiliser JDBC
JDBC est le fondement sur lequel repose tout outil de données Java de niveau supérieur. Les mappeurs objet-relationnel comme Hibernate ou JPA, les constructeurs de requêtes comme jOOQ, et les assistants plus légers comme JdbcTemplate de Spring appellent tous JDBC en coulisse. Utilisez JDBC directement quand vous voulez un contrôle total sur le SQL, une empreinte de dépendances minimale, ou que vous apprenez comment cette couche fonctionne réellement. Utilisez un ORM quand vous préférez mapper des lignes vers des objets et éviter le code répétitif. Dans tous les cas, les concepts de cette partie — connexions, instructions, ensembles de résultats et transactions — sont ce que ces outils gèrent pour vous.
Ce que couvre le reste de cette partie
Charger et choisir des drivers, ouvrir et configurer une Connection, les trois types d'instructions (Statement, PreparedStatement, et CallableStatement), et naviguer dans un ResultSet, ainsi que les transactions, les mises à jour par lot et la lecture des métadonnées de la base de données. Le prochain chapitre commence là où toute connexion commence : le driver.