Qu'est-ce que JDBC? Introduction à la connectivité de base de données Java

JDBC (Java Database Connectivity) est l'API Java qui gère la connexion à une base de données, l'émission de requêtes et de commandes et la gestion des ensembles de résultats obtenus à partir de la base de données. Sorti dans le cadre de JDK 1.1 en 1997, JDBC a été l'un des premiers composants développés pour la couche de persistance Java.

JDBC a été initialement conçu comme une API côté client, permettant à un client Java d'interagir avec une source de données. Cela a changé avec JDCB 2.0, qui comprenait un package optionnel prenant en charge les connexions JDBC côté serveur. Chaque nouvelle version de JDBC depuis lors a présenté des mises à jour à la fois du package côté client ( java.sql) et du package côté serveur ( javax.sql). JDBC 4.3, la version la plus récente à ce jour, a été publiée dans le cadre de Java SE 9 en septembre 2017.

Cet article présente un aperçu de JDBC, suivi d'une introduction pratique à l'utilisation de l'API JDBC pour connecter un client Java à SQLite, une base de données relationnelle légère.

Comment fonctionne JDBC

Développé comme une alternative à l'API ODBC (Open Database Connectivity) basé sur C, JDBC propose une interface de niveau programmation qui gère les mécanismes des applications Java communiquant avec une base de données ou un SGBDR. L'interface JDBC se compose de deux couches:

  1. L'API JDBC prend en charge la communication entre l'application Java et le gestionnaire JDBC.
  2. Le pilote JDBC prend en charge la communication entre le gestionnaire JDBC et le pilote de base de données.

JDBC est l'API commune avec laquelle le code de votre application interagit. En dessous se trouve le pilote compatible JDBC pour la base de données que vous utilisez.

La figure 1 est une vue d'ensemble de l'architecture de JDBC dans la couche de persistance Java.

JavaWorld /

Utilisation de JDBC pour se connecter à une base de données

L'un des avantages de la programmation dans l'écosystème Java est que vous trouverez probablement un connecteur de base de données JDBC stable pour la base de données de votre choix. Dans ce tutoriel, nous utiliserons SQLite pour apprendre à connaître JDBC, principalement parce qu'il est si facile à utiliser.

Les étapes de connexion à une base de données avec JDBC sont les suivantes:

  1. Installez ou localisez la base de données à laquelle vous souhaitez accéder.
  2. Incluez la bibliothèque JDBC.
  3. Assurez-vous que le pilote JDBC dont vous avez besoin se trouve sur votre chemin de classe.
  4. Utilisez la bibliothèque JDBC pour obtenir une connexion à la base de données.
  5. Utilisez la connexion pour émettre des commandes SQL.
  6. Fermez la connexion lorsque vous avez terminé.

Nous allons parcourir ces étapes ensemble.

Recherche d'un pilote JDBC

Pour trouver un pilote pour la base de données que vous souhaitez utiliser, effectuez simplement une recherche Web pour votre base de données et JDBC. Par exemple, taper " mysql jdbc driver" fera apparaître un pilote pour MySQL. Je vous mets au défi de trouver une base de données compatible Java sans pilote JDBC!

Étape 1. Téléchargez et installez SQLite

SQLite est une base de données très compacte. Il n'est pas destiné à une utilisation en production, mais constitue un excellent choix pour essayer rapidement des choses. SQLite utilise un fichier comme base de données fonctionnelle, sans nécessiter aucune installation de service ou de démon.

Pour commencer avec cette démo, allez-y et téléchargez l'exemple de base de données SQLite. Décompressez le .dbfichier et enregistrez-le dans un endroit que vous n'oublierez pas.

Ce fichier contient à la fois une base de données fonctionnelle basée sur des fichiers et un exemple de schéma et de données que nous pouvons utiliser.

SQL et JDBC

NoSQL est devenu populaire au cours de la dernière décennie, mais les bases de données relationnelles restent le type de banque de données le plus couramment utilisé. Une base de données relationnelle est un référentiel structuré composé de tables avec des colonnes et des lignes. SQL (Structured Query Language) est le langage utilisé par les architectes de données pour créer, lire, mettre à jour et supprimer de nouveaux enregistrements dans une base de données relationnelle. JDBC est une couche d'adaptateur de Java à SQL: il offre aux développeurs Java une interface commune pour se connecter à une base de données, émettre des requêtes et des commandes et gérer les réponses.

Étape 2. Importez JDBC dans votre application Java

