Bases de Datos usando Java : JDBC · er”); //Oracle - Tipo 4 Otra forma de registrar el driver...

48
Bases de Bases de Datos Datos usando usando Java : JDBC Java : JDBC Ing. César Julio Bustacara Medina

Transcript of Bases de Datos usando Java : JDBC · er”); //Oracle - Tipo 4 Otra forma de registrar el driver...

Bases de Bases de DatosDatos usandousandoJava : JDBCJava : JDBC

Ing. César Julio Bustacara Medina

Java permite conectarse a bases de datos usandoSQL-92 (Structured Query Language).

La gran ventaja de esta utilidad es que una BD.puede migrarse y aún ser vista con el mismoprograma Java.

Usualmente, una aplicación con acceso a BD. seprograma en un lenguaje propietario y sobre unsistema manejador de BD propietario.

JDBCJDBC

La API Java para el manejo de Bases de Datos esJDBC (¿Java DataBase Connectivity?).

Este modelo no es una derivación de ODBC (OpenDataBase Connectivity)

JDBC está escrito en JavaODBC está escrito en C

En esencia, la idea es la misma: un programadialoga con el JDBC driver manager quien a su vezse comunica con un controlador particular.

JDBCJDBC

JDBC es una interface hacia SQL, el lenguajecomún de todas las BD relacionales modernas.

Las BD de escritorio cuentan con GUIs paramanipular directamente los datos pero las BDservidor se controlan a través de SQL.

Para conectarse a una BD se debe especificar elnombre de la BD y algunos parámetros adicionales.

JDBCJDBC

Capas JDBCCapas JDBC

• Capa Aplicación (Application Layer)– Conjunto de clases (API) usadas para

hacer llamados a la base de datos através de SQL, obtener y procesar losresultados.

• Capa Manejador (Driver Layer)– Conjunto de clases (API) que se encargan

de establecer, manejar y terminar lacomunicación con un RDBMS(Implementación especifica de un driver)

Capas JDBCCapas JDBC

Driver Layer

Application Layer

Tipo de DriversTipo de Drivers• JDBC-ODBC Bridge (1)

– Las llamadas JDBC son enviadas a una librería ODBC.• Librería Nativa (2)

– Usa librerías nativas en C (Propias del RDBMS), paratrasladar instrucciones JDBC al cliente nativo.

• 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

• Protocolo/Librería Nativa 100% java (4)– Las llamadas JDBC son convertidas directamente al

protocolo del RDBMS

Tipo de DriversTipo de Drivers

• JDBC-ODBC Bridge (1)– Las llamadas JDBC son enviadas a una librería ODBC.

Tipo de DriversTipo de Drivers

• Librería Nativa (2)– Usa librerías nativas en C (Propias del RDBMS), para

trasladar instrucciones JDBC al cliente nativo delRBDMS.

Tipo de DriversTipo de Drivers• Protocolo de red.(3)

– Las llamadas JDBC son trasladadas a un protocoloindependiente de RDBMS y enviadas a un servidorintermedio (AppServer) sobre un socket TCP/IP

Tipo de DriversTipo de Drivers

• Protocolo/Librería Nativa 100% java (4)– Las llamadas JDBC son convertidas directamente al

protocolo del RDBMS

Modelo Two-TierModelo Two-TierCliente/ServidorCliente/Servidor

B.D.

Aplicación Cliente

Aplicación Cliente

Firewall

Drivers JDBCDrivers JDBC

• JDBC/OCI

• Oracle thin

• Servidor de drivers JDBC

Drivers JDBCDrivers JDBC

ocioci :

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 OCIModelo usando OCI

B.D.

AplicaciónJava

AplicaciónJava

Net8Firewall

DriverJDBC/OCI

DriverJDBC/OCI

Net8

Drivers JDBCDrivers JDBC

ThinThin :

• Funciona para internet• No “requiere” driver en el cliente• Es 100% Java• Funciona solamente sobre TCP/IP• No ofrece completa funcionalidad con

Net8

Modelo thinModelo thin

B.D.

AplicaciónJava

AplicaciónJava

Net8Firewall

Driverthin

Driverthin

Net8

Net8

Instalar el DriverInstalar el Driver

• Para nuestro caso bajar la libreríaclasses12.zipclasses12.zip si se esta usando oracle8.1.5 o superior, de lo contrario usarla librería classes111.zipclasses111.zip ubicadas enla página

http://technet.oracle.com/softwarehttp://technet.oracle.com/software

Instalar el DriverInstalar el Driver

• Coloquela en el directorio que desee yadicionelo al classpath

path\classes12.zippath\classes12.zip

• Sugerencia: colocarlo en:...jdk1.3\jre\lib\ext\classes12.zip...jdk1.3\jre\lib\ext\classes12.zip• adicione el directorio al classpath

VerificaciónVerificaciónimport java.sql.*;

