lpiii tema5 - jdbc

31
JDBC

Upload: kjrojas

Post on 29-Jun-2015

2.140 views

Category:

Technology


1 download

TRANSCRIPT

Page 1: Lpiii tema5 - jdbc

JDBC

Page 2: Lpiii tema5 - jdbc

Introducción

Java proporciona conectividad a muchos tipos de base de datos a través de

su API de Conectividad a Base de Datos Java ( Java Data Base Connectivity -

JDBC)

Para desarrollar programas que interactuen con bases de datos en Java, se

requiere esencialmente:

Una base de datos relacional

Una interfaz con Java (a través del API JDBC)

Conocimiento básico de las sentencias SQL

Page 3: Lpiii tema5 - jdbc

Pasos Involucrados en el Accesoa Bases de Datos

1. Se debe cargar en memoria el controlador (driver) que habilitará laconexión entre el programa Java y el sistema de base de datos

2. A través de este controlador, se establece una conexión a la basede datos

3. Una vez establecida la conexión, por medio de esta se ejecutan lassentencias SQL que sean requeridas

4. Al finalizar se debe cerrar todas las conexiones a bases de datosque estén activas

Page 4: Lpiii tema5 - jdbc

• Algunas de las clases e interfaces de esta api son:

– java.sql.DriverManager

– java.sql.Driver

– java.sql.Connection

– java.sql.Statement

– java.sql.ResultSet

– java.sql.ResultSetMetaData

– java.sql.DabataseMetaData

– java.sql.PreparedStatement

– java.sql.CallableStatement

El API JDBC

Page 5: Lpiii tema5 - jdbc

DriverManager

«interface»

Connection

«interface»

ResultSet

«interface»

Statement

«interface»

DatabaseMetaData

«interface»

ResultSetMetaData

«interface»

Driverutiliza

crea

genera

genera retorna

genera

Relación entre las Clases e

Interfaces JDBC

Page 6: Lpiii tema5 - jdbc

• JDBC provee cuatro tipos de controladores:

- Controlador JDBC-ODBC (Tipo 1)

- Controlador API-Nativo (Tipo 2)

- Controlador de Protocolo de Red (Tipo 3)

- Controlador Protocolo-Nativo (Tipo 4)

Tipos de Controladores JDBC

Page 7: Lpiii tema5 - jdbc

• Para cargar el controlador, se debe usar el método forName en la claseClass con el nombre del controlador como argumento

• Ejemplos del proceso de carga de un driver:

- MS Access y MS SQL Server

Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");

- IBM UDB DB2

Class.forName("COM.ibm.db2.jdbc.app.DB2Driver");

- MySQL

Class.forName("com.mysql.jdbc.Driver");

- PostgreSQL

Class.forName("org.postgresql.Driver");

Cargar el Controlador

Page 8: Lpiii tema5 - jdbc

• La clase DriverManager es responsable por buscar las diferentesimplementaciones JDBC que puedan existir en un sistema y administrarlos controladores JDBC

• La clase DriverManager provee un método llamadogetConnection(), por medio de este se puede obtener una conexióna una bases de datos

• Este método toma tres argumentos:

– El URL de la base de datos

protocol:<subprotocol>:<subname>

– Identificación del usuario

– Clave del usuario

Crear una Conexión

Page 9: Lpiii tema5 - jdbc

import java.sql.*;public class PruebasJDBC {

public static void main(java.lang.String[] args) {Connection conn = null;try {

Class.forName("COM.ibm.db2.jdbc.app.DB2Driver");System.out.println("Driver cargado...");conn = DriverManager.getConnection(

"jdbc:db2:Sample", "db2admin", "db2admin");

System.out.println("Conexión establecida...");} catch (ClassNotFoundException e) {

System.out.println("Driver no encontrado");} catch (SQLException e) {

System.out.println("Error DB: " + e);} finally {

try {if (conn != null) conn.close();

} catch (SQLException se){}}

}} Debemos realizar un

manejo adecuado de

las excepciones que

pueden generarse

Crear una Conexión

Page 10: Lpiii tema5 - jdbc

• Las sentencias SQL más usadas son las siguientes:

– UPDATE

– INSERT

– DELETE

– SELECT

• La interfaz Statement provee métodos para hacer estas llamadas

• El método executeUpdate() retorna el numero de registros afectadospor la sentencia SQL

• El método executeQuery() retorna el conjunto de registrosseleccionados por la consulta (ResultSet)

Crear Objetos Statement

Page 11: Lpiii tema5 - jdbc

