You are on page 1of 48

Bases de Datos usando Java : JDBC

Ing. Csar Julio Bustacara Medina

JDBC
Java permite conectarse a bases de datos usando SQL-92 (Structured Query Language). La gran ventaja de esta utilidad es que una BD. puede migrarse y an ser vista con el mismo programa Java. Usualmente, una aplicacin con acceso a BD. se programa en un lenguaje propietario y sobre un sistema manejador de BD propietario.

JDBC
La API Java para el manejo de Bases de Datos es JDBC (Java DataBase Connectivity?). Este modelo no es una derivacin de ODBC (Open DataBase Connectivity) JDBC est escrito en Java ODBC est escrito en C En esencia, la idea es la misma: un programa dialoga con el JDBC driver manager quien a su vez se comunica con un controlador particular.

JDBC
JDBC es una interface hacia SQL, el lenguaje comn de todas las BD relacionales modernas. Las BD de escritorio cuentan con GUIs para manipular directamente los datos pero las BD servidor se controlan a travs de SQL. Para conectarse a una BD se debe especificar el nombre de la BD y algunos parmetros adicionales.

Capas JDBC
Capa Aplicacin (Application Layer)
Conjunto de clases (API) usadas para hacer llamados a la base de datos a travs de SQL, obtener y procesar los resultados. Conjunto de clases (API) que se encargan de establecer, manejar y terminar la comunicacin con un RDBMS
(Implementacin especifica de un driver)

Capa Manejador (Driver Layer)

Capas JDBC
Driver Layer

Application Layer

Tipo de Drivers
JDBC-ODBC Bridge (1) Librera Nativa (2)
Las llamadas JDBC son enviadas a una librera ODBC. Usa libreras nativas en C (Propias del RDBMS), para trasladar instrucciones JDBC al cliente nativo. Las llamadas JDBC son trasladadas a un protocolo independiente de RDBMS y enviadas a un servidor intermedio (AppServer) sobre un socket TCP/IP Las llamadas JDBC son convertidas directamente al protocolo del RDBMS

Protocolo de red.(3)

Protocolo/Librera Nativa 100% java (4)

Tipo de Drivers
JDBC-ODBC Bridge (1)
Las llamadas JDBC son enviadas a una librera ODBC.

Tipo de Drivers
Librera Nativa (2)
Usa libreras nativas en C (Propias del RDBMS), para trasladar instrucciones JDBC al cliente nativo del RBDMS.

Tipo de Drivers
Protocolo de red.(3)
Las llamadas JDBC son trasladadas a un protocolo independiente de RDBMS y enviadas a un servidor intermedio (AppServer) sobre un socket TCP/IP

Tipo de Drivers
Protocolo/Librera Nativa 100% java (4)
Las llamadas JDBC son convertidas directamente al protocolo del RDBMS

Modelo Two-Tier Cliente/Servidor


Aplicacin Cliente

Aplicacin Cliente Firewall

B.D.

Drivers JDBC
JDBC/OCI Oracle thin Servidor de drivers JDBC

Drivers JDBC
oci :
Intranets y para servidores middle-tier. Extranets, es necesario tener instalado el firewall. Convierte sus llamados directamente en Net8. Funciona sobre varios protocolos

Modelo usando OCI


Aplicacin Java Driver JDBC/OCI

Aplicacin Java Net8 Driver JDBC/OCI Net8 Firewall

B.D.

Drivers JDBC
Thin :
Funciona para internet No requiere driver en el cliente Es 100% Java Funciona solamente sobre TCP/IP No ofrece completa funcionalidad con Net8

Modelo thin
Aplicacin Java Driver thin Aplicacin Java Net8 Driver thin Net8 Firewall B.D. Net8

Instalar el Driver
Para nuestro caso bajar la librera classes12.zip si se esta usando oracle 8.1.5 o superior, de lo contrario usar la librera classes111.zip ubicadas en la pgina http://technet.oracle.com/software

Instalar el Driver
Coloquela en el directorio que desee y adicionelo al classpath path\classes12.zip Sugerencia: colocarlo en: ...jdk1.3\jre\lib\ext\classes12.zip adicione el directorio al classpath

Verificacin
import java.sql.*; public class DriverLoader{ public static void main (String arg[]){ try{ DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver()); } catch(Exception e){ e.printStackTrace(); } } }

Verificacin
Si hay error se despliega el mensaje
Class oracle.jdbc.driver.OracleDriver not found in type declaration DriverManager.registerDriver(new oracle.jdbc.driver.oracleDriver());

