Departamento de Matemticas y Computacin Ingeniera Tcnica en

  • Slides: 78
Download presentation
Departamento de Matemáticas y Computación Ingeniería Técnica en Informática de Gestión Programación de Bases

Departamento de Matemáticas y Computación Ingeniería Técnica en Informática de Gestión Programación de Bases de Datos JDBC Java Database Connectivity Logroño, 18 de Enero de

Bibliografía n n n JDBC API Tutorial and Reference, Third Edition. Maydene Fisher et

Bibliografía n n n JDBC API Tutorial and Reference, Third Edition. Maydene Fisher et al. Addison. Wesley Pub Co; 3 rd edition (June 11, 2003). ISBN: 0321173848 Java Programming with Oracle JDBC. Donald Bales. O'Reilly (January 2002). ISBN: 0 -596 -00088 -X Principles of DB Systems with Internet and Java. G. Riccardi. Addison Wesley 2001. ISBN: 02 -0161 -247 -X Java Oracle Database Development. David J. Gallardo. Prentice Hall PTR (2003). ISBN: 0 -13 -046218 -7 JDBC: Practical Guide for Java Programmers. Gregory Speegle. Morgan Kaufmann, 1 st Ed (nov, 2001). ISBN: 1558607366. Database Programming with JDBC and Java, 2 nd Edition. George Reese. O'Reilly, 2000. ISBN: 1565926161 Java Database best Practices. George Reese, O’Reilly, 2003. ISBN: 0 -596 -005229 JDBC™ Guide: Getting Started. Copyright © 1996, 1997, Sun Microsystems, Inc. Documentación sobre JDBC. http: //java. sun. com/j 2 se/1. 4. 2/docs/guide/jdbc/index. html. Oracle 9 i JDBC Developer’s Guide and Reference. Copyright © 1999, 2001 Oracle Corporation. Effective Oracle by design. Thomas Kyte. Oracle Press, 2003. ISBN: 0 -07 -223065 -7 Departamento de Matemáticas y Computación Ingeniería Técnica en Informática de Gestión Programación de Bases de © Francisco J. García Izquierdo (2)

Objetivos n Profundizar en la estrategia de programación CLI, particularizando para Java l n

Objetivos n Profundizar en la estrategia de programación CLI, particularizando para Java l n n Conocer el lugar de JDBC en la arquitectura de las aplicaciones con acceso a BD Evaluar las ventajas del uso de un API estándar de acceso a BD Dominar el proceso de trabajo con JDBC Dominar en un 50% el API JDBC l l n Departamento de Matemáticas y Computación Conocer la estructura habitual de las librerías CLI a través del caso particular de Java Ser capaz de conectar con BD remotas Ser capaz de realizar consultas y actualizaciones sobre una BD remota Ser capaz de recabar información sobre la BD remota Ser capaz de gestionar la transaccionalidad en JDBC Conocer las aportaciones de las nuevas especificaciones JDBC 2 y 3 Ingeniería Técnica en Informática de Gestión Programación de Bases de © Francisco J. García Izquierdo (3)

Agenda n n n n n Introducción Drivers JDBC La clase Driver. Manager Conexiones

Agenda n n n n n Introducción Drivers JDBC La clase Driver. Manager Conexiones Ejecución de instrucciones Transacciones y SQL Cuando las cosas van mal Temas avanzados JDBC 2 Departamento de Matemáticas y Computación Ingeniería Técnica en Informática de Gestión Programación de Bases de © Francisco J. García Izquierdo (4)

Introducción Departamento de Matemáticas y Computación n JDBC es un conjunto de clases e

Introducción Departamento de Matemáticas y Computación n JDBC es un conjunto de clases e interfaces Java para la ejecución de sentencias SQL (ver Java. Doc). n Es el CLI de Java n Ha sido desarrollado conjuntamente por Java. Soft, Sybase, Informix, e IBM entre otros. n JDBC permite manipular cualquier base de datos SQL. No es necesario hacer un programa para manipular Oracle, otro para Sybase, etc. . . Un mismo programa puede manipular cualquier base de datos. n Uniendo Java con JDBC tenemos programas que se pueden ejecutar en cualquier plataforma y que pueden manipular cualquier base de datos. n Las clases e interfaces JDBC se encuentran en el paquete java. sql. Ingeniería Técnica en Informática de Gestión Programación de Bases de © Francisco J. García Izquierdo (5)

Proceso de trabajo con JDBC Aplicación JDBC Connection create. Statement get. Connection Statement execute.

Proceso de trabajo con JDBC Aplicación JDBC Connection create. Statement get. Connection Statement execute. Query Gestor de drivers Result. Set Driver A Driver B Departamento de Matemáticas y Computación Ingeniería Técnica en Informática de Gestión Programación de Bases de © Francisco J. García Izquierdo (6)

Proceso de trabajo con JDBC n El proceso de trabajo en JDBC consiste en:

Proceso de trabajo con JDBC n El proceso de trabajo en JDBC consiste en: l l l n Conectarse a la base de datos (Driver. Manager). Emitir sentencias SQL (Statement, Prepared. Statement, Callable. Statement). Procesar los resultados (Resul. Set). Ejemplo: con = Driver. Manager. get. Connection( Connection con = Connection Driver. Manager. get. Connection( "jdbc: odbc: misdatos", "login", "password"); Statement stmt = con. create. Statement(); Statement stmt = Result. Set con. create. Statement(); rs = stmt. execute. Query("SELECT d 1, d 2, d 3 FROM Tabla 1"); Result. Set rs = stmt. execute. Query("SELECT (rs. next()) { while (rs. next())while { int x = get. Int(”d 1"); int x = rs. get. Int(”d 1"); String s = get. String(”d 2"); String s = rs. get. String(”d 2"); float f = get. Float(”d 3"); Departamento f de = rs. get. Float(”d 3"); float } Matemáticas y Computación } Ingeniería Técnica en Informática de Gestión Programación de Bases de © Francisco J. García Izquierdo (7)

Agenda n n n n n Introducción Drivers JDBC La clase Driver. Manager Conexiones

Agenda n n n n n Introducción Drivers JDBC La clase Driver. Manager Conexiones Ejecución de instrucciones Transacciones y SQL Cuando las cosas van mal Temas avanzados JDBC 2 Departamento de Matemáticas y Computación Ingeniería Técnica en Informática de Gestión Programación de Bases de © Francisco J. García Izquierdo (8)

El driver JDBC n JDBC es básicamente una colección de interfaces Java (paquete java.

El driver JDBC n JDBC es básicamente una colección de interfaces Java (paquete java. sql). P. ej. l l l n Cada BD concreta implementará los interfaces de una manera particular l n n Departamento de Matemáticas y Computación Connection Statement Result. Set La conexión (Connection) con Oracle no se hace igual que la conexión con Access Para una BD concreta, el conjunto de clases implementación, clases auxiliares y clases de utilidad componen el driver JDBC para esa BD Una misma aplicación puede conectar con distintas BD con sólo cambiar el driver Ingeniería Técnica en Informática de Gestión Programación de Bases de © Francisco J. García Izquierdo (9)

Tipos de drivers n Tipo 1: Puente JDBC-ODBC l l Traduce JDBC a ODBC

Tipos de drivers n Tipo 1: Puente JDBC-ODBC l l Traduce JDBC a ODBC y lo retransmite al driver ODBC de la máquina Es el driver ODBC el que realmente comunica con la BD Se suministra con la JDK pero no incluye JDBC 2 Pegas n n n Tipo 2: Driver JDBC sobre driver nativo de la BD l l Departamento de Matemáticas y Computación Puede ser útil para pruebas pero es lento en producción Necesita del driver ODBC en cliente (menor portabilidad) l Ingeniería Técnica en Informática de Gestión Retransmite JDBC al driver nativo instalado en la máquina Es el driver nativo el que realmente se comunica con la BD Precisa de instalación de driver nativo (menor portabilidad) Programación de Bases de © Francisco J. García Izquierdo ( 10 )

Tipos de drivers (II) n Tipo 3: Driver Java sobre red l l n

Tipos de drivers (II) n Tipo 3: Driver Java sobre red l l n Tipo 4: Driver puro Java con protocolo nativo l Departamento de Matemáticas y Computación Traduce las llamadas JDBC a un protocolo de red independiente de la plataforma que contacta con el servidor El servidor traduce esas peticiones al protocolo concreto de cada BD Usa middleware en el servidor de red que es capaz de conectar a los clientes puros Java a muchas bases de datos diferentes Rápido, independiente de la plataforma y no requiere de instalación en el cliente l Ingeniería Técnica en Informática de Gestión Traduce las JDBC al protocolo específico de la BD Y contacta directamente con ella Programación de Bases de © Francisco J. García Izquierdo ( 11 )

Tipos de drivers (III) Driver ODBC Departamento de Matemáticas y Computación Ingeniería Técnica en

Tipos de drivers (III) Driver ODBC Departamento de Matemáticas y Computación Ingeniería Técnica en Informática de Gestión Programación de Bases de © Francisco J. García Izquierdo ( 12 )

El interface Driver y la clase Driver. Manager n El interface Driver especifica los

El interface Driver y la clase Driver. Manager n El interface Driver especifica los métodos que todo driver JDBC debe implementar. n Será necesario un driver por cada tipo de base de datos que se desee utilizar (un driver para Oracle, otro para My. SQL, etc. . . ) y será el encargado de abrir conexiones con las mismas (Connection). n Ejemplos de drivers l l n n Departamento de Matemáticas y Computación sun. jdbc. odbc. Jdbc. Odbc. Driver oracle. jdbc. driver. Oracle. Driver com. microsoft. jdbc. sqlserver. SQLServer. Driver com. mysql. jdbc. Driver No se suele trabajar directamente con la clase concreta. El Driver. Manager agrupa los drivers y es el encargado de entregar el Driver adecuado para cada base de datos. Ingeniería Técnica en Informática de Gestión Programación de Bases de © Francisco J. García Izquierdo ( 13 )

Agenda n n n n n Introducción Drivers JDBC La clase Driver. Manager Conexiones

Agenda n n n n n Introducción Drivers JDBC La clase Driver. Manager Conexiones Ejecución de instrucciones Transacciones y SQL Cuando las cosas van mal Temas avanzados JDBC 2 Departamento de Matemáticas y Computación Ingeniería Técnica en Informática de Gestión Programación de Bases de © Francisco J. García Izquierdo ( 14 )

Clase Driver. Manager n n n Es la capa de gestión de JDBC Se

Clase Driver. Manager n n n Es la capa de gestión de JDBC Se sitúa entre la aplicación que usará JDBC y los drivers JDBC de la BD Guarda una lista de los drivers disponibles y … … establece la conexión entre la BD y el driver apropiado para cada aplicación Es la primera clase JDBC con la que las aplicaciones contactan para comenzar una conexión JDBC l Driver. Manager. get. Connection(. . . ) Departamento de Matemáticas y Computación Ingeniería Técnica en Informática de Gestión Programación de Bases de © Francisco J. García Izquierdo ( 15 )

Proceso de trabajo con JDBC Aplicación JDBC Connection create. Statement get. Connection Statement execute.

Proceso de trabajo con JDBC Aplicación JDBC Connection create. Statement get. Connection Statement execute. Query Gestor de drivers Result. Set Driver A Driver B Departamento de Matemáticas y Computación Ingeniería Técnica en Informática de Gestión Programación de Bases de © Francisco J. García Izquierdo ( 16 )

Mantenimiento de la lista de drivers n n n ¿Cómo se forma la lista

Mantenimiento de la lista de drivers n n n ¿Cómo se forma la lista de drivers disponibles? Toda clase Driver debe auto-registrarse en el Drivermanager nada más cargarse Una clase Driver se carga, y por tanto se registra, de dos formas diferentes: l Cuando se inicia, el Driver. Manager consulta la propiedad jdbc. drivers. Dicha propiedad contiene una lista de drivers (las clases) que se desea cargar. > java -Djdbc. drivers=sun. jdbc. odbc. Jdbc. Odbc. Driver aplicación l Departamento de Matemáticas y Computación Si se desea introducir un nuevo driver después de que el Driver. Manager se haya inicializado se utilizará el método for. Name de la clase Class. for. Name("sun. jdbc. odbc. Jdbc. Odbc. Driver"); Ingeniería Técnica en Informática de Gestión Programación de Bases de © Francisco J. García Izquierdo ( 17 )

Dónde poner el for. Name n n El driver se debe registrar una única

Dónde poner el for. Name n n El driver se debe registrar una única vez durante la vida de la aplicación Se debe registrar al iniciar la aplicación (antes de pedir una conexión) Se debe elegir una clase que se inicialice al arrancar la aplicación y … … usar un bloque static para cargar el driver public class Gestor. BD { static { try { Class. for. Name("oracle. jdbc. driver. Oracle. Driver"); } catch (Class. Not. Found. Exception e) { System. out. println("No se ha podido cargar el driver de la. BD"); } Departamento de Matemáticas } y Computación. . . Resto de la clase } Ingeniería Técnica en Informática de Gestión Programación de Bases de © Francisco J. García Izquierdo ( 18 )

Obtención de conexiones n n Es el Driver concreto el que realiza las conexiones,

Obtención de conexiones n n Es el Driver concreto el que realiza las conexiones, pero las solicitudes de conexión se realizan al Driver. Manager Una vez que la clase Driver ha sido cargada y registrada en Driver. Manager, se pueden establecer conexiones con la BD. l l l n Llamada al método Driver. Manager. get. Connection(…) el Driver. Manager prueba los drivers registrados para ver si puede establecer la conexión. Para ello usa la URL de conexión Ejemplo (para Oracle) Class. for. Name("oracle. jdbc. driver. Oracle. Driver "); String Departamento de url Matemáticas y Computación = "jdbc: oracle: thin: @localhost: 1521: PBD"; Connection con = Driver. Manager. get. Connection(url, "PBD", "pbdpbd"); Ingeniería Técnica en Informática de Gestión Programación de Bases de © Francisco J. García Izquierdo ( 19 )

Agenda n n n n n Introducción Drivers JDBC La clase Driver. Manager Conexiones

Agenda n n n n n Introducción Drivers JDBC La clase Driver. Manager Conexiones Ejecución de instrucciones Transacciones y SQL Cuando las cosas van mal Temas avanzados JDBC 2 Departamento de Matemáticas y Computación Ingeniería Técnica en Informática de Gestión Programación de Bases de © Francisco J. García Izquierdo ( 20 )

El interface Connection n n Un objeto de tipo Connection representa una sesión abierta

El interface Connection n n Un objeto de tipo Connection representa una sesión abierta con una base de datos. Provee de un contexto en el que emitir sentencias SQL y obtener resultados. Una aplicación puede tener varias conexiones a una misma base de datos y/o varias conexiones a distintas bases de datos. A partir de una conexión se puede: l l l n Departamento de Matemáticas y Computación Obtener objetos Statement, Prepared. Statement o Callable. Statement para ejecutar sentencias SQL. Establecer el modo de las transacciones. Obtener información sobre la base de datos (Database. Metadata). Las conexiones se obtienen del Driver. Manager mediante el método get. Connection. Ingeniería Técnica en Informática de Gestión Programación de Bases de © Francisco J. García Izquierdo ( 21 )

URLs en JDBC n Uno de los parámetros del método get. Connection indica la

URLs en JDBC n Uno de los parámetros del método get. Connection indica la URL (con protocolo jdbc) que permite localizar la BD. n La forma general de esta URL es: l n Por ejemplo: l l Departamento de Matemáticas y Computación jdbc: <subprotocolo>: <subnombre> jdbc: oracle: thin: @172. 77. 77: 1521: MIBD jdbc: odbc: Mi. BD n El subprotocolo es particular de cada SGBD y lo utiliza el Driver. Manager para buscar el Driver adecuado para manipular la base de datos n El formato subnombre depende de cada subprotocolo concreto. El Driver será el encargado de interpretarlo y le ayudará a localizar de alguna manera la base de datos. Los otros parámetros de get. Connection son el nombre de usuario y la contraseña n Ingeniería Técnica en Informática de Gestión Programación de Bases de © Francisco J. García Izquierdo ( 22 )

Ejemplo de código de conexión a Oracle try { Class. for. Name("oracle. jdbc. driver.

Ejemplo de código de conexión a Oracle try { Class. for. Name("oracle. jdbc. driver. Oracle. Driver"); } catch (Class. Not. Found. Exception e) { System. err. println("No se ha podido cargar el driver de la BD"); }. . . Connection con = null; try { String url = "jdbc: oracle: thin: @localhost: 1521: PBD"; con = Driver. Manager. get. Connection(url, "PBD", "pbdpbd"); . . . Trabajo con la conexión } catch (SQLException e) { e. print. Stack. Trace(); } finally { try { if (con != null) con. close(); } catch (SQLException e 2) { e 2. print. Stack. Trace(); Departamento de Matemáticas y Computación } } Ingeniería Técnica en Informática de Gestión Programación de Bases de © Francisco J. García Izquierdo ( 23 )

Importante Departamento de Matemáticas y Computación n La aplicación no suele trabajar directamente con

Importante Departamento de Matemáticas y Computación n La aplicación no suele trabajar directamente con el Driver concreto. n Le pide al Driver. Manager conexiones a la BD concreta n Busca por su lista de drivers alguno que sepa tratar el tipo de URL especificada y devuelve un objeto Connection (genérico) n De esta manera las aplicaciones trabajan con Connections sin preocuparse del tipo de base de datos con la que trabajan. n El mismo código sirve para cualquier BD. Sólo hay que cambiar la URL. n IMPORTANTÍSIMO: cerrar la conexión. Usar el bloque finally Ingeniería Técnica en Informática de Gestión Programación de Bases de © Francisco J. García Izquierdo ( 24 )

Departamento de Matemáticas y Computación Ingeniería Técnica en Informática de Gestión Programación de Bases

Departamento de Matemáticas y Computación Ingeniería Técnica en Informática de Gestión Programación de Bases de © Francisco J. García Izquierdo ( 25 )

Agenda n n n n n Introducción Drivers JDBC La clase Driver. Manager Conexiones

Agenda n n n n n Introducción Drivers JDBC La clase Driver. Manager Conexiones Ejecución de instrucciones Transacciones y SQL Cuando las cosas van mal Temas avanzados JDBC 2 Departamento de Matemáticas y Computación Ingeniería Técnica en Informática de Gestión Programación de Bases de © Francisco J. García Izquierdo ( 26 )

El interface Statement n n Los objetos Statement permiten la ejecución de sentencias SQL

El interface Statement n n Los objetos Statement permiten la ejecución de sentencias SQL y obtener los resultados. Es la propia conexión la que actúa como factoría de Statements: Connectionlcon = Driver. Manager. get. Connection(url, usr, pwd); Connection. create. Statement() Statement stmt = con. create. Statement(); n Básicamente hay dos formas de lanzar sentencias SQL: l Método execute. Query(<sql>) para comandos SQL que producen tuplas como resultado (consultas SELECT) Result. Set rs = stmt. execute. Query("SELECT a, b, c FROM Table 2"); l Departamento de Matemáticas y Computación Método execute. Update(<sql>) en sentencias INSERT, DELETE, UPDATE, comandos DDL (CREATE, DROP, etc. . . ) y bloques PL/SQL (entre begin y end; ). stmt. execute. Update("DROP TABLE Table 2"); stmt. execute. Update(”DROP Table 2"); int n = stmt. execute. Update("UPDATE Table 2 SET a = a + 1"); Ingeniería Técnica en Informática de Gestión Programación de Bases de © Francisco J. García Izquierdo ( 27 )

El interface Statement (II) n El Método execute. Query devuelve un objeto de tipo

El interface Statement (II) n El Método execute. Query devuelve un objeto de tipo Result. Set l l l n Es como una tabla que almacena el resultado de la consulta Tiene una serie de métodos de consulta Es como un cursor (en terminología PL/SQL) El método execute. Update devuelve un entero que indica el número de filas modificadas por el comando Y en comandos DDL (CREATE, DROP, etc. . . ) devuelve 0 n Hay un método execute(<sql>) que ejecuta cualquier l tipo de sentencia l Si es un SELECT devolverá true n l El Result. Set se deberá conseguir con get. Result. Set() Si es un UPDATE, …, devolverá false n Las filas modificadas se consiguen con get. Update. Count() Departamento de Matemáticas y Computación Ingeniería Técnica en Informática de Gestión Programación de Bases de © Francisco J. García Izquierdo ( 28 )

El interface Statement (III) n Una vez que el resultado haya sido procesado se

El interface Statement (III) n Una vez que el resultado haya sido procesado se debe cerrar el Statement mediante el método close(). l l n Esto cierra también el Result. Set asociado Aun así Sun recomienda CERRAR EL Result. Set EXPLICITAMENTE Un mismo Statement puede reutilizarse en una misma conexión para ejecutar distintas sentencias. l l Departamento de Matemáticas y Computación Ingeniería Técnica en Informática de Gestión Al reejecutar un Statement se cierran los Result. Set anteriores Aun así Sun recomienda CERRAR EL Result. Set EXPLICITAMENTE Programación de Bases de © Francisco J. García Izquierdo ( 29 )

Ejemplo de código para Oracle // Carga del driver (Class. for. Name. . .

Ejemplo de código para Oracle // Carga del driver (Class. for. Name. . . Connection con = null; try { String url = "jdbc: oracle: thin: @localhost: 1521: PBD"; con = Driver. Manager. get. Connection(url, "PBD", "pbdpbd"); Statement stmt = con. create. Statement(); Result. Set rs = stmt. execute. Query(“SELECT a, b, c FROM Table 2"); . . . Procesamiento del resultado rs. close(); stmt. close(); OJO QUE NO ACABE EN ; } catch (SQLException e) { e. print. Stack. Trace(); } finally { try { if (con != null) con. close(); } catch (SQLException e 2) { e 2. print. Stack. Trace(); Departamento de Matemáticas y Computación } } Ingeniería Técnica en Informática de Gestión Programación de Bases de © Francisco J. García Izquierdo ( 30 )

Composición del SQL n n n El SQL que aceptan los métodos execute. Xxx

Composición del SQL n n n El SQL que aceptan los métodos execute. Xxx es un String (JDBC es CLI) Puede componerse dinámicamente en función de valores de variables Para componer el String del SQL habrá que concatenar los distintos trozos del SQL (los estáticos y los variables). String id = "xx 67 yw 8“; String sql = "SELECT a, b, c FROM Table 2 WHERE id ='" + id + "'"; Result. Set rs = stmt. execute. Query(sql); Departamento de Matemáticas y Computación Ingeniería Técnica en Informática de Gestión Programación de Bases de © Francisco J. García Izquierdo ( 31 )

El interface Result. Set n Los objetos de tipo Result. Set ofrecen métodos para

El interface Result. Set n Los objetos de tipo Result. Set ofrecen métodos para recorrer el resultado de una consulta. n Mantiene un puntero a la fila actual. l Cada vez que se invoca el método next() se pasa a la siguiente fila. l Inicialmente el puntero se sitúa antes de la primera fila hay que llamar a next para situarlo en la primera fila (¡si la hay!) l next() devuelve n true, si el puntero ha avanzado a la siguiente fila n false, si no quedan más filas que procesar Result. Set rs = stmt. execute. Query("SELECT a, b, c FROM Table 2"); while (rs. next()) { Departamento. . . de Tratamiento de cada fila Matemáticas y Computación } Ingeniería Técnica en Informática de Gestión Programación de Bases de © Francisco J. García Izquierdo ( 32 )

El interface Result. Set (II) n Se obtienen los valores de la fila actual

El interface Result. Set (II) n Se obtienen los valores de la fila actual utilizando las distintas versiones del método get<tipo>(<columna>) pudiendo indicar la columna mediante su nombre o mediante su posición (comienza por la 1). n Ejemplo: devolverá N filas, con la columna 1 como un int, la 2 como un String y la 3 como una fecha Result. Set rs = stmt. execute. Query("SELECT a, b, c FROM Table 1"); while (rs. next()) { int i = rs. get. Int("a"); // rs. get. Int(1) String s = rs. get. String("b"); // rs. get. String(2) java. sql. Date f = rs. get. Date("c"); // rs. get. Date (3) System. out. println(“FILA = " + i + " " + s + " " + f); } Departamento de Matemáticas y Computación n Conviene cerrar el Result. Set aunque se cierra implícitamente al cerrar o reutilizar el Statement que lo creó. Ingeniería Técnica en Informática de Gestión Programación de Bases de © Francisco J. García Izquierdo ( 33 )

Result. Set y valores nulos n Cuando se ha leído un null de SQL

Result. Set y valores nulos n Cuando se ha leído un null de SQL usando uno de los métodos get<tipo>, éste devuelve algo de lo siguiente: l l l n Un valor null de Java para aquellos métodos get<tipo> que devuelven objetos Java (get. String, get. String get. Big. Decimal, get. Big. Decimal get. Bytes, get. Bytes get. Date, get. Date get. Time, get. Timestamp, get. Timestamp …). Un valor cero para get. Byte, get. Byte get. Short, get. Short get. Int, get. Int get. Long, get. Long get. Float y get. Double Un valor false para get. Boolean. Para determinar si un valor resultado dado es null, primero debe intentarse leer la columna y usar el método de Result. Set was. Null() para ver si lo que acabamos de leer era null int i = rs. get. Int("a"); // si el valor es null, i vale 0 if (rs. was. Null() { Departamento de. . . Matemáticas } y Computación Ingeniería Técnica en Informática de Gestión Programación de Bases de © Francisco J. García Izquierdo ( 34 )

Navegación por el Result. Set n n En principio sólo se puede avanzar por

Navegación por el Result. Set n n En principio sólo se puede avanzar por las filas de datos (next()) No se puede retroceder, ni volver a procesar un Result. Set. A partir de JDBC 2, se incluyen métodos para ir hacia detrás, al principio, al final, a una fila determinada … … pero tienen implicaciones en el rendimiento de la aplicación Departamento de Matemáticas y Computación Ingeniería Técnica en Informática de Gestión Programación de Bases de © Francisco J. García Izquierdo ( 35 )

Tipos de datos y get<Tipo> n n Una “x” indica que el método get<tipo>

Tipos de datos y get<Tipo> n n Una “x” indica que el método get<tipo> puede legalmente usarse para recuperar el tipo JDBC dado. Una “X” indica que el método get<tipo> es el recomendado para recuperar el tipo de dato dado. Departamento de Matemáticas y Computación Ingeniería Técnica en Informática de Gestión Programación de Bases de © Francisco J. García Izquierdo ( 36 )

Tipos de datos y get<Tipo> Departamento de Matemáticas y Computación Ingeniería Técnica en Informática

Tipos de datos y get<Tipo> Departamento de Matemáticas y Computación Ingeniería Técnica en Informática de Gestión Programación de Bases de © Francisco J. García Izquierdo ( 37 )

Ejemplo completo try { Class. for. Name("oracle. jdbc. driver. Oracle. Driver"); Carga Conexión Consulta

Ejemplo completo try { Class. for. Name("oracle. jdbc. driver. Oracle. Driver"); Carga Conexión Consulta Procesar delresultado driver } catch (Class. Not. Found. Exception e) { System. err. println("No se ha podido cargar el driver de la BD"); } Connection con = null; try { String url = "jdbc: oracle: thin: @localhost: 1521: PBD"; con = Driver. Manager. get. Connection(url, "PBD", "pbdpbd"); Statement stmt = con. create. Statement(); Result. Set rs = stmt. execute. Query("SELECT a, b, c FROM Table 1"); while (rs. next()) { int i = rs. get. Int("a"); // rs. get. Int(1) String s = rs. get. String("b"); // rs. get. String(2) java. sql. Date f = rs. get. Date("c"); // rs. get. Date (3) System. out. println(“FILA = " + i + " " + s + " " + f); } Departamento de Matemáticas y Computación Ingeniería Técnica en Informática de Gestión Programación de Bases de © Francisco J. García Izquierdo ( 38 )

Ejemplo completo (II). . . rs. close(); stmt. close(); } catch (SQLException e) {

Ejemplo completo (II). . . rs. close(); stmt. close(); } catch (SQLException e) { e. print. Stack. Trace(); } finally { try { if (con != null) con. close(); e 2){{ } catch (SQLException e) e 2. print. Stack. Trace(); e. print. Stack. Trace(); } } Cerrar TODO Departamento de Matemáticas y Computación Ingeniería Técnica en Informática de Gestión Programación de Bases de © Francisco J. García Izquierdo ( 39 )

Ejemplo de prácticas package sol; import bd. Abstract. DBManager; import java. sql. *; import

Ejemplo de prácticas package sol; import bd. Abstract. DBManager; import java. sql. *; import model. *; public class Gestor. BD extends Abstract. DBManager { // Registro del driver apropiado para la BD a utilizar static { try { Class. for. Name("oracle. jdbc. driver. Oracle. Driver"); } catch (Class. Not. Found. Exception e) { System. out. println("No puedo cargar el driver JDBC de la BD"); } } Departamento. Articulo de public get. Articulo(String codigo) { Matemáticas y Computación } } Ingeniería Técnica en Informática de Gestión Programación de Bases de © Francisco J. García Izquierdo ( 40 )

public Articulo get. Articulo(String codigo) { Articulo articulo = null; Connection con = null;

public Articulo get. Articulo(String codigo) { Articulo articulo = null; Connection con = null; try { con = Driver. Manager. get. Connection("jdbc: oracle: thin: @localhost: 1521: pbd", "prbdprbd"); Statement stm = con. create. Statement(); String sql = "SELECT nombre, PVP FROM Articulo WHERE codigo ='" +codigo+ "'"; Result. Set res = stm. execute. Query(sql); if (res. next()) { articulo = new Articulo(codigo, res. get. String("nombre"), res. get. Double("PVP")); } res. close(); stm. close(); } catch (SQLException e) { e. print. Stack. Trace(); } finally { if (con != null) try { con. close(); } catch (SQLException ex) { ex. print. Stack. Trace(); } } Departamento de Matemáticas returny Computación articulo; } Ingeniería Técnica en Informática de Gestión Programación de Bases de © Francisco J. García Izquierdo ( 41 )

El interface Prepared. Statement n n Cada vez que se lanza un Statement el

El interface Prepared. Statement n n Cada vez que se lanza un Statement el SGBD debe interpretarla y calcular un plan de consulta La clase Prepared. Statement permite lanzar comandos SQL precompilados. En sentencias que van a ser ejecutadas múltiples veces se obtiene un aumento de rendimiento al tener la consulta ya analizada y optimizada. Los objetos Prepared. Statement se obtienen de la conexión, mediante el método prepare. Statement(<sql>) Connection con = Driver. Manager. get. Connection(url, usr, pwd); Prepared. Statement stmt = con. prepare. Statement(. . . SQL. . . ); Departamento de Matemáticas y Computación Ingeniería Técnica en Informática de Gestión Programación de Bases de © Francisco J. García Izquierdo ( 42 )

El interface Prepared. Statement n Otro uso de Prepared. Statement es la posibilidad de

El interface Prepared. Statement n Otro uso de Prepared. Statement es la posibilidad de parametrizar las consultas n La sentencia SQL puede contiene uno o más parámetros de entrada (indicados por ‘? ’) los cuales podrán ser modificados en distintas ejecuciones de la sentencia. Prepared. Statement ps = con. prepare. Statement("UPDATE table SET sueldo=? WHERE nombre=? "); n Esta funcionalidad puede ser útil cuando no se sabe cómo escribir los valores de ciertos tipos de datos en el SQL del SGBD destino (ejemplo, los valores DATE, boolean). n También puede evitar “inyecciones de SQL” Departamento de Matemáticas y Computación Ingeniería Técnica en Informática de Gestión Programación de Bases de © Francisco J. García Izquierdo ( 43 )

Inyección de SQL n Detrás de un formulario de autenticación habrá una consulta como:

Inyección de SQL n Detrás de un formulario de autenticación habrá una consulta como: SELECT * FROM users WHERE usr=‘Bob’ and pwd=‘ 2 kjlu’ n n Si la consulta devuelve resultado, el usuario puede entrar; si no, adiós muy buenas. El código de la aplicación concatena la consulta basándose en el contenido de los campos del formulario: "SELECT * FROM users WHERE usr='"+ el. Usuario +"' and pwd='"+ la. Contraseña +"'" n Ej: SELECT * FROM users WHERE usr='fco' and pwd='xx' n Si el usuario mete l l n Departamento de Matemáticas y Computación Como usuario: admin Como contraseña: Me. Da. Igual' OR '1'='1 La cosa queda: SELECT * FROM users WHERE usr='admin' and pwd='Me. Da. Igual' OR '1'='1' Ingeniería Técnica en Informática de Gestión Programación de Bases de © Francisco J. García Izquierdo ( 44 )

El interface Prepared. Statement n n n Antes de que la sentencia SQL pueda

El interface Prepared. Statement n n n Antes de que la sentencia SQL pueda ser ejecutada deberemos asignar algún valor a los parámetros de entrada La asignación se realiza mediante el método set<tipo>() siendo el tipo compatible con el del parámetro. El método set<tipo> lleva dos argumentos: l l La posición del parámetro a asignar dentro de la sentencia (el primero es el 1). El valor a asignar al parámetro. Prepared. Statement ps = con. prepare. Statement("UPDATE table SET sueldo=? WHERE nombre=? "); ps. set. Float(1, 1500. 0); ps. set. String(2, “Pepe"); se ejecuta la sentencia: n Finalmente Departamento de Matemáticas y Computación Ingeniería Técnica en Informática de Gestión ps. execute. Update(); Programación de Bases de © Francisco J. García Izquierdo ( 45 )

Ejemplo try { Class. for. Name("oracle. jdbc. driver. Oracle. Driver"); } catch (Class. Not.

Ejemplo try { Class. for. Name("oracle. jdbc. driver. Oracle. Driver"); } catch (Class. Not. Found. Exception e) { System. err. println("No se ha podido cargar el driver de la BD"); } Connection con = null; try { String url = "jdbc: oracle: thin: @localhost: 1521: PBD"; con = Driver. Manager. get. Connection(url, "PBD", "pbdpbd"); float sueldos [] = {1500, 2000, 1205. 75 f}; String nombres [] = {"Juan", "Ana", "Maria"}; Prepared. Statement ps = con. prepare. Statement("UPDATE table SET sueldo=? WHERE nombre=? "); for (int i=0; i<sueldos. length; i++) { ps. set. Float(1, sueldos[i]); ps. set. String(2, nombres[i]); ps. execute. Update(); Departamento de } Matemáticas y Computación ps. close(); Ingeniería Técnica en Informática de Gestión Programación de Bases de © Francisco J. García Izquierdo ( 46 )

Ejemplo (II) } catch (SQLException e) { e. print. Stack. Trace(); } finally {

Ejemplo (II) } catch (SQLException e) { e. print. Stack. Trace(); } finally { try { if (con != null) con. close(); } catch (SQLException e 2) { e 2. print. Stack. Trace(); } } Departamento de Matemáticas y Computación Ingeniería Técnica en Informática de Gestión Programación de Bases de © Francisco J. García Izquierdo ( 47 )

Parámetros con valores null n n Cuando se pasa un valor null Java en

Parámetros con valores null n n Cuando se pasa un valor null Java en alguno de los métodos set<tipo>(), se almacena un valor SQL null en la BD. Si son valores de tipos primitivos (int, float, boolean, …) l El método a utilizar es set. Null() l Hay que indicar el tipo Prepared. Statement ps = con. prepare. Statement(“INSERT INTO Persona(nombre, casado) VALUES (? , ? )"); ps. set. String (1, "Juan"); ps. set. Null(2, java. sql. Types. BOOLEAN); Departamento de Matemáticas y Computación Ingeniería Técnica en Informática de Gestión Programación de Bases de © Francisco J. García Izquierdo ( 48 )

Notas sobre fechas (Oracle) n n Al almacenar fechas en Oracle podemos perder precisión

Notas sobre fechas (Oracle) n n Al almacenar fechas en Oracle podemos perder precisión Oracle tiene dos (tres) tipos para fechas: l l n n DATE: que almacena fechas con hora, minutos y segundos TIMESTAMP: que almacena fechas con hora, minutos, segundos y fracciones de segundo Cualquiera de los dos tipos de campos puede consultarse / almacenarse con set. Date/get. Date o set. Timestamp/get. Timestamp Pero: l l l Departamento de Matemáticas y Computación Ingeniería Técnica en Informática de Gestión set. Date no almacena datos sobre la hora, sólo la fecha (la hora la pone a 00: 00) get. Date no recupera datos sobre la hora (aunque sí esté en la BD) set. Timestamp/get. Timestamp sí almacenan y recuperan datos sobre la hora. Si el campo es de tipo TIMESTAMP (en Oracle) incluso recuperan los datos sobre fracciones de segundo Programación de Bases de © Francisco J. García Izquierdo ( 49 )

El interface Callable. Statement n n n Los objetos Callable. Statement proporcionan un mecanismo

El interface Callable. Statement n n n Los objetos Callable. Statement proporcionan un mecanismo para invocación de stored procedures de la base de datos. Se obtienen de Connection mediante el método prepare. Call(. . . ) La sintaxis de la invocación es: l n {[? = ]call <procedure_name>[(? , . . . )]} Los procedimientos almacenados pueden tener parámetros de tres tipos l l Los parámetros IN se tratan como en Prepared. Statement. Los parámetros OUT hay que registrarlos mediante: n l n Departamento de Matemáticas y Computación register. Out. Parameter(<indice>, <tipo>); Los parámetros INOUT se le da valor como a los IN y se registran como los OUT Finalmente se ejecuta la sentencia y se recogen los valores OUT con la familia de métodos get<tipo>(<indice>) Ingeniería Técnica en Informática de Gestión Programación de Bases de © Francisco J. García Izquierdo ( 50 )

Ejemplo n Supongamos una función llamada Precio. Articulo que devuelve el precio de una

Ejemplo n Supongamos una función llamada Precio. Articulo que devuelve el precio de una cantidad de artículos // Carga del driver. . . Connection con = null; try { String url = "jdbc: oracle: thin: @localhost: 1521: PBD"; con = Driver. Manager. get. Connection(url, "PBD", "pbdpbd"); Callable. Statement call=con. prepare. Call("{? =call Precio. Articulo(? , ? )}"); call. register. Out. Parameter(1, Types. DOUBLE); call. set. String(2, "D 786 SCO"); call. set. Int(3, 10); call. execute. Query(); precio. Linea = call. get. Double(1); call. close(); }. . . cerrar la conexión Departamento de Matemáticas y Computación Ingeniería Técnica en Informática de Gestión Programación de Bases de © Francisco J. García Izquierdo ( 51 )

Ejemplo (II) n Un procedimiento (swap) de intercambio de valores (dos parámetros INOUT) //

Ejemplo (II) n Un procedimiento (swap) de intercambio de valores (dos parámetros INOUT) // Carga del driver. . . Connection con = null; try { //. . . Establecimiento de la conexión Callable. Statement call = con. prepare. Call(“{call swap(? , ? )}"); call. register. Out. Parameter(1, Types. INTEGER); call. register. Out. Parameter(2, Types. INTEGER); call. set. Int(1, 1); call. set. Int(2, 2); call. execute(); int r 1 = call. get. Int(1); int r 2 = call. get. Int(2); call. close(); Departamento de System. out. println("Los valores ahora son "+r 1+" y "+r 2); Matemáticas y Computación }. . . cerrar la conexión Ingeniería Técnica en Informática de Gestión Programación de Bases de © Francisco J. García Izquierdo ( 52 )

Agenda n n n n n Introducción Drivers JDBC La clase Driver. Manager Conexiones

Agenda n n n n n Introducción Drivers JDBC La clase Driver. Manager Conexiones Ejecución de instrucciones Transacciones y SQL Cuando las cosas van mal Temas avanzados JDBC 2 Departamento de Matemáticas y Computación Ingeniería Técnica en Informática de Gestión Programación de Bases de © Francisco J. García Izquierdo ( 53 )

Transacciones en JDBC n n Una transacción es un conjunto de sentencias que se

Transacciones en JDBC n n Una transacción es un conjunto de sentencias que se deben completar o anular en su totalidad. Cuando se inicia una transacción la forma de hacerla definitiva es mediante el método commit() del interface Connection. Si se desean deshacer todas las sentencias de la transacción hay que invocar al método rollback() del interface Connection. Las conexiones están por defecto en modo auto. Commit, es decir, las sentencias se auto-confirman sin necesidad de llamar a commit() cuando finalizan (luego cada sentencia es una transacción). Departamento de Matemáticas y Computación Ingeniería Técnica en Informática de Gestión Programación de Bases de © Francisco J. García Izquierdo ( 54 )

Transacciones en JDBC n n Departamento de Matemáticas y Computación El modo auto. Commit

Transacciones en JDBC n n Departamento de Matemáticas y Computación El modo auto. Commit se activa/desactiva con el método set. Auto. Commit(boolean on) del interface Connection. Si el modo auto. Commit está desactivado las transacciones no finalizarán hasta que se llame a commit() o rollback() explícitamente. A su vez dichos métodos inician una nueva transacción, por lo que una transacción serán todas aquellas sentencias ejecutadas entre dos commit y/o rollback consecutivos. También se puede establecer un punto de recuperación con el método set. Save. Point() del interface Connection (desde JDBC 3. 0). Ingeniería Técnica en Informática de Gestión Programación de Bases de © Francisco J. García Izquierdo ( 55 )

Ejemplo. . . Carga del driver. . . String URL = "jdbc: oracle: thin:

Ejemplo. . . Carga del driver. . . String URL = "jdbc: oracle: thin: @localhost: 1521: PBD"; Connection con = null; try { con = Driver. Manager. get. Connection(URL, "PBD", "pbdpbd"); con. set. Auto. Commit(false); float sueldos [] = {1500, 2000, 1205. 75 f}; String nombres [] = {"Juan", "Ana", "Maria"}; Prepared. Statement ps =con. prepare. Statement("UPDATE table SET sueldo=? "+ "WHERE nombre=? "); for (int i=0; i<sueldos. length; i++) { ps. set. Float(1, sueldos[i]); ps. set. String(2, nombres[i]); ps. execute. Update(); } Departamento de ps. close(); Matemáticas y Computación con. commit(); Ingeniería Técnica en Informática de Gestión Programación de Bases de © Francisco J. García Izquierdo ( 56 )

Ejemplo (II) } catch (SQLException e) { e. print. Stack. Trace(); try { if

Ejemplo (II) } catch (SQLException e) { e. print. Stack. Trace(); try { if (con != null) con. rollback(); } catch (SQLException e 2) { e 2. print. Stack. Trace(); } } finally { try { if (con != null) con. close(); } catch (SQLException e 2) { e 2. print. Stack. Trace(); } } Departamento de Matemáticas y Computación Ingeniería Técnica en Informática de Gestión Programación de Bases de © Francisco J. García Izquierdo ( 57 )

Control de la concurrencia n ¿Que ocurre cuando un proceso está realizando una transacción

Control de la concurrencia n ¿Que ocurre cuando un proceso está realizando una transacción (no se sabe si la confirmará o no) y otro intenta acceder a filas afectadas por la transacción? n El programador debe decidir como debe comportarse la conexión en ese caso mediante el método set. Transaction. Isolation(<tipo>). l l TRANSACTION_READ_UNCOMMITTED (dirty reads): Se lee siempre la última versión de los datos aunque se encuentren sin confirmar (si luego se hace un rollback los datos son erróneos). TRANSACTION_READ_COMMITTED: Solo se leen datos confirmados. No se consideran los datos modificados en otra transacción hasta que no los confirme (con commit). Departamento de Matemáticas y Computación Ingeniería Técnica en Informática de Gestión Programación de Bases de © Francisco J. García Izquierdo ( 58 )

Control de la concurrencia (II) l TRANSACTION_REPEATABLE_READ: Solo se leen datos cofirmados. Además mantiene

Control de la concurrencia (II) l TRANSACTION_REPEATABLE_READ: Solo se leen datos cofirmados. Además mantiene un lock sobre la fila actual de manera que otros procesos no pueden modificarla (aunque sí leerla). Cuando se cambia la fila actual el lock cambia de registro. l TRANSACTION_SERIALIZABLE: Solo se leen datos confirmados. Además mantiene un lock sobre todas las filas seleccionadas durante la transacción. Otros procesos no podrán modificar ninguna de ellas (aunque sí leerlas). Departamento de Matemáticas y Computación Ingeniería Técnica en Informática de Gestión Programación de Bases de © Francisco J. García Izquierdo ( 59 )

Agenda n n n n n Introducción Drivers JDBC La clase Driver. Manager Conexiones

Agenda n n n n n Introducción Drivers JDBC La clase Driver. Manager Conexiones Ejecución de instrucciones Transacciones y SQL Cuando las cosas van mal Temas avanzados JDBC 2 Departamento de Matemáticas y Computación Ingeniería Técnica en Informática de Gestión Programación de Bases de © Francisco J. García Izquierdo ( 60 )

SQLException n La mayoría de los métodos de las clases e interfaces JDBC lanzan

SQLException n La mayoría de los métodos de las clases e interfaces JDBC lanzan la excepción java. sql. SQLException cuando se produce algún error con relación a la BD: l l l n No se puede conectar La sentencia está mal construida … SQLException es una exception explícita y proporciona l l l Departamento de Matemáticas y Computación Ingeniería Técnica en Informática de Gestión Un mensaje explicativo sobre la causa del error get. Message() Un código (entero) que identifica al error get. Error. Code() Un enlace a la siguiente excepción anidada get. Next. Exception() Programación de Bases de © Francisco J. García Izquierdo ( 61 )

Agenda n n n n n Introducción Drivers JDBC La clase Driver. Manager Conexiones

Agenda n n n n n Introducción Drivers JDBC La clase Driver. Manager Conexiones Ejecución de instrucciones Transacciones y SQL Cuando las cosas van mal Temas avanzados JDBC 2 Departamento de Matemáticas y Computación Ingeniería Técnica en Informática de Gestión Programación de Bases de © Francisco J. García Izquierdo ( 62 )

Database. Meta. Data n n La conexión proporciona información sobre la BD a la

Database. Meta. Data n n La conexión proporciona información sobre la BD a la que se conecta Para ello dispone del método get. Meta. Data() que devuelve un objeto Database. Meta. Data al que se puede preguntar por: l l l Departamento de Matemáticas y Computación Ingeniería Técnica en Informática de Gestión Información sobre la versión de BD y de driver Propiedades sobre lo que puede hacer la BD y el driver: procedimientos almacenados, outer joins, … Límites de la BD: nº máximo de conexiones concurrentes, máximo de columnas en tabla, … Funciones que incluye la BD y tipos que soporta Esquema de la BD: tablas, campos de cada tabla, claves primarias, foráneas, índices, privilegios Programación de Bases de © Francisco J. García Izquierdo ( 63 )

Result. Set. Meta. Data n n Result. Set proporciona información, además de sobre el

Result. Set. Meta. Data n n Result. Set proporciona información, además de sobre el contenido, sobre la estructura de los datos obtenidos en un SELECT. Para ello dispone del método get. Meta. Data() que devuelve un objeto Result. Set. Meta. Data al que se puede preguntar por: l l l El número de columnas que incluye Las características de cada columna: nombre, tipo, precisión, escala Si la columna puede contener valores nulos Departamento de Matemáticas y Computación Ingeniería Técnica en Informática de Gestión Programación de Bases de © Francisco J. García Izquierdo ( 64 )

Secuencias de escape n n Los Statement pueden contener SQL con sintaxis de escape

Secuencias de escape n n Los Statement pueden contener SQL con sintaxis de escape SQL. La sintaxis de escape señala al driver que el código que lleva debe ser tratado diferentemente. El driver traducirá la sintaxis de escape en código que entiende la BD en particular. Ejemplos: l escape para caracteres LIKE st. execute. Query("SELECT * y. FROM Articulo WHERE Id LIKE '_%' {escape ''}; l d, t ts para literales de fecha y tiempo n una fecha se especifica en SQL JDBC mediante la sintaxis: {d 'yyyy-mm-dd'} Departamento de Matemáticas y Computación Ingeniería Técnica en Informática de Gestión Programación de Bases de © Francisco J. García Izquierdo ( 65 )

Sobre conexiones n n Las conexiones son un recurso limitado: hay que cerrarlas Pero

Sobre conexiones n n Las conexiones son un recurso limitado: hay que cerrarlas Pero cuando? ¿Tras cada transacción? Regla general: si no es necesario usar la misma conexión a lo largo de varias interacciones, debe cerrarse Se pueden conservar l l l n Si hay pocos usuarios concurrentes Si hay que mantener las propiedades transaccionales en varias interacciones Pero hay que comprobar que la conexión está viva (y no siempre funciona el is. Closed() y hay que hacer queries como SELECT 7 FROM DUAL) Hay que cerrarla l Si puede haber muchos usuarios conectados concurrentemente, por ejemplo en aplicaciones web. n Departamento de Matemáticas y Computación n En estos casos tras cada servicio hay que cerrar la conexión. Se suelen usar Pool de conexiones Ingeniería Técnica en Informática de Gestión Programación de Bases de © Francisco J. García Izquierdo ( 66 )

Pool de Conexiones Aplicación get. Connection( Driver. Manager get. Connection( new Connection( con. close()

Pool de Conexiones Aplicación get. Connection( Driver. Manager get. Connection( new Connection( con. close() Pool de Conexiones Departamento de Matemáticas y Computación Ingeniería Técnica en Informática de Gestión Programación de Bases de © Francisco J. García Izquierdo ( 67 )

Cuando usar Prepared. Statement n n No todos los SGBDs lo soportan En principio

Cuando usar Prepared. Statement n n No todos los SGBDs lo soportan En principio mejoran el rendimiento, aunque este no es el único método de mejora: l l l n Los Prepared. Statement están asociados a la conexión que los creó: l n Los SGBDs suelen cachear las queries (Oracle lo hace): ofrecen mucho rendimiento si se repite la misma query Pero si la query se diferencia en el valor de algún parámetro, … la caché no actúa En este caso puede ser mejor usar Prepared. Statement. viven mientras no se cierre la conexión Es necesario combinar la reutilización de Prepared. Statement con pooling de conexiones. l Los servidores de aplicaciones suelen hacerlo. Departamento de Matemáticas y Computación Ingeniería Técnica en Informática de Gestión Programación de Bases de © Francisco J. García Izquierdo ( 68 )

n Departamento de Matemáticas y Computación “The use of a Statement in JDBC should

n Departamento de Matemáticas y Computación “The use of a Statement in JDBC should be 100% localized to being used for DDL (ALTER, CREATE, GRANT, etc) as these are the only statement types that cannot accept BIND VARIABLES. Prepared. Statements or Callable. Statements should be used for EVERY OTHER type of statement (DML, Queries). As these are the statement types that accept bind variables. This is a fact, a rule, a law -- use prepared statements EVERYWHERE” Tom Kyte, Oracle's VP Ingeniería Técnica en Informática de Gestión Programación de Bases de © Francisco J. García Izquierdo ( 69 )

Agenda n n n n n Introducción Drivers JDBC La clase Driver. Manager Conexiones

Agenda n n n n n Introducción Drivers JDBC La clase Driver. Manager Conexiones Ejecución de instrucciones Transacciones y SQL Cuando las cosas van mal Temas avanzados JDBC 2 Departamento de Matemáticas y Computación Ingeniería Técnica en Informática de Gestión Programación de Bases de © Francisco J. García Izquierdo ( 70 )

Actualizaciones por lotes n n n Ejecutar un conjunto de actualizaciones de “una tacada”.

Actualizaciones por lotes n n n Ejecutar un conjunto de actualizaciones de “una tacada”. No se pueden ejecutar SELECTs. Para ejecutar un lote primero crear un Statement e ir añadiéndole updates SQL (con add. Batch()) Statement stmt = con. create. Statement(); stmt. add. Batch( ". . . un INSERT, algo que no sea SELECT. . . "); stmt. add. Batch( ". . . stmt. execute. Batch(); n Se debería tratar al lote como una transacción poniendo el autocommit en falso, para luego hacer un commit(). Departamento de Matemáticas y Computación Ingeniería Técnica en Informática de Gestión Programación de Bases de © Francisco J. García Izquierdo ( 71 )

Result. Set recorrible y actualizable n n Con el Result. Set tradicional sólo se

Result. Set recorrible y actualizable n n Con el Result. Set tradicional sólo se puede avanzar por los datos Con JDBC 2 es posible ir hacia delante y hacia atrás en un Result. Set. El Result. Set debe ser configurado para tal cosa poniendo unos settings apropiados. Los settings indican si se permite navegar por el Result. Set y si se deja editar su contenido. l l l Result. Set. CONCUR_READ_ONLY, no se puede editar el contenido Result. Set. CONCUR_UPDATABLE, sí se puede editar Result. Set. TYPE_FORWARD_ONLY, solo se puede ir hacia adelante Result. Set. TYPE_SCROLL_INSENSITIVE, se puede navegar; una vez consultados los datos si estos son cambiados por terceros no veremos los cambios Result. Set. TYPE_SCROLL_SENSITIVE Estos settings se indican cuando se crea el Statement, debiéndose dar un valor para definir las características de navegabilidad y de modificafilidad. n Ej: los result. Sets de la siguiente statement serán navegables pero no se podrán modificar: con. create. Statement(Result. Set. TYPE_SCROLL_INSENSITIVE, Result. Set. CONCUR_READ_ONLY); n Departamento de Matemáticas y Computación Ingeniería Técnica en Informática de Gestión Programación de Bases de © Francisco J. García Izquierdo ( 72 )

Result. Set recorrible y actualizable (II) n n n Departamento de Matemáticas y Computación

Result. Set recorrible y actualizable (II) n n n Departamento de Matemáticas y Computación Los movimientos se realizan con los métodos next(), previous(), relative(n), absolute(n), last(), first(), before. First(), after. Last(), pudiendo saber en que fila se está con el get. Row(). Los drivers de BD pueden no dar soporte a estas características. Incluso en drivers que si las soportan, determinadas queries complejas pueden devolver resultados que por ejemplo no sean modificables. Como norma es preciso comprobar las características del Result. Set devuelto para ver cual es el modo en el que trabaja (con los métodos get. Type() y get. Concurency()). Estas características tienen su impacto en el rendimiento de la aplicación Ingeniería Técnica en Informática de Gestión Programación de Bases de © Francisco J. García Izquierdo ( 73 )

Nuevos tipos de datos n Se pueden recuperar/almacenar en una base de datos objetos

Nuevos tipos de datos n Se pueden recuperar/almacenar en una base de datos objetos de tipo l l n n Departamento de Matemáticas y Computación BLOB (Binary Large Objects) CLOB (Character Large Objects). Se recuperan con los métodos get. Blob() y get. Clob() de Result. Set, que devuelven objetos de tipo java. sql. Blob y java. sql. Clob, los cuales incorporan métodos para navegar por los contenidos de los objetos. También se pueden recuperar ARRAYs con el método get. Array(), que devuelve un objeto de tipo java. sql. Array. Ingeniería Técnica en Informática de Gestión Programación de Bases de © Francisco J. García Izquierdo ( 74 )

javax. sql n n n Incluye las extensiones JDBC para J 2 EE Destinado

javax. sql n n n Incluye las extensiones JDBC para J 2 EE Destinado a su empleo en servidores de aplicaciones (Weblogic, Web. Sphere, Oracle 9 i. AS, JRun, JBoss, …) Proporciona: l Otro mecanismo de obtención de conexiones: n Basado en Data. Source l l l Departamento de Matemáticas y Computación l Ingeniería Técnica en Informática de Gestión Que hay que desplegar previamente Pueden ser pooled Gestión de transacciones distribuidas Rowsets, como el Cached. Rowset Programación de Bases de © Francisco J. García Izquierdo ( 75 )

Novedades JDBC 4. 0 n Carga automática de drives JDBC l n n n

Novedades JDBC 4. 0 n Carga automática de drives JDBC l n n n Departamento de Matemáticas y Computación n Usando el mecanismo de Proveedores de Servicio de Java SE Tipo de dato ROWID Mejora en el soporte para CLOB y BLOB Soporte para SQL/XML Posibilidad de “des-envolver” las clases que implementan JDBC para acceder a funcionalidad propietaria de un SGBD concreto Mejoras en la gestión de Connection y Statement en pool Nuevas funciones escalares Nuevos métodos en varios interfaces Ingeniería Técnica en Informática de Gestión Programación de Bases de © Francisco J. García Izquierdo ( 76 )

Cosas que se quedan en el tintero n n n La configuración y obtención

Cosas que se quedan en el tintero n n n La configuración y obtención de conexiones vía Data. Sources JDBC El empleo de pools de conexiones Empleo de datos de tipos CLOB y BLOB Departamento de Matemáticas y Computación Ingeniería Técnica en Informática de Gestión Programación de Bases de © Francisco J. García Izquierdo ( 77 )

Departamento de Matemáticas y Computación Ingeniería Técnica en Informática de Gestión Programación de Bases

Departamento de Matemáticas y Computación Ingeniería Técnica en Informática de Gestión Programación de Bases de Datos } finally { try { if (presentacion != null) presentacion. close(); } catch (SQLException e) { e. print. Stack. Trace(); } } Logroño, 18 de Enero de