W3docs

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 interfacesConnection, 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 :

InterfaceRôle
DriverManagerTrouve un driver pour votre URL et renvoie une Connection
ConnectionUne session active avec la base de données ; la fabrique d'instructions
StatementEnvoie une chaîne SQL fixe
PreparedStatementEnvoie un modèle SQL paramétré (la valeur par défaut sûre)
CallableStatementInvoque une procédure stockée
ResultSetUn curseur sur les lignes renvoyées par une requête
SQLExceptionL'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.TypesVARCHAR, 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.

java— editable, runs on the server

Ce qu'il faut retenir de l'exécution :

  • getConnection est le point d'entrée unique, et il est médiatisé par DriverManager. Vous ne faites jamais un new sur 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 est 0.
  • Quand aucun driver ne revendique l'URL, JDBC ne retourne pas null ni ne se bloque — il lève une SQLException avec le message 'No suitable driver found'. Chaque méthode JDBC signale les erreurs de cette façon, c'est pourquoi SQLException est 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.Types sont de simples ints (VARCHAR vaut 12, INTEGER vaut 4). C'est ainsi que l'API nomme les types SQL indépendamment de toute base de données, et vous les passerez à setNull et registerOutParameter dans 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.sql sans 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.

Pratique

Pratique
Dans un programme JDBC typique, pourquoi le code de votre application est-il écrit contre des interfaces comme Connection et ResultSet plutôt que des classes concrètes ?
Dans un programme JDBC typique, pourquoi le code de votre application est-il écrit contre des interfaces comme Connection et ResultSet plutôt que des classes concrètes ?
Was this page helpful?