Otra forma de registrar el driver


Usando el metodo forName de la clase (java.lang).
Cargar y registrar el driver a memoria. Ejemplos: Class.forName(sun.jdbc.odbc.JdbcOdbcDriver );//Odbc -tipo 1 Class.forName(oracle.jdbc.driver.OracleDriv er); //Oracle - Tipo 4
Class.forName( clase java del driver)

Capa Aplicacin
Clases/Interfaces que permiten interactuar con el RDBMS a travs de instrucciones SQL (Select, DDL, DML): Connection Statement PreparedStatement CallableStatement ResultSet ResultMetaData Se agrupan bajo el paquete java.sql.*

Capa Aplicacin
Connection
Representa una sesin con la conexin a la base de datos La funcin principal de connection, es crear objetos tipo Statement (Statement,PreparedStatement, CallableStatement) Cmo se crea:

Connection conn=DriverManager.getConnection ( url ); Connection conn=DriverManager.getConnection ( url, user, password );

Caractersticas transaccionales:

conn.setAutocommit(false/true); conn.rollback(); conn.commit();

Capa Aplicacin
Statement
Es el canal a travs del cual se le envan instrucciones SQL a la base de datos y se reciben los resultados. Las instrucciones SQL puede ser instrucciones DML (Insert, Update, Delete), DDL (Create, Drop) o instrucciones SELECT. Como se crea: Statement stmt= conn.createStatement(); Sobre una conexin se pueden tener n objetos Statement. Mtodos de ejecucin: Ejecucin de instrucciones SELECT ResultSet resultadoSelect = stmt.executeQuery(sql); Ejecucin de instrucciones DML/DDL int resultadoDML = stmt.executeUpdate(sql);

Capa Aplicacin
PreparedStatement
Se usa cuando se llama n veces la misma instruccin. Permite el manejo de parmetros dinmicos Ventajas tcnicas sobre Statement:
(Hereda de Statement)

Como se crea: Ejemplo:

Si se tiene Statement la instruccin SQL es compilada cada vez que se usa. Con PreparedStatement solo compila una vez. PreparedStatement stmt= conn.prepareStatement(sql); sql = SELECT * FROM productos WHERE id=? And fecha=? PreparedStatement stmt= conn.prepareStatement(sql);

Capa Aplicacin
Parmetro 1 : id Parmetro 2 : fecha

(PreparedStatement)

(continuacin ejemplo) sql = SELECT * FROM productos WHERE id=? And fecha=? Como se pasan los parmetros

stmt.setInt(1,10); //Si quisiramos el producto 10 stmt.setDate(2,03/09/2001) //Los productos creados hoy.


Metodo setBoolean Tipo dato SQL Bit Date Double Float String,Varchar

Otros tipo de datos (setXXX)

setDate setDouble setFloat setString

Capa Aplicacin
CallableStatemet (Hereda de Statement)
Es usada para ejecutar StoredProcedure. Proporciona mtodos para mapear los parmetros de salida del Stored Procedure Como se crea: CallableStatement cs = conn.prepareCall("{call <StoredProc>}");
Donde <StoredProc>, es el nombre del StoredProcedure

Mtodos para mapear los parmetros


cs.registerOutParameter (indiceParametro, tipodato);

Ej.: cs.registerOutParameter( 1, java.sql.Date);

Capa Aplicacin
ResultSet
Tiene el mismo comportamiento de un cursor Define los mtodos, que permiten acceder al cursor generado como resultado de la ejecucin de un SELECT. El puntero esta ubicado antes de la primera fila. Para moverse entre filas se emplea ResultSet.next() Para obtener una columna especifica de la fila, se puede hacer invocando el mtodo ResultSet.getXXX (xxx indica el tipo de datos)

Capa Aplicacin
ResultSet (Continuacin) Ejemplo:
String sql=select * from productos Statement stmt_ = conn.createStatemet(); ResultSet resultado_ = stmt_.executeQuery(sql); while(resultado_.next()){ System.out.println( id producto--> +resultado_.getInt(id)); System.out.println( producto--> +resultado_.getString(nombre)); }
Metodo Tipo dato SQL Bit Date Double Float String,Varchar

Tipo de metodos getXXX

getBoolean getDate getDouble getFloat getString