Nous pourrions faire notre codage dans un IDE, mais coder directement dans un éditeur de texte démontrera mieux la simplicité de JDBC. Pour commencer, vous aurez besoin d'une installation JDK compatible pour votre système d'exploitation.

En supposant que les outils de développement de la plate-forme Java soient installés, nous pouvons commencer par créer un programme Java simple. Dans votre éditeur de texte, collez le code indiqué dans la liste 1. Appelez ce fichier WhatIsJdbc.java.

Listing 1. Un programme Java simple

 class WhatIsJdbc{ public static void main(String args[]){ System.out.println("Hello JavaWorld"); } } 

Maintenant compiler le code en entrant la commande: javac WhatIsJdbc.java. La compilation produira le WhatIsJdbc.classfichier. Exécutez ce fichier à partir de la ligne de commande avec l'appel: java WhatIsJdbc.

[Voir «Qu'est-ce que le JDK? Présentation du kit de développement Java» pour plus d'informations sur l'interaction avec le JDK sur la ligne de commande.]

Une fois que vous avez un programme Java de base, vous pouvez inclure les bibliothèques JDBC. Collez le code de la liste 2 en tête de votre programme Java simple.

Listing 2. Importations JDBC

 import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.ResultSet; import java.sql.Statement; 

Chacune de ces importations donne accès à une classe qui facilite la connexion à la base de données Java standard:

  • Connection représente la connexion à la base de données.
  • DriverManagerobtient la connexion à la base de données. (Une autre option est DataSource, utilisée pour le regroupement de connexions.)
  • SQLException gère les erreurs SQL entre l'application Java et la base de données.
  • ResultSetet Statementmodélisez les ensembles de résultats de données et les instructions SQL.

Nous verrons chacun d'eux en action sous peu.

Étape 3. Ajoutez le pilote JDBC à votre chemin de classe

Ensuite, vous allez ajouter le pilote SQLite à votre chemin de classe. Un pilote JDBC est une classe qui implémente l'API JDBC pour une base de données spécifique.

Téléchargez le pilote SQLite depuis GitHub. Assurez-vous d'obtenir le .jarfichier le plus récent et de le stocker dans un endroit dont vous vous souviendrez.

The next time you execute your Java program, you will pull that .jar file in via the classpath. There are several ways to set the classpath. Listing 3 shows how to do it using a command-line switch.

Listing 3. Executing SQLite driver on the Java classpath

 java.exe -classpath /path-to-driver/sqlite-jdbc-3.23.1.jar:. WhatIsJdbc 

Notice that we've set the classpath to point at the driver and the local directory; this way Java will still find our class file.

Step 4. Obtain a database connection

The classpath now has access to the driver. Now, change your simple Java application file to look like the program in Listing 4.

Listing 4. Using the JDBC Connection class to connect to SQLite

 import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.ResultSet; import java.sql.Statement; class WhatIsJdbc{ public static void main(String[] args) { Connection conn = null; try { String url = "jdbc:sqlite:path-to-db/chinook/chinook.db"; conn = DriverManager.getConnection(url); System.out.println("Got it!"); } catch (SQLException e) { throw new Error("Problem", e); } finally { try { if (conn != null) { conn.close(); } } catch (SQLException ex) { System.out.println(ex.getMessage()); } } } } 

Compile and execute this code. Assuming all goes well, you will get an affirming message.

No suitable driver found?

If you've received an error that looks like "No suitable driver found for jdbc:sqlite," then you need to revisit the classpath and make sure it points to the driver you downloaded. Failed driver connection is the most common stumbling block for beginners using JDBC. Don't sweat it; just fix it.

Now we're ready for some SQL commands.

Step 5. Query the database

With the live connection object in hand, we can do something useful, like querying the database. Listing 5 shows how to query SQLite using the JDBC Connection and Statement objects.

Listing 5. Querying the database with JDBC

 import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.ResultSet; import java.sql.Statement; class WhatIsJdbc{ public static void main(String[] args) { Connection conn = null; try { String url = "jdbc:sqlite:path-to-db-file/chinook/chinook.db"; conn = DriverManager.getConnection(url); Statement stmt = null; String query = "select * from albums"; try { stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery(query); while (rs.next()) { String name = rs.getString("title"); System.out.println(name); } } catch (SQLException e ) { throw new Error("Problem", e); } finally { if (stmt != null) { stmt.close(); } } } catch (SQLException e) { throw new Error("Problem", e); } finally { try { if (conn != null) { conn.close(); } } catch (SQLException ex) { System.out.println(ex.getMessage()); } } } } 

In Listing 5 we use our Connection object to obtain a Statement object: conn.createStatement(). We then use this object to execute an SQL query: stmt.executeQuery(query).

The executeQuery command returns a ResultSet object, which we then use to iterate over the data with while (rs.next()). In this example, you should see the album titles we've queried on as output.

Notice that we also closed the connection, via a call to conn.close().

Network connections with JDBC

The database connection string in Listing 5 is for a local connection: jdbc:sqlite:path-to-db-file/chinook/chinook.db. To access the database via a network, the connection string would need to include the network URL and (usually) credentials for accessing it.

Doing more with JDBC

So far we've covered the basics of using JDBC to connect to a database and issue SQL commands. While Statementss and ResultSets work well for common scenarios, you'll likely need additional options for larger or more complex applications. Fortunately, the JDBC library continues evolving to meet most database access needs.

PreparedStatements

One easy way to increase the flexibility of your code is to replace the Statement class with PreparedStatement, as shown in Listing 6.

Listing 6. Using JDBC PreparedStatements

 String prepState = "insert into albums values (?, ?);"; PreparedStatement prepState = connection.prepareStatement(sql); prepState.setString(1, "Uprising"); prepState.setString(2, "Bob Marley and the Wailers "); int rowsAffected = preparedStatement.executeUpdate(); 

PreparedStatement replaces Statement's hard-coded values with question marks (?). Using PreparedStatements optimizes your code for reuse: a PreparedStatement is compiled only once, and can then be reused with a variety of parameters. As your code base grows, you simply insert new values into the statement, instead of hacking the string object itself.

Batch updates

Whenever an application has several updates to issue, doing them in batches can greatly benefit performance. The essence of batching is to take the multiple updates and collect them together, then issue them all at once. Listing 7 uses JDBC's batch methods to perform a batch update of several PreparedStatements.

Listing 7. Batching with PreparedStatement

 prepState.setString(1, "Uprising"); prepState.setString(2, "Bob Marley and the Wailers"); preparedStatement.addBatch(); prepState.setString(1, "Wildflowers"); prepState.setString(2, "Tom Petty and the Heartbreakers"); preparedStatement.addBatch(); int[] rowsAffected = preparedStatement.executeBatch(); 

JDBC transactions

Transactions in relational databases allow for a set of updates to be wrapped in an interaction that either succeeds or fails altogether. The basics of using a transaction via JDBC are to tell the system to turn off auto-commit, and then manually tell the system to commit when you are done. By default, auto-commit is on, which means whenever an executeUpdate or executeInsert is run, the command is committed.

Listing 8 shows a small slice of a JDBC transaction.

Listing 8. JDBC transactions

 connection.setAutoCommit(false); // Use executeUpdate multiple times connection.commit(); 

When connection.commit() is encountered, all the updates wrapped inside will be attempted, and if any fail, they all will be rolled back.

There are many more features in JDBC 4.3 worth exploring, including using CallableStatement for stored procedures, using DataSource objects for improved application performance (especially via connection pooling), and converting a JDBC ResultSet to a Java Stream.

Database-specific features

Although every JDBC-compliant database offers the same core features for connecting and interacting with a database via SQL, some databases do more than others. As an example, Oracle DB offers result caching, which is not required by the JDBC specification. Here's an example:

 conn.prepareStatement ("select /*+ result_cache */ * from employees where employee_id < : 1"); 

This example is taken from the documentation for Oracle's JDBC OCI Driver.

Conclusion

JDBC is one of Java's oldest APIs, providing an easy-to-use solution for one of the perennial needs of Java application development. Knowing just the few JDBC calls demonstrated in this article will get you started using JDBC to connect to virtually any database. Once you've got those commands down, you can begin to explore some of the more sophisticated options that have been built into JDBC.

Bien que JDBC soit suffisant pour des applications plus simples, la plupart des développeurs se tourneront éventuellement vers l'API Java Persistence (JPA) afin de développer une couche d'accès aux données plus formelle. JPA nécessite plus de travail en amont et une compréhension plus sophistiquée de l'architecture de l'application, mais il vous offre une couche d'accès aux données plus cohérente, isolée et bien définie. Pour en savoir plus sur le développement de la couche de persistance des données pour vos applications Java, consultez le compagnon de cet article, "Qu'est-ce que JPA? Introduction à l'API de persistance Java".

Cette histoire, "Qu'est-ce que JDBC? Introduction à la connectivité de base de données Java" a été initialement publiée par JavaWorld.