public class DriverLoader{ public static void main (String arg[]){

try{ DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver()); }catch(Exception e){

e.printStackTrace();}

}}

VerificaciónVerificación

• Si hay error se despliega el mensaje

Class oracle.jdbc.driver.OracleDriver not found in type declaration

DriverManager.registerDriver(new oracle.jdbc.driver.oracleDriver());

^

Usando el metodo forName de la clase(java.lang).

•Cargar y registrar el driver a memoria.– Class.forName(“ clase java del driver”)

Ejemplos:Class.forName(“sun.jdbc.odbc.JdbcOdbcDriver”);//Odbc -tipo 1

Class.forName(“oracle.jdbc.driver.OracleDriver”); //Oracle - Tipo 4

OtraOtra forma de registrar forma de registrar eleldriverdriver

Capa AplicaciónCapa Aplicación

• Clases/Interfaces que permiten interactuar conel RDBMS a través de instrucciones SQL (Select,DDL, DML):–– ConnectionConnection–– StatementStatement–– PreparedStatementPreparedStatement–– CallableStatementCallableStatement–– ResultSetResultSet–– ResultMetaDataResultMetaData

• Se agrupan bajo el paquete java.sql.*

Capa AplicaciónCapa Aplicación

• Connection– Representa una sesión con la conexión a la base de datos– La función principal de connection, es crear objetos tipo

Statement (Statement,PreparedStatement,CallableStatement)

– Cómo se crea:• Connection conn=DriverManager.getConnection ( url );• Connection conn=DriverManager.getConnection ( url,

user, password );

– Características transaccionales:• conn.setAutocommit(false/true);• conn.rollback();• conn.commit();

Capa AplicaciónCapa Aplicación

• Statement– Es el canal a través del cual se le envían 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 conexión se pueden tener n objetos Statement.– Métodos de ejecución:

• Ejecución de instrucciones SELECT– ResultSet resultadoSelect =

stmt.executeQuery(sql);• Ejecución de instrucciones DML/DDL

– int resultadoDML = stmt.executeUpdate(sql);

Capa AplicaciónCapa Aplicación• PreparedStatement (Hereda de Statement)

– Se usa cuando se llama “n” veces la mismainstrucción.

– Permite el manejo de parámetros dinámicos– Ventajas técnicas sobre Statement:

• Si se tiene Statement la instrucción SQL es compilada cadavez que se usa.

• Con PreparedStatement solo compila una vez.– Como se crea:

• PreparedStatement stmt= conn.prepareStatement(sql);– Ejemplo:

• sql = “SELECT * FROM productos WHERE id=? And fecha=?”• PreparedStatement stmt= conn.prepareStatement(sql);

Capa Aplicación Capa Aplicación (PreparedStatement)(PreparedStatement)

• (continuación ejemplo)• sql = “SELECT * FROM productos WHERE id=? And fecha=?”

– Parámetro 1 : id– Parámetro 2 : fecha

• Como se pasan los parámetros– stmt.setInt(1,“10”); //Si quisiéramos el producto 10– stmt.setDate(2,“03/09/2001”) //Los productos creados hoy.

• Otros tipo de datos (setXXX)

Metodo Tipo dato SQL

setBoolean Bit

setDate Date

setDouble Double

setFloat Float

setString String,Varchar

Capa AplicaciónCapa Aplicación

• CallableStatemet (Hereda de Statement)– Es usada para ejecutar StoredProcedure.– Proporciona métodos para mapear los parámetros

de salida del Stored Procedure– Como se crea:

• CallableStatement cs = conn.prepareCall("{call<StoredProc>}");– Donde <StoredProc>, es el nombre del StoredProcedure

• Métodos para mapear los parámetros– cs.registerOutParameter (indiceParametro, tipodato);

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

Capa AplicaciónCapa Aplicación

• ResultSet– Tiene el mismo comportamiento de un cursor– Define los métodos, que permiten acceder al

cursor generado como resultado de la ejecución deun 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 métodoResultSet.getXXX (xxx indica el tipo de datos)

Capa AplicaciónCapa Aplicación

• ResultSet (Continuación)– 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”));• }

– Tipo de metodos getXXX

Metodo Tipo dato SQL

getBoolean Bit

getDate Date

getDouble Double

getFloat Float

getString String,Varchar

Capa AplicaciónCapa Aplicación

• ResultSetMetaData– Contiene información acerca de las propiedades de cada una

de las columnas, que conforman el cursor/tabla, que fueobtenida en la ejecución 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();

El driver manager intentará encontrar un drivercargado que pueda usar el protocolo especificado enla URL.

Mediante la instancia de Connection (conexión)obtenida a través de getConnection se puedenejecutar expresiones SQL.

