JDBC - Guide rapide

Qu'est-ce que JDBC?

JDBC signifie Java Dàbase Connectivity, qui est une API Java standard pour la connectivité indépendante de la base de données entre le langage de programmation Java et un large éventail de bases de données.

La bibliothèque JDBC comprend des API pour chacune des tâches généralement associées à l'utilisation de la base de données:

  • Établir une connexion à une base de données

  • Créer des instructions SQL ou MySQL

  • Exécuter ces requêtes SQL ou MySQL dans la base de données

  • Affichage et modification des enregistrements résultants

Prérequis:

Vous devez avoir une bonne compréhension des deux sujets suivants pour apprendre JDBC:

JDBC - Configuration de l'environnement:

Assurez-vous d'avoir effectué la configuration suivante:

  • Installation de base JAVA

  • Installation de base de données SQL ou MySQL

En dehors de ce qui précède, vous devez configurer une base de données que vous utiliseriez pour votre projet. En supposant qu'il s'agit d'EMP et que vous avez créé sur la table des employés dans la même base de données.

Création d'une application JDBC:

Il y a six étapes impliquées dans la création d'une application JDBC que je vais expliquer dans ce tutoriel:

Importez les packages:

Cela nécessite que vous incluiez les packages contenant les classes JDBC nécessaires à la programmation de la base de données. Le plus souvent, utiliser import java.sql. * Suffira comme suit:

//STEP 1. Import required packages
import java.sql.*;

Enregistrez le pilote JDBC:

Cela nécessite que vous initialisiez un pilote afin que vous puissiez ouvrir un canal de communication avec la base de données. Voici l'extrait de code pour y parvenir:

//STEP 2: Register JDBC driver
Class.forName("com.mysql.jdbc.Driver");

Ouvrez une connexion:

Cela nécessite l'utilisation de la méthode DriverManager.getConnection () pour créer un objet Connection, qui représente une connexion physique avec la base de données comme suit:

//STEP 3: Open a connection
//  Database credentials
static final String USER = "username";
static final String PASS = "password";
System.out.println("Connecting to database...");
conn = DriverManager.getConnection(DB_URL,USER,PASS);

Exécutez une requête:

Cela nécessite l'utilisation d'un objet de type Statement ou PreparedStatement pour créer et soumettre une instruction SQL à la base de données comme suit:

//STEP 4: Execute a query
System.out.println("Creating statement...");
stmt = conn.createStatement();
String sql;
sql = "SELECT id, first, last, age FROM Employees";
ResultSet rs = stmt.executeQuery(sql);

Si une instruction SQL UPDATE, INSERT ou DELETE est requise, l'extrait de code suivant est requis:

//STEP 4: Execute a query
System.out.println("Creating statement...");
stmt = conn.createStatement();
String sql;
sql = "DELETE FROM Employees";
ResultSet rs = stmt.executeUpdate(sql);

Extraire les données de l'ensemble de résultats:

Cette étape est requise dans le cas où vous récupérez des données de la base de données. Vous pouvez utiliser la méthode ResultSet.getXXX () appropriée pour récupérer les données du jeu de résultats comme suit:

//STEP 5: Extract data from result set
while(rs.next()){
    //Retrieve by column name
    int id  = rs.getInt("id");
    int age = rs.getInt("age");
    String first = rs.getString("first");
    String last = rs.getString("last");

    //Display values
    System.out.print("ID: " + id);
    System.out.print(", Age: " + age);
    System.out.print(", First: " + first);
    System.out.println(", Last: " + last);
}

Nettoyez l'environnement:

Vous devez explicitement fermer toutes les ressources de base de données plutôt que de vous fier au garbage collection de la JVM comme suit:

//STEP 6: Clean-up environment
rs.close();
stmt.close();
conn.close();

Premier programme JDBC:

Sur la base des étapes ci-dessus, nous pouvons avoir un exemple de code consolidé suivant que nous pouvons utiliser comme modèle lors de l'écriture de notre code JDBC:

Cet exemple de code a été écrit en fonction de l'environnement et de la configuration de la base de données effectuée dans le chapitre Environnement.

//STEP 1. Import required packages
import java.sql.*;

public class FirstExample {
   // JDBC driver name and database URL
   static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";  
   static final String DB_URL = "jdbc:mysql://localhost/EMP";

   //  Database credentials
   static final String USER = "username";
   static final String PASS = "password";
   