import java.sql.*;public class PruebasJDBC1 {

public static void main(String[] args) {Connection conn = null;String u = "db2admin";String p = "db2admin";String drv = "COM.ibm.db2.jdbc.app.DB2Driver";try {

Class.forName(drv);conn = DriverManager.getConnection("jdbc:db2:IBM",u,p);Statement stmt = conn.createStatement();String sql = "INSERT INTO ESTUDIANTE "+

"VALUES('Pedro','Perez',123)";stmt.executeUpdate(sql);System.out.println("Actualización exitosa ");

} catch (Exception e){System.out.println("Error: "+e);

}finally {try {if (conn != null)conn.close();}catch (SQLException se){}

}}

}

Crear Objetos Statement

Page 12: Lpiii tema5 - jdbc

• Al utilizar el método executeQuery() de un Statement, es necesarioutilizar una referencia a la interfaz ResultSet para manipular los datosretornados por el Statement

• Para iterar a través de un ResultSet se utiliza el método next(), quepermite mover el cursor desde su posición actual hasta el proximo registro

• Inicialmente el cursor del ResultSet se encuentra antes del primerregistro

Usar ResultSet

Page 13: Lpiii tema5 - jdbc

• La interfaz ResultSet provee una serie de métodos que permiten extraerlos datos contenidos en el registro apuntado por el cursor, entre estos setienen:

- int getInt(String);

int getInt(int);

- String getString(String);

String getString(int);

- float getFloat(String);

float getFloat(int);

• Existe un par de métodos similares para cada tipo de dato compatible conSQL

Usar ResultSet

Page 14: Lpiii tema5 - jdbc

import java.sql.*;

public class PruebasJDBC2 {

public static void main(String[] args) {

...

try {

...

Statement stmt = conn.createStatement();

String sql = "SELECT * FROM ESTUDIANTE";

ResultSet r = stmt.executeQuery(sql);

while(r.next())

System.out.println(r.getString("nombre")+

" "+ r.getInt("ci"));

} catch (Exception e){

System.out.println("Error: "+e);

}finally {

try {if (conn != null)conn.close();}

catch (SQLException se){}

}

}

}

Usar ResultSet

Page 15: Lpiii tema5 - jdbc

• La palabra Metadata implica información acerca de información

• La interfaz ResultSetMetaData provee información acerca de losobjetos ResultSet

• La clase DatabaseMetaData está relacionado con el objetoConnection. Por medio de esta se puede obtener información de labase de datos a la cual se está conectado por medio de Connection

Interfaces MetaData

Page 16: Lpiii tema5 - jdbc

• Algunos de los métodos contenidos en esta interfaz son los siguientes:

- int getColumnCount()

- String getColumnLabel(int column)

- String getColumnName(int column)

- String getTableName(int column)

- int isNullable(int column)

- boolean isReadOnly(int column)

ResultSetMetaData

Page 17: Lpiii tema5 - jdbc

DatabaseSetMetaData

• Alguno de los métodos contenidos en esta interfaz son los siguientes:

- String getDriverName()

- String getURL()

- String getUserName()

- boolean isReadOnly()

Page 18: Lpiii tema5 - jdbc

• La especificación JDBC provee dos clases adicionales, provenientes de lainterfaz Statement para permitir al programador realizar programaciónsofisticada de base de datos

• Estas interfaces son:

– PreparedStatement

– CallableStatement

Extensiones de la Interfaz Statement

Page 19: Lpiii tema5 - jdbc

• Existe una manera de crear sentencias SQL una vez y usarla cada vezque quiera correrla

• Esto se logra a través de PreparedStatement de JDBC

• Esta interfaz permite construir las sentencias SQL requeridas una vez yejecutarlas cualquier número de veces en la aplicación

• Cuando un objeto PreparedStatement es creado, la sentencia SQL seda como argumento

• La sentencia SQL debe ser enviada al DBMS inmediatamente donde escompilada una vez

PreparedStatement

Page 20: Lpiii tema5 - jdbc

• En tiempo de construcción el PreparedStatement no conoce losvalores que determinan el resultado de su ejecución

• Solo las posiciones de dichos valores son conocidas en el momento de sucreación, las mismas son indicadas con el símbolo “?”

PreparedStatement ps;

ps = conn.preparedStatement("select * from

tabla "+ "where c1=? ")

PreparedStatement

Page 21: Lpiii tema5 - jdbc

import java.sql.*;

public class PruebasJDBCPrepared {

static String db="jdbc:db2:IBM";

static String drv="COM.ibm.db2.jdbc.app.DB2Driver";

public static void main(String []args){

Connection conn = null;

PreparedStatement ps = null;

try{

Class.forName(drv);

conn = DriverManager.

getConnection(db,"db2admin","db2admin");

String sql = "select * from estudiante where

ci=?";

ps = conn.prepareCall(sql);

ps.setInt(1,123);

ResultSet rs = ps.executeQuery();

//Continúa...

PreparedStatement

Page 22: Lpiii tema5 - jdbc

if(rs.next())

System.out.println("Encontrado");

else

System.out.println("No Encontrado");

}catch(Exception e){

System.out.println("Error: "+e);

}finally{

try{

if(conn!=null)

conn.close();

}catch(Exception e){}

}

}

}//Fin de la clase PruebasJDBCPrepared

PreparedStatement

Page 23: Lpiii tema5 - jdbc

• Un procedimiento almacenado (stored procedure) permite asociar unconjunto de sentencias SQL a un único nombre, para luego ejecutarlashaciendo uso de ese nombre en cualquier momento

• Los procedimientos almacenados son muy rápidos, ya que se ejecutandentro de la base de datos y están previamente compilados

• Por medio de los objetos de la interfaz CallableStatement se puedenejecutar dentro del código Java

Procedimientos Almacenados

Page 24: Lpiii tema5 - jdbc

• Una transacción puede ser definida como un conjunto de operaciones quedeben ser ejecutadas como una unidad

• De fallar una de las operaciones, falla en su totalidad la transacción

• Una transacción es una “unidad de trabajo”

• Cuando se realiza cualquier operación de INSERT, UPDATE o DELETE éstase ejecuta con auto-commit explícito por omisión

• Para habilitar control sobre las transacciones de la base de datos se usa elmétodo setAutoCommit(boolean autoCommit)

Administración de Transacciones

Page 25: Lpiii tema5 - jdbc

...

try{

// Auto commit deshabilitado

conn.setAutoCommit(false);

// Insertamos en la primera tabla

stmt = conn.createStatement();

stmt.executeUpdate("INSERT INTO table1 ...");

stmt.close();

// Insertamos en la segunda tabla

stmt = conn.createStatement();

stmt.executeUpdate("INSERT INTO table2 ...");

stmt.close();

// Compromete los cambios en la base de datos

conn.commit();

}catch(SQLException e){

try {

conn.rollback();

}catch( SQLException sqle2 ){}

}...

Administración de Transacciones

Page 26: Lpiii tema5 - jdbc

• JDBC provee soporte limitado de cursores.

• Permite a una aplicación obtener un cursor asociado con el resultado através del método de ResultSet.getCursorName()

• El desplazamiento dentro del cursor es provisto recientemente en lasimplementaciones de JDBC, algunos controladores pueden no permitirlo

• Para hacer uso de cursores desplazables se debe activar estacaracterística

Soporte de Cursores

Page 27: Lpiii tema5 - jdbc

Uso típico de cursores:

stmt = conn.createStatement(

ResultSet.TYPE_SCROLL_INSENSITIVE,

ResultSet.CONCUR_UPDATABLE);

rs = stmt.executeQuery("SELECT * FROM tableName”);

rs.absolute(7);

System.out.println(rs.getString(1));

while (rs.next(){

// ...

}

rs.beforeFirst();

while (rs.next()) {

// ...

}

Soporte de Cursores

Page 28: Lpiii tema5 - jdbc

• Especialmente con procedimientos almacenados, se puede estar interesadosen una aplicación que retorne múltiples resultados

• Para obtenerlos, se debe hacer uso de los siguientes métodos:

boolean getMoreResults();

ResulSet getResultSet();

Múltiples Resultados

Page 29: Lpiii tema5 - jdbc

• Un uso típico de esta característica es el siguiente:

...

while(stmt.getMoreResults()) {

rs = stmt.getResultSet();

while (rs.next()) {

// algunas tareas

}

}

...

Múltiples Resultados

Page 30: Lpiii tema5 - jdbc

• Algunas de las clases de soporte son las siguientes:

SQLException

SQLWarning

DataTruncation

Date, Time y Timestamp

Types

Clases de Soporte JDBC

Page 31: Lpiii tema5 - jdbc

Resumen

• Se entendió como usar clases heredadas de Statement

• Se aprendió acerca de procedimientos almacenados

• Se discutió acerca de otras funcionalidades JDBC:

- como administración de transacciones,

- soporte de cursores y

- procesamiento de resultados múltiples.

• Se listaron algunas de las clases de soporte JDBC en Java