JDBC
Francisco Javier Solans Benedí
Definición
Configuración
● Para usar las librerías JDBC, es necesario realizar los siguientes pasos: ● Instalar el kit J2SDK (Java 2 Standard Development Kit).
– Por defecto, se incluye el controlodar JDBC-ODBC.
● Desplegar el Driver JDBC (específico para cada base de datos).
– Basta con copiar las librerías (.jar) en la máquina (en el directorio .\java\jre\lib\ext o
indicarlo en el classpath). ● Instalar la base de datos.
B.D.
Driver JDBC
J2SDK
Controladores JDBC (I)
● TiposTipos de driversdrivers JDBC :
● Tipo 1: JDBC-ODBC bridge. ● Tipo 2: Native-API Driver.
● Tipo 3: Network-Protocol Driver. ● Tipo 4: Native-Protocol Driver.
Controladores JDBC (II)
●
Tipo 1: JDBC-ODBC bridge.
Tipo 1
● El driver está implementado en la clase sun.jdbc.odbc.JdbcOdbcDriver y viene adjunto en Java 2 SDK, Standard Edition.● Utiliza el estándar ODBC de la plataforma Microsoft.
● Ventajas:
● Nos garantiza el acceso a casi todas las bases de datos comerciales
(solución provisional). ● Desventajas: ● Lento. Puente JDBC-ODBC Aplicación Java JDBC Servidor base de datos Base de datos Gestor de controladores JDBC Controlador ODBC
Controladores JDBC (III)
●
Tipo 2: Native-API Driver.
Tipo 2
● Implementación del driver que utiliza las librerías del lado cliente de la base de datos.● No está implementado totalmente con Java.
● Desventajas:
● Dependiente del sistema operativo.
Aplicación Java Controlador API parcialmente nativa-Java Servidor base de datos Base de datos JDBC
Controladores JDBC (IV)
●
Tipo 3: Network-Protocol Driver.
Tipo 3
● El controlador JDBC traduce las órdenes JDBC a un protocolo de red independiente del SGBD. Este protocolo es finalmente vuelto a traducir al lenguaje específico del SGBD.● Ventajas:
● Nos garantiza en el cliente una aplicación 100% Java.
● Desventajas:
● Necesita pasos intermedios ya que al contrario que el tipo 4, el driver no reside en el cliente sino en la capa intermedia. Protocolo de red (middleware) Servidor base de datos Base de datos Aplicación Java JDBC Controlador JDBC-red 100% Java
Controladores JDBC (V)
●
Tipo 4: Native-Protocol Driver.
Tipo 4
● Implementado 100% Java por lo que es independiente de la plataforma.● Controladores completamente escritos en Java, que traducen las órdenes JDBC directamente al protocolo de red que emplea el SGBD
● Ventajas:
● Solución ideal.
● Desventaja:
● No todas las bases de datos disponen de controladores del tipo 4.
Controlador 100% Java Servidor base de datos Base de datos Aplicación Java JDBC
El paquete java.sql
● La clase DriverManagerDriverManager
● La interfaz DriverDriver
● Constituye la base para poder implementar controladores JDBC.
● La interfaz ConexiónConexión
● Interfaces de sentencias SQL: ● La interfaz StatementStatement
● La interfaz PreparedStatementPreparedStatement ● La interfaz CallableStatementCallableStatement
La clase DriverManager (I)
●
Se encarga de gestionar los controladores JDBC.
●
Registrar los controladores JDBC.
● Class.forName()
●
Establecer una conexión con la base de datos.
● public static synchronized Connection getConnection(String url);
● public static synchronized Connection getConnection(String url, String usuario, String password);
La clase DriverManager (II)
●
Controlar el tiempo de conexión.
● public static void setLoginTimeout(int segundos); ● public static int getLoginTimeout();
●
Presentar mensajes del estado de la conexión.
● public static PrintStream getLogStream();
La interfaz Connection
● Los objetos de esta interfaz son los que representan una conexión con una base de datos.
● Al ejecutar el método getConnection() de la clase DriverManager, se nos devuelve un objeto de la clase Connection.
● CierreCierre de la conexión:
● public abstract void close() throws SQLException.
● EstadoEstado de la conexión:
Interfaces de sentencias SQL
●
Envío de sentencias SQL :
Statement PreparedStatement CallableStatement
La interfaz Statement (I)
● Los objetos de esta interfaz se usan para enviar sentencias simples SQL a bases de datos.
● CreaciónCreación de objetos
– Método createStatement() de la interfaz Connection
● PeticionesPeticiones a la base de datos
● CierreCierre de las peticiones
La interfaz Statement (II)
●
Peticiones simples :
Peticiones simples
● De tipo consulta (query), ej: SELECT
– public abstract ResultSet executeQuery(String sql) throws SQLException
● De modificación (update), ej: UPDATE, INSERT, CREATE TABLE
– public abstract int executeUpdate(String sql) throws SQLException
●
Peticiones más complejas :
Peticiones más complejas
● public abstract boolean execute (String sql) throws SQLException
– true: Petición query
● ResultSet getResultSet () throws SQLException
– false: Petición update
La interfaz Statement (III)
●
Ejemplo :
// Preparar la sentencia
Statement stmt = conn.createStatement() ; // Poner el primer parámetro
ps.setString( 1, id ) ; // Ejecutar la consulta
ResultSet rs = ps.executeQuery("SELECT * FROM equipamientos WHERE id = ?") ; // Iterar por el resultado
while( rs.next() )
La interfaz PreparedStatement (I)
●
Es una interfaz heredada de Statement. Sus instancias son sentencias SQL ya
compiladas en las que podemos introducir uno o más parámetros de entrada.
●
Creación de objetos PreparedStatement
Creación
● public abstract PreparedStatement prepareStatement(String peticion) throws SQLException
●
Paso de parámetros de entrada con setxxx()
Paso de parámetros
● setxxx (posicionParametro valor);
●
Ejecución de la petición
Ejecución
● Métodos análogos a los da la interfaz Statement: execute(), executeQuery() y
La interfaz PreparedStatement (II)
●
Ejemplo :
// Preparar la sentencia
PreparedStatement ps = conn.prepareStatement( "SELECT * FROM equipamientos WHERE id = ?" ) ; // Poner el primer parámetro
ps.setString( 1, id ) ; // Ejecutar la consulta
ResultSet rs = ps.executeQuery() ; // Iterar por el resultado
while( rs.next() )
Procedimientos almacenados (I)
●
Programa escrito en el
Programa
dialecto SQL del sistema gestor de la base de datos que se
dialecto SQL
compila y funciona en el servidor.
●
Ventajas:
Ventajas
● Rapidez de ejecución. ● Seguridad de conjunto.
●
Desventajas:
Desventajas
● No implementado por todos los sistemas gestores de bases de datos.
Procedimientos almacenados (II)
●
Los
procedimientos almacenados estan formados por parámetros de entrada (IN), de
procedimientos almacenados
salida (OUT) y de entrada-salida (INOUT).
●
Existen dos
esquemas
posibles:
●Función:
Función
–
Con parámetro resultado, un tipo particular de
parámetro OUT :
parámetro OUT
●
{? = call nombre_proc([?, ?, ...])}
●Procedimiento :
Procedimiento
–
Sin parámetro resultado:
●
{call nombre_proc ([?, ?, ...])}
Procedimientos almacenados (III)
●
Ejemplo de procedimiento :
CREATE PROCEDURE INSERTAR_SECUENCIA (p_numero VARCHAR2) IS
BEGIN
INSERT INTO secuencia (p_numero) VALUES (p_numero);
END;
●
Ejemplo de función :
CREATE FUNCTION SIGUIENTE (p_numero NUMBER) RETURN NUMBER IS
BEGIN
return p_number – 1; END;
La interfaz CallableStatement (I)
●
Los objetos de esta interfaz contienen llamadas a procedimientos almacenados en el
sistema gestor de bases de datos.
●
Creación de objetos :
Creación
● public abstract CallableStatement prepareCall(String llamada) throws SQLException
●
Paso de parámetros :
Paso
●
Registrar los
parámetros de salida (OUT) :
parámetros de salida
– public abstract void registerOutParameter(int posicionParametro, int tipoJDBC)
throws SQLException
●
Inicializar los
parámetros de entrada (IN) :
parámetros de entrada
La interfaz CallableStatement (II)
●
Ejecutar el procedimiento :
– Métodos executeUpdate(), executeQuery(), execute() heredados de la interfaz
padre PreparedStatement.
●
Recoger los valores de los parámetros OUT :
La interfaz CallableStatement (III)
●
Ejemplo de parámetros IN, OUT :
// Llama al procedimiento ejemplo
CallableStatement cstmt = con.prepareCall(“{call ejemplo(?, ?)”); // Registro de los parámetros OUT
cstmt.registerOutParameter(1, java.sql.Types.TINYINT) // Registro de los parámetros IN
cstmt.setBoolean(2, true); // Ejecuta el procedimiento cstmt.executeQuery(); // reenvia los valores
La interfaz CallableStatement (IV)
●
Ejemplo de parámetros INOUT :
CallableStatement cstmt = con.prepareCall(“{call revisaTotal (?)”);
// se pone 25 en el parámetro que el controlador enviará a la base de datos como un TINYINT de SQL cstmt.setByte(1,25);
// se registra el parámetro como un TINYINT de SQL cstmt.registerOutParameter(1, java.sql.Types.TINYINT); // se ejecuta el procedimiento
cstmt.executeUpdate();
// Se recoge el valor obtenido (TINYINT) como un byte de Java byte x = cstmt.getByte(1);
Transacciones
● Se emplean para conservar la integridad de la información. Con ello, se asegura de que ciertas operaciones, que se deben realizar de forma conjunta, o se realizan completamente (commit), o no se realiza ninguna, deshaciéndose los cambios parciales (rollback).
● Por defecto, se abre en auto-commit, es decir que tras cada comando, los cambios se escriben el disco duro del SGBD.
● Para implementar las transacciones en JDBC, la interfaz Connection viene con una serie de métodos:
● public abstract setAutoCommit(boolean autoCommit) throws SQLException ● public boolean getAutoCommit() throws SQLException
Las interfaces xxMetaData
● La interfaz DatabaseMetaDataDatabaseMetaData
● Da información acerca del SGBD, desde la forma en la que se estructura hasta las funciones que soporta.
● Ejemplo :
DatabaseMetaData dma = con.getMetaData ();
System.out.println("\nConnected to: " + dma.getURL()); System.out.println("Driver: " + dma.getDriverName()); System.out.println("Version: " + dma.getDriverVersion());
● La interfaz ResultSetMetaDataResultSetMetaData
● Se consigue la información acerca del resultado de una consulta (ResultSet).
● Ejemplo :
ResultSetMetaData rsmd = rs.getMetaData (); int numCols = rsmd.getColumnCount (); for (int i=1; i<=numCols; i++) {
if (i > 1) System.out.print(",");
System.out.print(rsmd.getColumnLabel(i)); }
Obtención de resultados
●
La clase
Types :
Types
● Se definen los tipos de datos para los SGBD.
● Los tipos de datos del SGBD no coinciden con los de Java por lo que se realizan los conversiones de JDBC a Java y de Java a JDBC.
La clase Types
● Es una clase del paquete java.sql que deriva de la clase Object.
● Los tipos de datos del SGBD no coinciden con los de Java; además cada SGBD posee sus propios tipos de datos.
● Tipos de datos definidos por la clase Types:
● BIGINT, BINARY, BIT, CHAR, DATE, DECIMAL ...
● Conversión de tipos JDBC a JavaJDBC a Java :
● BIGINT = long, BINARY = byte[], VARBINARY = byte[], ...
● Conversión de tipos Java a JDBC Java a JDBC :
La interfaz ResultSet (I)
●
Los objetos de esta interfaz son el resultado de una sentencia de tipo query
(consulta).
● El objeto de la interfaz ResultSet se obtiene al realizar una consulta a una base de datos mediante el método executeQuery() de la interfaz Statement.
●
Moverse por las filas:
● public abstract boolean next() throws SQLException
●
Desplazamiento por columnas: la serie de métodos
getxxx
()
● public abstract boolean getString(int numeroColumna) throws SQLException ● public abstract boolean getString(String nombreColumna) throws SQLException
La interfaz ResultSet (II)
●
Ejemplo :
String nombre = null, apellido = null;
Statement orden = conexión.createStatement();
ResultSet r = peticion.executeQuery(“SELECT nombre, apellido FROM clientes”); while (r.next()) {
// Imprime los valores de cada fila nombre = r.getString(“nombre”) ;
apellido = r.getString(2); // Cojo la segunda columna: “apellido” System.out.println(“Nombre: ” + nombre + “ Apellido: “ + apellido); }