JDBC - Guía rápida

¿Qué es JDBC?

JDBC son las siglas de Java DatabPlaza bursátil norteamericana Connectivity, que es una API estándar de Java para la conectividad independiente de la base de datos entre el lenguaje de programación Java y una amplia gama de bases de datos.

La biblioteca JDBC incluye API para cada una de las tareas comúnmente asociadas con el uso de la base de datos:

  • Hacer una conexión a una base de datos

  • Creando declaraciones SQL o MySQL

  • Ejecutando esas consultas SQL o MySQL en la base de datos

  • Ver y modificar los registros resultantes

Requisito previo:

Debe tener un buen conocimiento de los dos temas siguientes para aprender JDBC:

JDBC - Configuración del entorno:

Asegúrese de haber realizado la siguiente configuración:

  • Instalación de Core JAVA

  • Instalación de base de datos SQL o MySQL

Aparte de lo anterior, necesita configurar una base de datos que usaría para su proyecto. Suponiendo que esto es EMP y ha creado en la tabla Empleados dentro de la misma base de datos.

Creación de la aplicación JDBC:

Hay seis pasos involucrados en la construcción de una aplicación JDBC que voy a resumir en este tutorial:

Importar los paquetes:

Esto requiere que incluya los paquetes que contienen las clases JDBC necesarias para la programación de la base de datos. La mayoría de las veces, usar import java.sql. * Será suficiente de la siguiente manera:

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

Registre el controlador JDBC:

Esto requiere que inicialice un controlador para poder abrir un canal de comunicaciones con la base de datos. A continuación se muestra el fragmento de código para lograr esto:

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

Abra una conexión:

Esto requiere usar el método DriverManager.getConnection () para crear un objeto Connection, que representa una conexión física con la base de datos de la siguiente manera:

//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);

Ejecuta una consulta:

Esto requiere el uso de un objeto de tipo Statement o PreparedStatement para crear y enviar una sentencia SQL a la base de datos de la siguiente manera:

//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 se requiere una declaración SQL UPDATE, INSERT o DELETE, se necesitará el siguiente fragmento de código:

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

Extraiga datos del conjunto de resultados:

Este paso es necesario en caso de que esté obteniendo datos de la base de datos. Puede utilizar el método ResultSet.getXXX () apropiado para recuperar los datos del conjunto de resultados de la siguiente manera:

//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);
}

Limpiar el medio ambiente:

Debe cerrar explícitamente todos los recursos de la base de datos en lugar de confiar en la recolección de basura de la JVM de la siguiente manera:

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

Primer programa JDBC:

Según los pasos anteriores, podemos tener el siguiente código de muestra consolidado que podemos usar como plantilla mientras escribimos nuestro código JDBC:

Este código de muestra se ha escrito en función del entorno y la configuración de la base de datos realizada en el capítulo Medio ambiente.

//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

Ahora compilemos el ejemplo anterior de la siguiente manera:

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

Cuando corres FirstExample, produce el siguiente resultado:

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étodos de SQLException:

Una SQLException puede ocurrir tanto en el controlador como en la base de datos. Cuando ocurre una excepción de este tipo, un objeto de tipo SQLException se pasará a la cláusula catch.

El objeto SQLException pasado tiene los siguientes métodos disponibles para recuperar información adicional sobre la excepción:

Método Descripción
getErrorCode () Obtiene el número de error asociado con la excepción.
getMessage () Obtiene el mensaje de error del controlador JDBC para un error manejado por el controlador u obtiene el número de error de Oracle y el mensaje para un error de base de datos.
getSQLState () Obtiene la cadena XOPEN SQLstate. En el caso de un error del controlador JDBC, este método no devuelve información útil. Para un error de base de datos, se devuelve el código XOPEN SQLstate de cinco dígitos. Este método puede devolver un valor nulo.
getNextException () Obtiene el siguiente objeto de excepción en la cadena de excepciones.
printStackTrace () Imprime la excepción actual, o arrojable, y su seguimiento en un flujo de error estándar.
printStackTrace (PrintStream s) Imprime este elemento desechable y su seguimiento en el flujo de impresión que especifique.
printStackTrace (PrintWriter w) Imprime este elemento desechable y su seguimiento en el escritor de impresión que especifique.

Al utilizar la información disponible del objeto Exception, puede detectar una excepción y continuar con su programa de manera adecuada. Aquí está la forma general de un bloque 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 - Tipos de datos:

La siguiente tabla resume el tipo de datos JDBC predeterminado al que se convierte el tipo de datos Java cuando llama al método setXXX () del objeto PreparedStatement o CallableStatement o al método ResultSet.updateXXX ().