Capa Aplicacin
ResultSetMetaData
Contiene informacin acerca de las propiedades de cada una de las columnas, que conforman el cursor/tabla, que fue obtenida en la ejecucin de una consulta. Como se crea:
ResultSetMetaData rsmd = ResultSet.getMetaData(); Ejemplo (Tomando como base el slide anterior):
ResultSet resultado = stmt.executeQuery(sql); ResultSetMetaData metaData_ = resultado.getMetaData();

Numero de Columnas: int cols = metadata.getColumnCount(); Tipo Columna : String tipo = metadata.getColumnType(id); Saber si un campo es auto incremento:
boolean esAutoIncremento = metadata.isAutoIncrement();

Conexin a la B.D. con JDBC


String url = jdbc:oracle:thin:@nut.javeriana.edu.co:1521:DEPTO String usuario = miNombre; String password = miClave;
Connection conexin = DriverManager.getConnection(url,usuario,password); DriverManager getConnection

El driver manager intentar encontrar un driver cargado que pueda usar el protocolo especificado en la URL. Mediante la instancia de Connection (conexin) obtenida a travs de getConnection se pueden ejecutar expresiones SQL.

Conexin a la Base de Datos


import java.sql.*; public class forNameLoader{ public static void main (String arg[]){ String url = jdbc:oracle:thin:@nut.javeriana.edu.co:1521:DEPTO String usuario = miNombre; String password = miClave; try{ DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver()); try{ Connection con = DriverManager.getConnection(url,usuario,password); if (con!=null) System.out.println("Driver cargado"); else System.out.println("Driver No cargado"); } catch(Exception e){System.out.println("Error en la conexion a la BD"); } } catch(Exception e){e.printStackTrace();} } }

Conexin
Los tres mtodos de conexin son:
public static synchronized Connection getConnection(String url) throws SQLException public static synchronized Connection getConnection(String url, String user, String password) throws SQLException

public static synchronized Connection getConnection(String url, Properties info) throws SQLException

Operaciones sobre la base de Datos


Statement declaracion = conexion.createStatement();
Statement st = con.createStatement(); // // operaciones con st // st.close();

import java.sql.*; public class forNameLoader{ public static void main (String arg[]){ String url = jdbc:oracle:thin:@nut.javeriana.edu.co:1521:DEPTO String usuario = miNombre; String password = miClave; try{ DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver()); try{ Connection con = DriverManager.getConnection(url,usuario,password); if (con!=null){

Statement st = con.createStatement(); // // operaciones con st // st.close(); }


else System.out.println("Driver No cargado"); } catch(Exception e){System.out.println("Error en la conexion a la BD"); } } catch(Exception e){e.printStackTrace();} } }

import java.sql.*;

Ejemplo

public class forNameLoader{ public static void main (String arg[]){ String url = jdbc:oracle:thin:@nut.javeriana.edu.co:1521:DEPTO String usuario = miNombre; String password = miClave;

executeUpdate

String query = CREATE TABLE Paciente + (id Number(9) NOT NULL PRIMARY KEY, + nombre VarChar(50), apellido VarChar(50));
try{ DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver()); try{ Connection con = DriverManager.getConnection(url,usuario,password); if (con!=null){

Statement st = con.createStatement(); int x = st.executeUpdate(query); System.out.println(Tabla de pacientes creada) st.close();


}
else System.out.println("Driver No cargado"); } catch(Exception e){System.out.println("Error en la conexion a la BD"); } } catch(Exception e){e.printStackTrace();} } }

import java.sql.*;

Ejemplo

executeQuery

public class forNameLoader{ public static void main (String arg[]){ String url = jdbc:oracle:thin:@nut.javeriana.edu.co:1521:DEPTO String usuario = miNombre; String password = miClave;

String query = SELECT * FROM Pacientes;


try{ DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver()); try{ Connection con = DriverManager.getConnection(url,usuario,password); if (con!=null){

Statement st = con.createStatement(); ResulSet y = st.executeQuery(query); while(y.next()){ // Lo que quieran con los datos } y.close(); st.close();
}
else System.out.println("Driver No cargado"); } catch(Exception e){System.out.println("Error en la conexion a la BD"); } } catch(Exception e){e.printStackTrace();} } }

JDBC
En resumen, suponiendo que queremos revisar los datos de la tabla Temp' usamos:
...