ConexiónConexión a la B.D. con JDBC a la B.D. con JDBCString url = “jdbc:oracle:thin:@nut.javeriana.edu.co:1521:DEPTO”String usuario = “miNombre”;String password = “miClave”;

ConnectionConnection conexión = DriverManagerDriverManager.getConnectiongetConnection(url,usuario,password);

ConexiónConexión a la Base de a la Base de Datos Datosimport 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();}

}}

ConexiónConexión

• Los tres métodos de conexión son:

public static synchronized Connection getConnectiongetConnection(String url)throws SQLException

public static synchronized Connection getConnectiongetConnection(String url,String user, String password) throws SQLException

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

Operaciones sobre la baseOperaciones sobre la basede Datosde 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.*;

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 = “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();}

}}

Ejemplo Ejemplo executeUpdateexecuteUpdate

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”;

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();}

}}

Ejemplo Ejemplo executeQueryexecuteQuery

En resumen, suponiendo que queremos revisar losdatos 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 métodos que permiten inspeccionar el‘ResultSet’ aceptan el número del campo, contadosa partir de uno, o el nombre del campo.

JDBCJDBC

Java intentará realizar las conversiones detipos SQL a tipos Java de la forma más“razonable” posible.

La correspondencia entre tipos SQL comunesy los tipos de Java se ilustran en las siguientestablas:

JDBCJDBC

JDBCJDBC•Tipos de datos numéricos

Java SQL Notas

byte TINYINT 8 bitsint INTEGER o INT 32 bitsshort SMALLINT 16 bitslong BIGINT 64 bitsdouble DOUBLE 15 digitos de precisióndouble FLOAT 15 digitos de precisiónfloat REAL 7 digitos de precisión

java.math.BigDecimal NUMERIC Números de precisión específicajava.math.BigDecimal DECIMAL Números de precisión específica

JDBCJDBC•Tipos de datos caracterJava SQL Notas

String CHAR o CHARACTER Cadena rellenada con espaciosString VARCHAR CadenaString LONGVARCHAR Se puede leer usando un flujo de

entradabyte[] BINARY La longitud del arreglo es la del campobyte[] VARBINARY La longitud del arreglo es la del campobyte[] LONGVARBINARY Se puede leer usando un flujo de

entrada

JDBCJDBC

Otros tipos de datos

Java SQL Notas

boolean BIT true/falsejava.sql.Data DATE mm / dd / aajava.sql.Time TIME hh / mm / ssjava.sql.TimeStamp TIMESTAMP Fecha y hora en

nanosegundos

JDBCJDBC• Modelo de uso

Connection conexión = null;Statement declaración = null;try { Class.forName(“sun.jdbc.odbc.JdbcOdbcDriver”);

conexión = DriverManager.getConnection(“jdbc:odbc:NombreBD”, “idUsuario”, “contraseña”);

declaración = conexión.createStatement(); ResultSet resultado = declaración.executeQuery(“instrucción 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”);}

JDBCJDBC• Usando excepciones// ExcepcionesEnJDBC Parte 1/2import java.sql.*;

public class ExcepcionesEnJDBC { public static void main(String argv[]) { Connection conexión = null; Statement declaración = null; try { Class.forName(“sun.jdbc.odbc.JdbcOdbcDriver”); } catch(ClassNotFoundException e) { System.err.println(“Error: controlador no encontrado.”); System.exit(1); } try { conexión = DriverManager.getConnection(“jdbc:odbc:NombreBD”, “idUsuario”, “contraseña”); } catch (SQLException e) { System.err.println(“Error: falla en conexión a la base de datos.”); System.exit(2); }

JDBCJDBC// ExcepcionesEnJDBC Parte 2/2

try { declaración = conexión.createStatement(); } catch (SQLException e) { System.err.println(“Error: imposible crear la declaración.”); System.exit(3); }

try { ResultSet resultado = declaración.executeQuery(“instrucción 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”); } }}

JDBCJDBCDeclaraciones preparadas.Una declaración preparada es una consultaespecial en la que se mantiene la estructura y secambia solamente el dato que se requiera.

SELECT * FROM NombreTabla WHERE campo=variable

SELECT * FROM NombreTabla WHERE campo=?

Connection conexión = null; Statement declaración = null; ... PreparedStatement declaraciónPreparada = conexión.prepareStatement( “SELECT * FROM NombreTabla WHERE campo=?”); declaraciónPreparada.setString(n, “valorCampo”); ... ResultSet resultado = declaraciónPreparada.executeQuery();

RecursosRecursos

– Sitio oficial JDBC• java.sun.com/jdbc

– Buscar drivers.• http://industry.java.sun.com/products/jdbc/drivers

– Tutorial JDBC• http://java.sun.com/j2se/1.3/docs/guide/jdbc/getstart/Gettin

gStartedTOC.fm.html– Otros sitios de interes

• www.theserverside.com• www.jdance.com• www.jguru.com