   public static void main(String[] args) {
   Connection conn = null;
   Statement stmt = null;
   try{
      //STEP 2: Register JDBC driver
      Class.forName("com.mysql.jdbc.Driver");

      //STEP 3: Open a connection
      System.out.println("Connecting to database...");
      conn = DriverManager.getConnection(DB_URL,USER,PASS);

      //STEP 4: Execute a query
      System.out.println("Creating statement...");
      stmt = conn.createStatement();
      String sql;
      sql = "SELECT id, first, last, age FROM Employees";
      ResultSet rs = stmt.executeQuery(sql);

      //STEP 5: Extract data from result set
      while(rs.next()){
         //Retrieve by column name
         int id  = rs.getInt("id");
         int age = rs.getInt("age");
         String first = rs.getString("first");
         String last = rs.getString("last");

         //Display values
         System.out.print("ID: " + id);
         System.out.print(", Age: " + age);
         System.out.print(", First: " + first);
         System.out.println(", Last: " + last);
      }
      //STEP 6: Clean-up environment
      rs.close();
      stmt.close();
      conn.close();
   }catch(SQLException se){
      //Handle errors for JDBC
      se.printStackTrace();
   }catch(Exception e){
      //Handle errors for Class.forName
      e.printStackTrace();
   }finally{
      //finally block used to close resources
      try{
         if(stmt!=null)
            stmt.close();
      }catch(SQLException se2){
      }// nothing we can do
      try{
         if(conn!=null)
            conn.close();
      }catch(SQLException se){
         se.printStackTrace();
      }//end finally try
   }//end try
   System.out.println("Goodbye!");
}//end main
}//end FirstExample

Maintenant, compilons l'exemple ci-dessus comme suit:

C:\>javac FirstExample.java
C:\>

Quand tu cours FirstExample, il produit le résultat suivant:

C:\>java FirstExample
Connecting to database...
Creating statement...
ID: 100, Age: 18, First: Zara, Last: Ali
ID: 101, Age: 25, First: Mahnaz, Last: Fatma
ID: 102, Age: 30, First: Zaid, Last: Khan
ID: 103, Age: 28, First: Sumit, Last: Mittal
C:\>

Méthodes SQLException:

Une exception SQLException peut se produire à la fois dans le pilote et dans la base de données. Lorsqu'une telle exception se produit, un objet de type SQLException sera passé à la clause catch.

L'objet SQLException transmis dispose des méthodes suivantes pour récupérer des informations supplémentaires sur l'exception:

Méthode La description
getErrorCode () Obtient le numéro d'erreur associé à l'exception.
getMessage () Obtient le message d'erreur du pilote JDBC pour une erreur gérée par le pilote ou obtient le numéro d'erreur Oracle et le message pour une erreur de base de données.
getSQLState () Obtient la chaîne XOPEN SQLstate. Pour une erreur de pilote JDBC, aucune information utile n'est renvoyée par cette méthode. Pour une erreur de base de données, le code XOPEN SQLstate à cinq chiffres est renvoyé. Cette méthode peut retourner null.
getNextException () Obtient le prochain objet Exception dans la chaîne d'exceptions.
printStackTrace () Imprime l'exception actuelle, ou pouvant être levée, et sa trace dans un flux d'erreur standard.
printStackTrace (PrintStream s) Imprime ce jetable et sa trace dans le flux d'impression que vous spécifiez.
printStackTrace (PrintWriter w) Imprime ce jetable et sa trace vers le graveur d'impression que vous spécifiez.

En utilisant les informations disponibles à partir de l'objet Exception, vous pouvez intercepter une exception et continuer votre programme de manière appropriée. Voici la forme générale d'un bloc try:

try {
   // Your risky code goes between these curly braces!!!
}
catch(Exception ex) {
   // Your exception handling code goes between these 
   // curly braces, similar to the exception clause 
   // in a PL/SQL block.
}
finally {
   // Your must-always-be-executed code goes between these 
   // curly braces. Like closing database connection.
}

JDBC - Types de données:

Le tableau suivant récapitule le type de données JDBC par défaut vers lequel le type de données Java est converti lorsque vous appelez la méthode setXXX () de l'objet PreparedStatement ou CallableStatement ou de la méthode ResultSet.updateXXX ().

SQL JDBC / Java setXXX updateXXX
VARCHAR java.lang.String setString updateString
CARBONISER java.lang.String setString updateString
LONGVARCHAR java.lang.String setString updateString
BIT booléen setBoolean updateBoolean
NUMÉRIQUE java.math.BigDecimal setBigDecimal updateBigDecimal
TINYINT octet setByte updateByte
PETITE MENTHE court setShort updateShort
ENTIER int setInt updateInt
GRAND longue setLong updateLong
RÉEL flotte setFloat updateFloat
FLOTTE flotte setFloat updateFloat
DOUBLE double setDouble mise à jourDouble
VARBINAIRE octet [] setBytes updateBytes
BINAIRE octet [] setBytes updateBytes
DATE java.sql.Date régler la date date de mise à jour
TEMPS java.sql.Time régler le temps temps de mise à jour
HORAIRE java.sql.Timestamp setTimestamp updateTimestamp
CLOB java.sql.Clob setClob updateClob
GOUTTE java.sql.Blob setBlob updateBlob
ARRAY java.sql.Array setARRAY mise à jour
REF java.sql.Ref SetRef updateRef
STRUCT java.sql.Struct SetStruct updateStruct

