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.