SQL JDBC / Java setXXX updateXXX
VARCHAR java.lang.String setString updateString
CARBONIZARSE java.lang.String setString updateString
LONGVARCHAR java.lang.String setString updateString
POCO booleano setBoolean updateBoolean
NUMÉRICO java.math.BigDecimal setBigDecimal updateBigDecimal
TINYINT byte setByte updateByte
PEQUEÑO corto setShort updateShort
ENTERO En t setInt updateInt
EMPEZANDO largo setLong updateLong
REAL flotador setFloat updateFloat
FLOTADOR flotador setFloat updateFloat
DOBLE doble setDouble updateDouble
VARBINARIO byte [] setBytes updateBytes
BINARIO byte [] setBytes updateBytes
FECHA java.sql.Date define la fecha fecha de actualización
HORA java.sql.Time fijar tiempo tiempo de actualizacion
TIMESTAMP java.sql.Timestamp setTimestamp updateTimestamp
CLOB java.sql.Clob setClob updateClob
GOTA java.sql.Blob setBlob updateBlob
FORMACIÓN java.sql.Array setARRAY updateARRAY
ÁRBITRO java.sql.Ref SetRef updateRef
ESTRUCTURA java.sql.Struct SetStruct updateStruct

JDBC 3.0 tiene soporte mejorado para los tipos de datos BLOB, CLOB, ARRAY y REF. El objeto ResultSet ahora tiene métodos updateBLOB (), updateCLOB (), updateArray () y updateRef () que le permiten manipular directamente los datos respectivos en el servidor.

Los métodos setXXX () y updateXXX () le permiten convertir tipos específicos de Java en tipos de datos JDBC específicos. Los métodos setObject () y updateObject () le permiten mapear casi cualquier tipo de Java a un tipo de datos JDBC.

El objeto ResultSet proporciona el método getXXX () correspondiente para cada tipo de datos para recuperar el valor de la columna. Cada método se puede utilizar con el nombre de la columna o por su posición ordinal.

SQL JDBC / Java setXXX getXXX
VARCHAR java.lang.String setString getString
CARBONIZARSE java.lang.String setString getString
LONGVARCHAR java.lang.String setString getString
POCO booleano setBoolean getBoolean
NUMÉRICO java.math.BigDecimal setBigDecimal getBigDecimal
TINYINT byte setByte getByte
PEQUEÑO corto setShort getShort
ENTERO En t setInt getInt
EMPEZANDO largo setLong getLong
REAL flotador setFloat getFloat
FLOTADOR flotador setFloat getFloat
DOBLE doble setDouble getDouble
VARBINARIO byte [] setBytes getBytes
BINARIO byte [] setBytes getBytes
FECHA java.sql.Date define la fecha obtener la fecha
HORA java.sql.Time fijar tiempo consigue tiempo
TIMESTAMP java.sql.Timestamp setTimestamp getTimestamp
CLOB java.sql.Clob setClob getClob
GOTA java.sql.Blob setBlob getBlob
FORMACIÓN java.sql.Array setARRAY getARRAY
ÁRBITRO java.sql.Ref SetRef getRef
ESTRUCTURA java.sql.Struct SetStruct getStruct

JDBC - Procesamiento por lotes:

El procesamiento por lotes le permite agrupar declaraciones SQL relacionadas en un lote y enviarlas con una llamada a la base de datos.

Cuando envía varias declaraciones SQL a la base de datos a la vez, reduce la cantidad de sobrecarga de comunicación, mejorando así el rendimiento.

  • Los controladores JDBC no son necesarios para admitir esta función. Debe utilizar el método DatabaseMetaData.supportsBatchUpdates () para determinar si la base de datos de destino admite el procesamiento de actualizaciones por lotes. El método devuelve verdadero si su controlador JDBC admite esta función.

  • los addBatch()El método Statement, PreparedStatement y CallableStatement se utiliza para agregar declaraciones individuales al lote. losexecuteBatch() se utiliza para iniciar la ejecución de todas las declaraciones agrupadas.

  • los executeBatch() devuelve una matriz de enteros, y cada elemento de la matriz representa el recuento de actualizaciones para la declaración de actualización respectiva.

  • Así como puede agregar declaraciones a un lote para su procesamiento, puede eliminarlas con el clearBatch()método. Este método elimina todas las declaraciones que agregó con el método addBatch (). Sin embargo, no puede elegir de forma selectiva qué declaración eliminar.

JDBC - Transmisión de datos:

Un objeto PreparedStatement tiene la capacidad de usar flujos de entrada y salida para suministrar datos de parámetros. Esto le permite colocar archivos completos en columnas de base de datos que pueden contener valores grandes, como tipos de datos CLOB y BLOB.

Existen los siguientes métodos que se pueden utilizar para transmitir datos:

  • setAsciiStream(): Este método se utiliza para proporcionar valores ASCII grandes.

  • setCharacterStream(): Este método se utiliza para proporcionar valores UNICODE grandes.

  • setBinaryStream(): Este método se utiliza para proporcionar valores binarios grandes.

El método setXXXStream () requiere un parámetro adicional, el tamaño del archivo, además del marcador de posición del parámetro. Este parámetro informa al conductor cuántos datos deben enviarse a la base de datos mediante el flujo.

Para obtener detalles sobre todos estos conceptos, debe seguir el tutorial completo.