6.3. JDBC

La API de JDBC provee acceso a datos desde Java. Usando esta API podemos acceder a variadas fuentes de datos: bases de datos relacionales, hojas de cálculo (spreadsheets) y archivos planos.

Este paquete permite conectarse a una base de datos, consultarla o actualizarla usando SQL. Su manejo es de importancia debido a la frecuencia con que las bases de datos son usadas hasta hoy. En resumen es un puente a los datos

Así como con Java se logra independencia de la plataforma, al trabajar con JDBC se logra además independencia del proveedor de la base de datos.

Una dificultad enfrentada por los desarrolladores de JDBC fue que existen muchos proveedores de bases de datos cada uno usando su propio protocolo. Es así como se acordó el desarrollo de una API Java para SQL, la cual accede la base de datos vía un administrador de drivers de terceros los cuales se conectan a bases de datos específicas. Cada proveedor de bases de datos debía generar su propio driver conectable al administrador de drivers.

JDBC sigue un modelo similar al de ODBC. Por esto una opción común es conectar JDBC a través de un driver que actúa como puente entre JDBC y ODBC, ver Figura .

Es necesario instalar dicho conector para que las máquinas proveedoras de datos lo usen. Con MySQL instalado y el driver JDBC instalado podemos ejercitar la conexión de Java con su base de datos.

Todo programa Java que desea conectarse a una base de datos necesita cargar el driver específico para la base de datos a usar.

Para esto se usa:

try {  // Se carga el driver JDBC
  Class.forName("com.mysql.jdbc.Driver");
  catch( Exception e ) {
    System.out.println( "No se pudo cargar el Drive." );
    return;
   }

Luego su programa debe conectarse con la base de datos específica, la cual debe estar previamente creada. Para esto se usa:

Connection conexion;
  Statement sentencia;
  try {
    conexion = DriverManager.getConnection( "jdbc:mysql://nombreBaseDatos,"usuario","password");
    sentencia = conexion.createStatement();
  } catch( SQLException e ) {
     System.out.println("Error en la operación" + e.getMessage());
  }

Ejemplo

ConsultasClientesBanco.java

Este ejemplo supone que exite una Base de Datos "Banco" ya registrada con mySql, que contiene la tabla "Clientes" con los campos "rut, nunCuenta, nombre, fechaActivacion y saldo", para una serie de clientes.

El programa se conectará con esta BD y realizará una serie de consultas a ésta mediante un menu de opciones.

import java.sql.*;
import java.util.*;
class ConsultasClientesBanco {
  static public void main( String[] args ) {
    Connection conexion = null;
    Statement sentencia;
		ResultSet resultado;
    int op = 0, rutbuscado = 0;
		String consulta;
		Scanner s = new Scanner(System.in);
		
    System.out.println( "Conectandose con la Base de datos Banco..." );

    try {  // Se carga el driver JDBC
      Class.forName("com.mysql.jdbc.Driver");
		} catch( Exception e ) {
      System.out.println( "No se pudo cargar el Drive." );
      return;
		}

    try {
      conexion = DriverManager.getConnection("jdbc:mysql://localhost/Banco",
                                             "root","");
		System.out.println( "Conexion establecida" );
		sentencia = conexion.createStatement();
		   
		do {
		  System.out.println("1) Mostrar todos los datos"); 
		  System.out.println("2) Mostrar los clientes con saldo mayor a $100.000");
		  System.out.println("3) Obtener el saldo promedio de todos los clientes");
		  System.out.println("4) Mostrar datos de un determinado cliente");
		  System.out.println("5) Fin");
		  System.out.print("Ingrese opcion: ");
		  op = s.nextInt();  
		  switch(op) {
          case 1: resultado = sentencia.executeQuery("Select * from Clientes");
              while (resultado.next()){
                System.out.println("Rut = " + resultado.getInt("rut"));
                System.out.println("Numero de cuenta = " + 
                                   resultado.getInt("numCuenta"));
                System.out.println("Nombre cliente = "
                                   + resultado.getString("nombre"));
                System.out.println("Fecha activacion = " 
                                   + resultado.getDate("fechaActivacion"));
                System.out.println("Saldo = " + resultado.getInt("saldo"));
                System.out.println();
              }
              break;
          case 2: consulta = "Select nombre from Clientes where saldo > 100000";
              resultado = sentencia.executeQuery(consulta); 
              while (resultado.next())
                System.out.println("Nombre cliente = " 
                                   + resultado.getString("nombre"));	
              break;
           case 3: consulta = "Select avg(saldo) from Clientes";
              resultado = sentencia.executeQuery(consulta); 
              while (resultado.next())
                System.out.println("Saldo promedio = " + resultado.getInt(1));	
              break;
           case 4: System.out.print("Ingrese rut cliente: ");
              rutbuscado = s.nextInt(); 
              consulta = "Select * from Clientes where rut = " + rutbuscado;
              resultado = sentencia.executeQuery(consulta); 
              while (resultado.next()){
                System.out.println("Rut = " + resultado.getInt("rut"));
                System.out.println("Numero de cuenta = " 
                                   + resultado.getInt("numCuenta"));
                System.out.println("Nombre cliente = " 
                                   + resultado.getString("nombre"));
                System.out.println("Fecha activacion = " 
                                   + resultado.getDate("fechaActivacion"));
                System.out.println("Saldo = " + resultado.getInt("saldo"));
              }
              break;
				}
			} while (op != 5);
			sentencia.close();
			conexion.close();
		} catch( SQLException e ) {System.out.println("Error en la operacion" 
                                 + e.getMessage());	}
  } 
}