¿Qué es JDBC?

Curso de Java

JDBC es la API estándar de acceso a bases de datos con Java. Sun optó por crear una nueva API, en lugar de utilizar APIs ya existentes, como ODBC, con la intención de obviar los problemas que presenta el uso desde Java de estas APIs. Para trabajar con JDBC es necesario tener controladores (drivers) que permitan acceder a las distintas bases de datos: cada vez hay más controladores nativos JDBC. Sin embargo, ODBC es hoy en día la API más popular para acceso a bases de datos: por ello Sun ha diseñado un puente que permite utilizar la API de JDBC en combinación con controladores ODBC. Utilizaremos este puente JDBC/ODBC para acceder a una base de datos creada con Microsoft Access.

Acceso a bases de datos JDBC
El lenguaje Java — Tema 10 — Acceso a bases de datos: JDBC

Curso de Java

Luis Hernández Yáñez Carlos Cervigón Rückauer

Tema 10 – JDBC – 1

Preparación del entorno
Vamos a crear un origen (o fuente) de datos ODBC, a través del cuál accederemos a una base de datos de Microsoft Access. Creamos la base de datos Alumnos con una tabla de ejemplo llamada Tabla1:

Preparación del entorno
Una vez creada la base de datos Alumnos.mdb debemos crear un origen de datos ODBC: para ello, se debe escoger en el Panel de Control el icono "32bit ODBC", correspondiente al Administrador de orígenes de datos ODBC, y hacer pulsar el botón Agregar...

Curso de Java

Luis Hernández Yáñez Carlos Cervigón Rückauer

Tema 10 – JDBC – 2

Curso de Java

Luis Hernández Yáñez Carlos Cervigón Rückauer

Tema 10 – JDBC – 3

Preparación del entorno
Seleccionamos como Nombre del origen de datos el origen creado: JDBC_ALUMNOS Mediante el botón Seleccionar, nos referimos a la ruta completa donde guardamos la base de datos Alumnos.mdb.

Ejemplo: Conexión con la base de datos
import java.sql.*; import java.io.*; class jdbc1 { public static void main( String[] args ) { try { // Accederemos a la fuente de datos // ODBC llamada JDBC_ALUMNOS String urlBD = "jdbc:odbc:JDBC_ALUMNOS";

jdbc1.java

// Importamos el paquete que da soporte a JDBC, java.sql

// Cargamos la clase que implementa el puente JDBC=>ODBC // Realmente registramos el driver Class.forName( "sun.jdbc.odbc.JdbcOdbcDriver" );

Curso de Java

Luis Hernández Yáñez Carlos Cervigón Rückauer

Tema 10 – JDBC – 4

Curso de Java

Luis Hernández Yáñez Carlos Cervigón Rückauer

Tema 10 – JDBC – 5

Ejemplo: Conexión con la base de datos
// Establecemos una conexion con la Base de Datos System.out.println( “Conectando con " + urlBD + "..." ); Connection conexion = DriverManager.getConnection(urlBD ); System.out.println( "Conexión establecida." ); // Cerramos la conexión con la Base de Datos conexion.close(); System.out.println("Conexión a " + urlBD +" cerrada."); } catch( Exception ex ) { System.out.println( "Se produjo un error." ); } } }
Curso de Java Luis Hernández Yáñez Carlos Cervigón Rückauer Tema 10 – JDBC – 6

Conexión con la base de datos
Connection conexion = DriverManager.getConnection(urlBD );

La clase DriverManager gestiona los Drivers registrados en el sistema: al llamar a getConnection, recorre la lista de Drivers cargados hasta encontrar uno que sea capaz de gestionar la petición especificada por urlBD, que en nuestro ejemplo es "jdbc:odbc:JDBC_ALUMNOS". Cómo se especifica la base de datos a utilizar depende del Driver utilizado: en nuestro caso, en que utilizamos el puente ODBC/JDBC, todas las peticiones serán de la forma "jdbc:odbc:NOMBRE_FUENTE_DATOS". La cadena utilizada para indicar la base de datos siempre tiene tres partes, separadas por el carácter ":". La primera parte es siempre "jdbc". La segunda parte indica el subprotocolo, y depende del Sistema de Gestión de Base de Datos utilizado: en nuestro caso, es "odbc“ La tercera parte identifica la base de datos concreta a la que nos deseamos conectar, en nuestro caso la especificada por la fuente de datos ODBC llamada "JDBC_ALUMNOS".
Luis Hernández Yáñez Carlos Cervigón Rückauer Tema 10 – JDBC – 7

Curso de Java

Drivers

Consultas a la base de datos
Un programa que realice una consulta y quiera mostrar el resultado de la misma requerirá del uso de varias clases: la primera es DriverManager, que permitirá llevar a cabo una conexión con una Base de Datos, conexión que se representa mediante un objeto que soporta el interface Connection. También será necesario además ejecutar una sentencia SELECT para llevar a cabo la consulta, que se representará por un objeto que soporte el interface Statement (o PreparedStatement, o CallableStatement). Una sentencia SELECT puede devolver diversos registros o filas: esta información es accesible mediante un objeto que soporte el interface ResultSet. El siguiente ejemplo muestra el código fuente del programa que muestra los nombres de todos los contactos que hemos almacenado en la Base de Datos alumnos.mdb, y que utiliza las clases anteriormente mencionadas.

Microsoft Access:
Driver: sun.jdbc.odbc.JdbcOdbcDriver URL: jdbc:odbc:sob (fuente ODBC)

Oracle:
Driver: oracle.jdbc.driver.OracleDriver
URL:

jdbc:oracle:thin:@servidor:puerto:basededatos

MySQL
Driver: org.gjt.mm.mysql.Driver URL: jdbc:mysql://localhost/test
Luis Hernández Yáñez Carlos Cervigón Rückauer

Curso de Java

Tema 10 – JDBC – 8

Curso de Java

Luis Hernández Yáñez Carlos Cervigón Rückauer

Tema 10 – JDBC – 9

Consultas a la base de datos
import java.sql.*; import java.io.*;

jdbc2.java

Consultas a la base de datos
// Imprimimos el nombre de cada contacto encontrado con SELECT System.out.println( "NOMBRE" ); System.out.println( "------" ); int col = resultadoSelect.findColumn( “nombre" ); boolean seguir = resultadoSelect.next(); // Mientras queden registros... while( seguir ) { System.out.println( resultadoSelect.getString( col ) ); seguir = resultadoSelect.next(); }; // Liberamos recursos rápidamente resultadoSelect.close(); select.close(); conexion.close(); }

class jdbc2 { public static void main( String[] args ) { try { // Accederemos al alias ODBC llamado JDBC_DEMO String urlBD = "jdbc:odbc:JDBC_ALUMNOS"; // Cargamos el puente JDBC=>ODBC Class.forName ("sun.jdbc.odbc.JdbcOdbcDriver"); // Intentamos conectarnos a la base de datos JDBC_DEMO Connection conexion = DriverManager.getConnection (urlBD); // Creamos una sentencia SQL Statement select = conexion.createStatement(); // Ejecutamos una sentencia SELECT ResultSet resultadoSelect = select.executeQuery( "SELECT * FROM Tabla1 ORDER BY NOMBRE" );

Curso de Java

Luis Hernández Yáñez Carlos Cervigón Rückauer

Tema 10 – JDBC – 10

Curso de Java

Luis Hernández Yáñez Carlos Cervigón Rückauer

Tema 10 – JDBC – 11

Consultas a la base de datos
catch( SQLException ex ) { // Mostramos toda la informaciónn sobre el error System.out.println( "Error: SQLException" ); while (ex != null) { System.out.println ("SQLState: " + ex.getSQLState ()); System.out.println ("Mensaje: " + ex.getMessage ()); System.out.println ("Vendedor: " + ex.getErrorCode ()); ex = ex.getNextException(); System.out.println (""); } } catch( Exception ex ) { System.out.println( "Se produjo un error inesperado" ); } } }
Curso de Java Luis Hernández Yáñez Carlos Cervigón Rückauer Tema 10 – JDBC – 12

Consultas a la base de datos
Además del método executeQuery, Statement también proporciona otros métodos: executeUpdate ejecuta una sentencia UPDATE, DELETE, INSERT o cualquier otra sentencia SQL que no devuelva un conjunto de registros, y retorna el número de registros afectados por la sentencia (o -1 si no los hubo). El método getResultSet devuelve el ResultSet de la sentencia, si lo tiene, mientras que getUpdateCount devuelve el mismo valor que executeUpdate. Es posible limitar el número máximo de registros devuelto al hacer un executeQuery mediante setMaxRows, y averiguar dicho número mediante getMaxRows.
Curso de Java Luis Hernández Yáñez Carlos Cervigón Rückauer Tema 10 – JDBC – 13

Consultas a la base de datos
Se puede obtener el último aviso generado al ejecutar una sentencia, mediante getWarning, así como limitar el tiempo que el controlador esperará hasta que el SGBD devuelva un resultado, mediante setQueryTimeout. El interface ResultSet es el que encapsula el resultado de una sentencia SELECT. Para recuperar la información es necesario acceder a las distintas columnas (o campos), y recuperarla mediante una serie de métodos getString, getFloat, getInt, etc. Dado que un ResultSet puede contener más de un registro, para ir avanzando por la lista de registros que contiene deberemos utilizar el método next, que devuelve un valor booleano indicando si existe otro registro delante del actual.
Curso de Java Luis Hernández Yáñez Carlos Cervigón Rückauer Tema 10 – JDBC – 14

Clases e Interfaces de JDBC
Driver Permite conectarse a una Base de Datos: cada gestor de Base de Datos requiere un Driver distinto. DriverManager Permite gestionar todos los Drivers instalados en el sistema. DriverPropertyInfo Proporciona diversa información acerca de un Driver. Connection Representa una conexión con una Base de Datos. Una aplicación puede tener más de una conexión a más de una Base de Datos. DatabaseMetadata Proporciona información acerca de una Base de Datos, como las tablas que contiene, etc.
Luis Hernández Yáñez Carlos Cervigón Rückauer

Curso de Java

Tema 10 – JDBC – 15

Clases e Interfaces de JDBC

Ejemplo de GUI de acceso a BD

jdbcFrames.java

Statement Permite ejecutar sentencias SQL sin parámetros. PreparedStatement Permite ejecutar sentencias SQL con parámetros de entrada. CallableStatement Permite ejecutar sentencias SQL con parámetros de entrada y salida, típicamente procedimientos almacenados. ResultSet Contiene las filas o registros obtenidos al ejecutar un SELECT. ResultSetMetadata Permite obtener información sobre un ResultSet, como el número de columnas, sus nombres, etc.
Al pulsar OK, se listan los elementos de la tabla que comienzan por la cadena del cuadro de texto. Se muestran en la lista (List) de la parte inferior del panel

Curso de Java

Luis Hernández Yáñez Carlos Cervigón Rückauer

Tema 10 – JDBC – 16

Curso de Java

Luis Hernández Yáñez Carlos Cervigón Rückauer

Tema 10 – JDBC – 17

Ejemplo de GUI de acceso a BD
public class jdbcFrames extends JFrame{ Statement select; Container panel; JPanel p; JTextField campoBusqueda = new JTextField(20); JLabel terminado = new JLabel(" ");; JButton boton =new JButton("OK"); JTextArea resultados = new JTextArea(40,20); public jdbcFrames() { super("Acceso a bd alumnos"); panel=getContentPane(); p = new JPanel(); p.add(new Label("buscar por:")); p.add(campoBusqueda); p.add(boton); panel.add(p,BorderLayout.NORTH); panel.add(resultados, BorderLayout.CENTER); boton.addActionListener(new OyenteBoton());
Luis Hernández Yáñez Carlos Cervigón Rückauer Tema 10 – JDBC – 18

Ejemplo de GUI de acceso a BD
try { String urlBD = "jdbc:odbc:JDBC_ALUMNOS"; Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); Connection conexion = DriverManager.getConnection(urlBD); select = conexion.createStatement(); resultados.add("Conexión establecida.“+”\n” ); } catch(Exception e) { resultados.add(e.toString() ); } setSize(500,300); setVisible(true); setDefaultCloseOperation(EXIT_ON_CLOSE); }
Luis Hernández Yáñez Carlos Cervigón Rückauer Tema 10 – JDBC – 19

Curso de Java

Curso de Java

Ejemplo de GUI de acceso a BD
class OyenteBoton implements ActionListener { public void actionPerformed(ActionEvent e){ try { ResultSet resultadoSelect = select.executeQuery( "SELECT * FROM tabla1 WHERE nombre like '"+ campoBusqueda.getText()+"%'"); boolean seguir = resultadoSelect.next(); while( seguir ) { resultados.add(resultadoSelect.getString("nombre")+ “ "+ resultadoSelect.getString("edad")+ “ + resultadoSelect.getString("direccion")); seguir = resultadoSelect.next(); }; } catch( SQLException ex ) { resultados.add(e.toString()); } } } public static void main(String[] args) { jdbcFrames f = new jdbcFrames(); } }
Curso de Java Luis Hernández Yáñez Carlos Cervigón Rückauer Tema 10 – JDBC – 20

Creación de una tabla
import java.sql.*; public class CreateTable{ public static void main(String args[]) try {

CreateTable.java

{

Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); String url = "jdbc:odbc:JDBC_ALUMNOS"; Connection con = DriverManager.getConnection(url); Statement stmt = con.createStatement(); stmt.executeUpdate("CREATE TABLE CAFES " + "(NOMBRE VARCHAR(32), CANTIDAD INTEGER, PRECIO FLOAT, TOTAL INTEGER)"); con.close(); } catch(Exception e) e.printStackTrace(); } } }
Curso de Java Luis Hernández Yáñez Carlos Cervigón Rückauer Tema 10 – JDBC – 21

{

Inserción de valores en una tabla

InsertValues.java

Actualización de valores

UpdateValues1.java

import java.sql.*; public class InsertValues{ public static void main(String args[]) { try { Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); String url = "jdbc:odbc:JDBC_ALUMNOS"; Connection con = DriverManager.getConnection(url); Statement stmt = con.createStatement();
stmt.executeUpdate("INSERT stmt.executeUpdate("INSERT stmt.executeUpdate("INSERT stmt.executeUpdate("INSERT INTO INTO INTO INTO CAFES"+"VALUES('Colombian',101,7.99,0)"); CAFES"+"VALUES ('French_Roast',49,8.99, 0)"); CAFES"+"VALUES ('Espresso', 150, 9.99, 0)"); CAFES"+"VALUES ('Colombian2',101,8.99, 0)");

con.close(); } catch(Exception e) { e.printStackTrace(); } }
Curso de Java

}

import java.sql.*; public class UpdateValues1{ public static void main(String args[]) { try { Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); String url = "jdbc:odbc:JDBC_ALUMNOS"; Connection con = DriverManager.getConnection(url); Statement stmt = con.createStatement(); String updateString = "UPDATE CAFES SET CANTIDAD = 75 WHERE NOMBRE LIKE 'Colombian'"; stmt.executeUpdate(updateString); con.close(); } catch(Exception e) { e.printStackTrace(); } } }
Curso de Java Luis Hernández Yáñez Carlos Cervigón Rückauer Tema 10 – JDBC – 23

Luis Hernández Yáñez Carlos Cervigón Rückauer

Tema 10 – JDBC – 22

Actualización de valores

UpdateValues2.java

Ejercicio
Escribe una aplicación que solicite un tipo o nombre de café y sustituya en la tabla de la base de datos todas las entradas de ese café por la nueva cantidad. Mostrará un cuadro de diálogo de aviso:

import java.sql.*; public class UpdateValues2{ public static void main(String args[]) { try { Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); String url = "jdbc:odbc:JDBC_ALUMNOS"; Connection con = DriverManager.getConnection(url); PreparedStatement cambio = con.prepareStatement( "UPDATE CAFES SET CANTIDAD = ? WHERE NOMBRE LIKE ? "); cambio.setInt(1, 66); cambio.setString(2, "Colombian"); cambio.executeUpdate(); con.close(); } catch(Exception e) { e.printStackTrace(); } } }

Curso de Java

Luis Hernández Yáñez Carlos Cervigón Rückauer

Tema 10 – JDBC – 24

Curso de Java

Luis Hernández Yáñez Carlos Cervigón Rückauer

Tema 10 – JDBC – 25