Statement sentencia = con.createStatement(); ResultSet vista = sentencia.executeQuery(SELECT * FROM Temp); while (vista.next()) { // Revisar el segundo campo de cada registro String unregistro = vista.getString(2); int unregistro = vista.getInt(nombre_de_campo_numerico); }

Los mtodos que permiten inspeccionar el ResultSet aceptan el nmero del campo, contados a partir de uno, o el nombre del campo.

JDBC
Java intentar realizar las conversiones de tipos SQL a tipos Java de la forma ms razonable posible. La correspondencia entre tipos SQL comunes y los tipos de Java se ilustran en las siguientes tablas:

JDBC
Tipos de datos numricos
Java byte int short long double double float SQL Notas TINYINT 8 bits INTEGER o INT 32 bits SMALLINT 16 bits BIGINT 64 bits DOUBLE 15 digitos de precisin FLOAT 15 digitos de precisin REAL 7 digitos de precisin Nmeros de precisin especfica Nmeros de precisin especfica

java.math.BigDecimal NUMERIC java.math.BigDecimal DECIMAL

JDBC
Tipos de datos caracter
Java String String String byte[] byte[] byte[] SQL Notas CHAR o CHARACTER Cadena rellenada con espacios VARCHAR Cadena LONGVARCHAR Se puede leer usando un flujo de entrada BINARY La longitud del arreglo es la del campo VARBINARY La longitud del arreglo es la del campo LONGVARBINARY Se puede leer usando un flujo de entrada

JDBC
Otros tipos de datos
Java boolean java.sql.Data java.sql.Time java.sql.TimeStamp SQL BIT DATE TIME TIMESTAMP Notas true/false mm / dd / aa hh / mm / ss Fecha y hora en nanosegundos

JDBC
Modelo de uso
Connection conexin = null; Statement declaracin = null; try { Class.forName(sun.jdbc.odbc.JdbcOdbcDriver); conexin = DriverManager.getConnection(jdbc:odbc:NombreBD, idUsuario, contrasea); declaracin = conexin.createStatement(); ResultSet resultado = declaracin.executeQuery(instruccin SQL); while (resultado.next()) { int campoEntero = resultado.getInt(NombreCampoEntero); int campoReal = resultado.getString(NombreCampoReal); System.out.println(campoEntero + + campoReal); } } catch (ClassNotFoundException e) { System.err.println(Controlador no encontrado); } catch (SQLException e) { System.err.println(Falla en la Base de Datos); }

JDBC
Usando excepciones
// ExcepcionesEnJDBC import java.sql.*; Parte 1/2 public class ExcepcionesEnJDBC { public static void main(String argv[]) { Connection conexin = null; Statement declaracin = null; try { Class.forName(sun.jdbc.odbc.JdbcOdbcDriver); } catch(ClassNotFoundException e) { System.err.println(Error: controlador no encontrado.); System.exit(1); } try { conexin = DriverManager.getConnection(jdbc:odbc:NombreBD, idUsuario, contrasea); } catch (SQLException e) { System.err.println(Error: falla en conexin a la base de datos.); System.exit(2); }

JDBC
// ExcepcionesEnJDBC Parte 2/2 try { declaracin = conexin.createStatement(); } catch (SQLException e) { System.err.println(Error: imposible crear la declaracin.); System.exit(3); } try { ResultSet resultado = declaracin.executeQuery(instruccin SELECT-SQL); while (resultado.next()) { int campoEntero = resultado.getInt(NombreCampoEntero); int campoReal = resultado.getString(NombreCampoReal); System.out.println(campoEntero + + campoReal); } } catch(SQLException e) { System.err.println(Error: en lectura de la Base de Datos); } } }

JDBC
Declaraciones preparadas. Una declaracin preparada es una consulta especial en la que se mantiene la estructura y se cambia solamente el dato que se requiera.
SELECT * FROM NombreTabla WHERE campo=variable SELECT * FROM NombreTabla WHERE campo=?
Connection conexin = null; Statement declaracin = null; ... PreparedStatement declaracinPreparada = conexin.prepareStatement( SELECT * FROM NombreTabla WHERE campo=?); declaracinPreparada.setString(n, valorCampo); ... ResultSet resultado = declaracinPreparada.executeQuery();

Recursos
Sitio oficial JDBC Buscar drivers.
Tutorial JDBC
java.sun.com/jdbc
http://industry.java.sun.com/products/jdbc/drivers http://java.sun.com/j2se/1.3/docs/guide/jdbc/getstart/Gettin gStartedTOC.fm.html www.theserverside.com www.jdance.com www.jguru.com

Otros sitios de interes