Manipulación de datos con JDBC

API JDBC 

JDBC (Java Database Connectivity) está compuesto por un número determinado de clases e interfaces que permiten a cualquier programa escrito en Java acceder a una base de datos. 

Este conjunto de clases reside en los paquetes: java.sql y javax.sql 

javax.sql añade funciones de servidor como los RowSet, los pools de conexiones o las transacciones. 

Para podernos conectar a la base de datos necesitamos un controlador o también conocido como Driver. Este driver no es más que la implementación del API JDBC para un gestor de Base de datos concreto Oracle, MySQL, Derby, …etc. 

 

 

 

TIPOS DE CONTROLADORES 

Los diferentes tipos de controladores que tenemos son: 

  • Puente JDBC-ODBC 
  • 100 % Java nativo 
  • 100 % Java / Protocolo independiente 
  • 100 % Java / Protocolo nativo 

Proceso de obtención de resultados

IMPORTANTE: A partir de JDK 6, los drivers JDBC 4 ya se registran automáticamente y no es necesario el Class.forName(), sólo que estén en el classpath de la JVM.


ABRIR Y CERRAR CONEXIONES 

Para poder acceder a una base de datos es necesario establecer una conexión. 

Antes de conectarnos con la base de datos hay que registrar el controlador apropiado. Java utiliza la clase DriverManager para cargar inicialmente todos los controladores JDBC disponibles y que deseemos utilizar. 

Para cargar un controlador se emplea del método forName() de la clase Class que devuelve un objeto Class asociado con la clase que se le pasa como parámetro. 

La interfaz Connection es la que se encarga de la conexión con la base de datos. Mediante el método getConnection(), obtenemos un objeto de la clase Connection. Esta clase contiene todos los métodos que nos permiten manipular la base de datos. 

Para cerrar la conexión utilizamos el método close() de la interfaz Connection. 

CREAR CONSULTAS CON SQL 

Para crear una consulta a la base de datos podemos utilizar 3 interfaces diferentes, cada uno tiene un uso especifico: 

  • Statement; Para ejecutar querys completas, es decir, tenemos todos los datos de la query. 
  • PreparedStatement; Para ejecutar querys parametrizadas. No tenemos todos los datos en este momento y utilizamos parámetros. 
  • CallableStatement; Para ejecutar querys a través de procedimientos almacenados definidos en la BBDD. 

Statement 

Para incluir una sentencia SQL utilizaremos la interfaz Statement, con el método createStatement() de la interfaz Connection. 

Al crear una instancia del objeto Statement, podremos realizar sentencias SQL sobre la base de datos. Existen dos tipos de sentencias a realizar: 

  • Sentencias de modificación (update); Engloban a todos los comandos SQL que no devuelven ningún tipo de resultado como pueden ser los comandos INSERT, UPDATE, DELETE o CREATE. 
  • Sentencias de consulta (query); Son sentencias del tipo SELECT (sentencias de consulta) que retornan algún tipo de resultado.

Para las sentencias “update” la clase Statement el método siguiente que devolverá el número de filas afectadas por la sentencia SQL: 

Para las sentencias “query” la clase Statement nos retorna el objeto Resulset con los datos solicitados, veamos un ejemplo:

El Objeto ResultSetcontrola la recuperación de da los registros.

  • Respresentaun iterador
  • Nos movemos con next() y previous()
  • El cursos se coloca iniciatialmenteantes del primer registo.

Tenemos dos formas de acceder a las columnas.

Por posición:

resul.getInt(1), resul.getString(2), resul.getString(3), resul.getString(4), resul.getString(5)

Por nombre de la columna:

resul.getInt(“id”), resul.getString(“apellido”), resul.getString(“direccion”)….

 

Veamos un ejemplo de ejecución:

En el código anterior vemos cómo realizar una consulta SELECT y procesar los datos.

En el código anterior vemos cómo realizar una inserción.

PreparedStatement 

Define métodos para trabajar con instrucciones SQL pre compiladas, que son más eficientes. 

También se usan para poder utilizar instrucciones SQL parametrizadas. Para establecer parámetros en una instrucción SQL basta con sustituir el dato por un signo de interrogación. (Select * from Tabla where Nombre=?). 

El parámetro se sustituye por el valor mediante el método setXXX(int lugar, XXX Valor). 

PreparedStatement no utiliza los métodos de Statement para ejecutar las querys, en su lugar, se pasa la query en el propio constructor. 

Igual que antes podemos ejecutar dos tipos de consultas query y update.

Ejemplo Inserción:

Ejemplo Select:

Ejemplo Select con Filtro:

Ejemplo Update:

Ejemplo delete

 

Metadatos

Los metadatos se pueden considerar como información adicional a los datos que almacena la tabla. 

Se utiliza un objeto ResultSetMetaData para recoger los metadatos de una consulta. Dicho objeto expone los siguientes métodos: 

  • getColumnName(); devuelve el nombre de la columna. 
  • getColumnCount(); nos indica el numero de columnas de la consulta. 
  • getTableName(); devuelve el nombre de la tabla. 
  • getColumnType(); nos dice el tipo de datos de la columna. 
  • isReadOnly(); especifica si los datos son de solo lectura.

Ejemplo: