lpiii tema5 - jdbc

Post on 29-Jun-2015

2.140 Views

Category:

Technology

1 Downloads

Preview:

Click to see full reader

TRANSCRIPT

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

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

• 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

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

• 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

• 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

• 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

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

• 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

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

• 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

• 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

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

• 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

• 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

DatabaseSetMetaData

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

- String getDriverName()

- String getURL()

- String getUserName()

- boolean isReadOnly()

• 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

• 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

• 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

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

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

• 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

• 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

...

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

• 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

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

• 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

• 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

• Algunas de las clases de soporte son las siguientes:

SQLException

SQLWarning

DataTruncation

Date, Time y Timestamp

Types

Clases de Soporte 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

top related