lpiii tema5 - jdbc
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