JDBC 3.0 a amélioré la prise en charge des types de données BLOB, CLOB, ARRAY et REF. L'objet ResultSet dispose désormais des méthodes updateBLOB (), updateCLOB (), updateArray () et updateRef () qui vous permettent de manipuler directement les données respectives sur le serveur.

Les méthodes setXXX () et updateXXX () vous permettent de convertir des types Java spécifiques en types de données JDBC spécifiques. Les méthodes, setObject () et updateObject (), vous permettent de mapper presque n'importe quel type Java à un type de données JDBC.

L'objet ResultSet fournit la méthode getXXX () correspondante pour chaque type de données pour récupérer la valeur de la colonne. Chaque méthode peut être utilisée avec le nom de la colonne ou par sa position ordinale.

SQL JDBC / Java setXXX getXXX
VARCHAR java.lang.String setString getString
CARBONISER java.lang.String setString getString
LONGVARCHAR java.lang.String setString getString
BIT booléen setBoolean getBoolean
NUMÉRIQUE java.math.BigDecimal setBigDecimal getBigDecimal
TINYINT octet setByte getByte
PETITE MENTHE court setShort getShort
ENTIER int setInt getInt
GRAND longue setLong getLong
RÉEL flotte setFloat getFloat
FLOTTE flotte setFloat getFloat
DOUBLE double setDouble getDouble
VARBINAIRE octet [] setBytes getBytes
BINAIRE octet [] setBytes getBytes
DATE java.sql.Date régler la date avoir un rendez-vous
TEMPS java.sql.Time régler le temps obtenir du temps
HORAIRE java.sql.Timestamp setTimestamp getTimestamp
CLOB java.sql.Clob setClob getClob
GOUTTE java.sql.Blob setBlob getBlob
ARRAY java.sql.Array setARRAY getARRAY
REF java.sql.Ref SetRef getRef
STRUCT java.sql.Struct SetStruct getStruct

JDBC - Traitement par lots:

Le traitement par lots vous permet de regrouper les instructions SQL associées dans un lot et de les soumettre en un seul appel à la base de données.

Lorsque vous envoyez plusieurs instructions SQL à la base de données à la fois, vous réduisez la charge de communication, améliorant ainsi les performances.

  • Les pilotes JDBC ne sont pas nécessaires pour prendre en charge cette fonctionnalité. Vous devez utiliser la méthode DatabaseMetaData.supportsBatchUpdates () pour déterminer si la base de données cible prend en charge le traitement des mises à jour par lots. La méthode renvoie true si votre pilote JDBC prend en charge cette fonctionnalité.

  • le addBatch()La méthode Statement, PreparedStatement et CallableStatement est utilisée pour ajouter des instructions individuelles au lot. leexecuteBatch() permet de démarrer l'exécution de toutes les instructions regroupées.

  • le executeBatch() renvoie un tableau d'entiers et chaque élément du tableau représente le nombre de mises à jour pour l'instruction de mise à jour respective.

  • Tout comme vous pouvez ajouter des instructions à un lot pour traitement, vous pouvez les supprimer avec le clearBatch()méthode. Cette méthode supprime toutes les instructions que vous avez ajoutées avec la méthode addBatch (). Cependant, vous ne pouvez pas choisir de manière sélective l'instruction à supprimer.

JDBC - Données en streaming:

Un objet PreparedStatement a la capacité d'utiliser des flux d'entrée et de sortie pour fournir des données de paramètres. Cela vous permet de placer des fichiers entiers dans des colonnes de base de données pouvant contenir des valeurs importantes, telles que les types de données CLOB et BLOB.

Les méthodes suivantes peuvent être utilisées pour diffuser des données:

  • setAsciiStream(): Cette méthode est utilisée pour fournir de grandes valeurs ASCII.

  • setCharacterStream(): Cette méthode est utilisée pour fournir de grandes valeurs UNICODE.

  • setBinaryStream(): Cette méthode est utilisée pour fournir de grandes valeurs binaires.

La méthode setXXXStream () nécessite un paramètre supplémentaire, la taille du fichier, en plus du paramètre fictif. Ce paramètre informe le pilote de la quantité de données à envoyer à la base de données à l'aide du flux.

Pour un détail sur tous ces concepts, vous devez parcourir le tutoriel complet.