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

jdbc-100423010851-phpapp01

Embed Size (px)

Citation preview

Page 1: jdbc-100423010851-phpapp01

Logroño, 18 de Enero de 2000

Departamento deMatemáticas y Computación

Ingeniería Técnica en Informática de Gestión

Programación deBases de Datos

JDBCJDBC

Java Database ConnectivityJava Database Connectivity

Page 2: jdbc-100423010851-phpapp01

Programación de Bases de Datos ( 2 )© Francisco J. García IzquierdoIngeniería Técnica en Informática de Gestión

Departamento de

Matemáticas y Computación

BibliografíaBibliografía

JDBC API Tutorial and Reference, Third EditionJDBC API Tutorial and Reference, Third Edition. Maydene Fisher et al.. Maydene Fisher et al. Addison-Addison-Wesley Pub Co; 3rd edition (June 11, 2003). ISBN: 0321173848 Wesley Pub Co; 3rd edition (June 11, 2003). ISBN: 0321173848

Java Programming with Oracle JDBC. Java Programming with Oracle JDBC. Donald Bales. O'Reilly (January 2002). Donald Bales. O'Reilly (January 2002). ISBN: 0-596-00088-XISBN: 0-596-00088-X

Principles of DB Systems with Internet and JavaPrinciples of DB Systems with Internet and Java. G. Riccardi. Addison Wesley . G. Riccardi. Addison Wesley 2001. ISBN: 02-0161-247-X 2001. ISBN: 02-0161-247-X

Java Oracle Database Development.Java Oracle Database Development. David J. Gallardo. Prentice Hall PTR (2003). David J. Gallardo. Prentice Hall PTR (2003). ISBN: 0-13-046218-7ISBN: 0-13-046218-7

JDBC: Practical Guide for Java Programmers.JDBC: Practical Guide for Java Programmers. Gregory Speegle. Morgan Gregory Speegle. Morgan Kaufmann, 1st Ed (nov, 2001). ISBN: 1558607366.Kaufmann, 1st Ed (nov, 2001). ISBN: 1558607366.

Database Programming with JDBC and Java, 2Database Programming with JDBC and Java, 2ndnd Edition Edition. . George Reese. George Reese. O'Reilly, 2000. ISBN: 1565926161O'Reilly, 2000. ISBN: 1565926161

Java Database best Practices.Java Database best Practices. George Reese, O’Reilly, 2003. ISBN: 0-596- George Reese, O’Reilly, 2003. ISBN: 0-596-00522-900522-9

JDBC™ Guide: Getting StartedJDBC™ Guide: Getting Started. Copyright © 1996, 1997, Sun Microsystems, Inc. . Copyright © 1996, 1997, Sun Microsystems, Inc. Documentación sobre JDBCDocumentación sobre JDBC. .

http://java.sun.com/j2se/1.4.2/docs/guide/jdbc/index.html. http://java.sun.com/j2se/1.4.2/docs/guide/jdbc/index.html. Oracle9 i JDBC Developer’s Guide and ReferenceOracle9 i JDBC Developer’s Guide and Reference. Copyright © 1999, 2001 . Copyright © 1999, 2001

Oracle Corporation.Oracle Corporation. Effective Oracle by designEffective Oracle by design. . Thomas Kyte. Oracle Press, 2003. ISBN: 0-07-Thomas Kyte. Oracle Press, 2003. ISBN: 0-07-

223065-7223065-7

Page 3: jdbc-100423010851-phpapp01

Programación de Bases de Datos ( 3 )© Francisco J. García IzquierdoIngeniería Técnica en Informática de Gestión

Departamento de

Matemáticas y Computación

ObjetivosObjetivos

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

Conocer la estructura habitual de las librerías CLI a través del caso particular de Java

Conocer el lugar de JDBC en la arquitectura de las Conocer el lugar de JDBC en la arquitectura de las aplicaciones con acceso a BDaplicaciones con acceso a BD

Evaluar las ventajas del uso de un API estándar de Evaluar las ventajas del uso de un API estándar de acceso a BDacceso a BD

Dominar el proceso de trabajo con JDBCDominar el proceso de trabajo con JDBC Dominar en un 50% el API JDBCDominar en un 50% el API JDBC

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 Conocer las aportaciones de las nuevas especificaciones JDBC 2 y 3especificaciones JDBC 2 y 3

Page 4: jdbc-100423010851-phpapp01

Programación de Bases de Datos ( 4 )© Francisco J. García IzquierdoIngeniería Técnica en Informática de Gestión

Departamento de

Matemáticas y Computación

AgendaAgenda

IntroducciónIntroducción Drivers JDBCDrivers JDBC La clase La clase DriverManagerDriverManager ConexionesConexiones Ejecución de instruccionesEjecución de instrucciones Transacciones y SQLTransacciones y SQL Cuando las cosas van malCuando las cosas van mal Temas avanzadosTemas avanzados JDBC 2JDBC 2

IntroducciónIntroducción Drivers JDBCDrivers JDBC La clase La clase DriverManagerDriverManager ConexionesConexiones Ejecución de instruccionesEjecución de instrucciones Transacciones y SQLTransacciones y SQL Cuando las cosas van malCuando las cosas van mal Temas avanzadosTemas avanzados JDBC 2JDBC 2

Page 5: jdbc-100423010851-phpapp01

Programación de Bases de Datos ( 5 )© Francisco J. García IzquierdoIngeniería Técnica en Informática de Gestión

Departamento de

Matemáticas y Computación

IntroducciónIntroducción

JDBC es un conjunto de clases e JDBC es un conjunto de clases e interfacesinterfaces Java para la Java para la ejecución de sentencias SQL (ejecución de sentencias SQL (ver JavaDoc).).

Es el CLI de JavaEs el CLI de Java Ha sido desarrollado conjuntamente por JavaSoft, Sybase, Ha sido desarrollado conjuntamente por JavaSoft, Sybase,

Informix, e IBM entre otros.Informix, e IBM entre otros. JDBC permite manipular cualquier base de datos SQL. No es JDBC permite manipular cualquier base de datos SQL. No es

necesario hacer un programa para manipular Oracle, otro para necesario hacer un programa para manipular Oracle, otro para Sybase, etc... Un mismo programa puede manipular cualquier Sybase, etc... Un mismo programa puede manipular cualquier base de datos.base de datos.

Uniendo Java con JDBC tenemos programas que se pueden Uniendo Java con JDBC tenemos programas que se pueden ejecutar en cualquier plataforma y que pueden manipular ejecutar en cualquier plataforma y que pueden manipular cualquier base de datos.cualquier base de datos.

Las clases e interfaces JDBC se encuentran en el paquete Las clases e interfaces JDBC se encuentran en el paquete java.sql..

Page 6: jdbc-100423010851-phpapp01

Programación de Bases de Datos ( 6 )© Francisco J. García IzquierdoIngeniería Técnica en Informática de Gestión

Departamento de

Matemáticas y Computación

Proceso de trabajo con JDBCProceso de trabajo con JDBC

AplicaciónAplicación

JDBCJDBC

Driver ADriver A

Connection

Statement

Gestor de drivers

Driver BDriver B

ResultSet

getConnection

createStatement

executeQuery

Page 7: jdbc-100423010851-phpapp01

Programación de Bases de Datos ( 7 )© Francisco J. García IzquierdoIngeniería Técnica en Informática de Gestión

Departamento de

Matemáticas y Computación

El proceso de trabajo en JDBC consiste en:El proceso de trabajo en JDBC consiste en: Conectarse a la base de datos (DriverManager). Emitir sentencias SQL (Statement, PreparedStatement,

CallableStatement). Procesar los resultados (ResulSet).

Ejemplo:Ejemplo:Connection con = DriverManager.getConnection(

"jdbc:odbc:misdatos", "login", "password");

Statement stmt = con.createStatement();ResultSet rs = stmt.executeQuery("SELECT d1,

d2, d3 FROM Tabla1");while (rs.next()) {

int x = getInt(”d1");String s = getString(”d2");float f = getFloat(”d3");

}

Connection con = DriverManager.getConnection(

"jdbc:odbc:misdatos", "login", "password");

Statement stmt = con.createStatement();

ResultSet rs = stmt.executeQuery("SELECT d1, d2, d3 FROM Tabla1");

while (rs.next()) {

int x = rs.getInt(”d1");

String s = rs.getString(”d2");

float f = rs.getFloat(”d3");

}

El proceso de trabajo en JDBC consiste en:El proceso de trabajo en JDBC consiste en: Conectarse a la base de datos (DriverManager). Emitir sentencias SQL (Statement, PreparedStatement,

CallableStatement). Procesar los resultados (ResulSet).

Ejemplo:Ejemplo:Connection con = DriverManager.getConnection(

"jdbc:odbc:misdatos", "login", "password");

Statement stmt = con.createStatement();ResultSet rs = stmt.executeQuery("SELECT d1,

d2, d3 FROM Tabla1");while (rs.next()) {

int x = getInt(”d1");String s = getString(”d2");float f = getFloat(”d3");

}

Connection con = DriverManager.getConnection(

"jdbc:odbc:misdatos", "login", "password");

Statement stmt = con.createStatement();

ResultSet rs = stmt.executeQuery("SELECT d1, d2, d3 FROM Tabla1");

while (rs.next()) {

int x = rs.getInt(”d1");

String s = rs.getString(”d2");

float f = rs.getFloat(”d3");

}

El proceso de trabajo en JDBC consiste en:El proceso de trabajo en JDBC consiste en: Conectarse a la base de datos (DriverManager). Emitir sentencias SQL (Statement, PreparedStatement,

CallableStatement). Procesar los resultados (ResulSet).

Ejemplo:Ejemplo:Connection con = DriverManager.getConnection(

"jdbc:odbc:misdatos", "login", "password");

Statement stmt = con.createStatement();ResultSet rs = stmt.executeQuery("SELECT d1,

d2, d3 FROM Tabla1");while (rs.next()) {

int x = getInt(”d1");String s = getString(”d2");float f = getFloat(”d3");

}

Connection con = DriverManager.getConnection(

"jdbc:odbc:misdatos", "login", "password");

Statement stmt = con.createStatement();

ResultSet rs = stmt.executeQuery("SELECT d1, d2, d3 FROM Tabla1");

while (rs.next()) {

int x = rs.getInt(”d1");

String s = rs.getString(”d2");

float f = rs.getFloat(”d3");

}

El proceso de trabajo en JDBC consiste en:El proceso de trabajo en JDBC consiste en: Conectarse a la base de datos (DriverManager). Emitir sentencias SQL (Statement, PreparedStatement,

CallableStatement). Procesar los resultados (ResulSet).

Ejemplo:Ejemplo:Connection con = DriverManager.getConnection(

"jdbc:odbc:misdatos", "login", "password");

Statement stmt = con.createStatement();ResultSet rs = stmt.executeQuery("SELECT d1,

d2, d3 FROM Tabla1");while (rs.next()) {

int x = getInt(”d1");String s = getString(”d2");float f = getFloat(”d3");

}

Connection con = DriverManager.getConnection(

"jdbc:odbc:misdatos", "login", "password");

Statement stmt = con.createStatement();

ResultSet rs = stmt.executeQuery("SELECT d1, d2, d3 FROM Tabla1");

while (rs.next()) {

int x = rs.getInt(”d1");

String s = rs.getString(”d2");

float f = rs.getFloat(”d3");

}

Proceso de trabajo con JDBCProceso de trabajo con JDBC

Page 8: jdbc-100423010851-phpapp01

Programación de Bases de Datos ( 8 )© Francisco J. García IzquierdoIngeniería Técnica en Informática de Gestión

Departamento de

Matemáticas y Computación

AgendaAgenda

IntroducciónIntroducción Drivers JDBCDrivers JDBC La clase La clase DriverManagerDriverManager ConexionesConexiones Ejecución de instruccionesEjecución de instrucciones Transacciones y SQLTransacciones y SQL Cuando las cosas van malCuando las cosas van mal Temas avanzadosTemas avanzados JDBC 2JDBC 2

Page 9: jdbc-100423010851-phpapp01

Programación de Bases de Datos ( 9 )© Francisco J. García IzquierdoIngeniería Técnica en Informática de Gestión

Departamento de

Matemáticas y Computación

El driver JDBCEl driver JDBC

JDBC es básicamente una colección de JDBC es básicamente una colección de interfaces Java (paqueteinterfaces Java (paquete java.sql). P.ej.). P.ej. Connection Statement ResultSet

Cada BD concreta implementará los interfaces Cada BD concreta implementará los interfaces de una manera particularde una manera particular La conexión (Connection) con Oracle no se hace

igual que la conexión con Access Para una BD concreta, el conjunto de clases Para una BD concreta, el conjunto de clases

implementación, clases auxiliares y clases de implementación, clases auxiliares y clases de utilidad componen el driver JDBC para esa BDutilidad componen el driver JDBC para esa BD

Una misma aplicación puede conectar con Una misma aplicación puede conectar con distintas BD con sólo cambiar el distintas BD con sólo cambiar el driver

Page 10: jdbc-100423010851-phpapp01

Programación de Bases de Datos ( 10 )© Francisco J. García IzquierdoIngeniería Técnica en Informática de Gestión

Departamento de

Matemáticas y Computación

Tipos de driversTipos de drivers

Tipo 1: Puente JDBC-ODBCTipo 1: Puente JDBC-ODBC 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 JDBC2 Pegas

Puede ser útil para pruebas pero es lento en producción Necesita del driver ODBC en cliente (menor portabilidad)

Tipo 2: Driver JDBC sobre driver nativo de la BDTipo 2: Driver JDBC sobre driver nativo de la BD 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)

Page 11: jdbc-100423010851-phpapp01

Programación de Bases de Datos ( 11 )© Francisco J. García IzquierdoIngeniería Técnica en Informática de Gestión

Departamento de

Matemáticas y Computación

Tipos de drivers (II)Tipos de drivers (II)

Tipo 3: Driver Java sobre redTipo 3: Driver Java sobre red 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

Tipo 4: Driver puro Java con protocolo nativoTipo 4: Driver puro Java con protocolo nativo Traduce las JDBC al protocolo específico de la BD Y contacta directamente con ella

Page 12: jdbc-100423010851-phpapp01

Programación de Bases de Datos ( 12 )© Francisco J. García IzquierdoIngeniería Técnica en Informática de Gestión

Departamento de

Matemáticas y Computación

Tipos de drivers (III)Tipos de drivers (III)

Driv e rM an age r

JDBC/O DBC

O DBC

JDBCDriv e rn ativ o

JDBC

JDBC

Clie n te Se rv id o r

Ap licació nJav a

Se rv e rM id d le w are

BD

Driver

ODBC

Page 13: jdbc-100423010851-phpapp01

Programación de Bases de Datos ( 13 )© Francisco J. García IzquierdoIngeniería Técnica en Informática de Gestión

Departamento de

Matemáticas y Computación

El interface El interface Driver y la clase y la clase DriverManager

El interface El interface DriverDriver especifica los métodos que todo driver especifica los métodos que todo driver JDBC debe implementar.JDBC debe implementar.

Será necesario un driver por cada tipo de base de datos que se Será necesario un driver por cada tipo de base de datos que se desee utilizar (un driver para Oracle, otro para MySQL, etc...) y desee utilizar (un driver para Oracle, otro para MySQL, etc...) y será el encargado de abrir conexiones con las mismas será el encargado de abrir conexiones con las mismas ((ConnectionConnection). ).

Ejemplos de driversEjemplos de drivers sun.jdbc.odbc.JdbcOdbcDriver oracle.jdbc.driver.OracleDriver com.microsoft.jdbc.sqlserver.SQLServerDriver com.mysql.jdbc.Driver

No se suele trabajar directamente con la clase concreta.No se suele trabajar directamente con la clase concreta. El El DriverManagerDriverManager agrupa los drivers y es el encargado de agrupa los drivers y es el encargado de

entregar el entregar el DriverDriver adecuado para cada base de datos. adecuado para cada base de datos.

Page 14: jdbc-100423010851-phpapp01

Programación de Bases de Datos ( 14 )© Francisco J. García IzquierdoIngeniería Técnica en Informática de Gestión

Departamento de

Matemáticas y Computación

AgendaAgenda

IntroducciónIntroducción Drivers JDBCDrivers JDBC La clase La clase DriverManagerDriverManager ConexionesConexiones Ejecución de instruccionesEjecución de instrucciones Transacciones y SQLTransacciones y SQL Cuando las cosas van malCuando las cosas van mal Temas avanzadosTemas avanzados JDBC 2JDBC 2

Page 15: jdbc-100423010851-phpapp01

Programación de Bases de Datos ( 15 )© Francisco J. García IzquierdoIngeniería Técnica en Informática de Gestión

Departamento de

Matemáticas y Computación

Clase Clase DriverManager

Es la capa de gestión de JDBCEs la capa de gestión de JDBC Se sitúa entre la aplicación que usará JDBC y Se sitúa entre la aplicación que usará JDBC y

los drivers JDBC de la BDlos drivers JDBC de la BD Guarda una lista de los drivers disponibles y …Guarda una lista de los drivers disponibles y … … … establece la conexión entre la BD y el driver establece la conexión entre la BD y el driver

apropiado para cada aplicaciónapropiado para cada aplicación Es la primera clase JDBC con la que las Es la primera clase JDBC con la que las

aplicaciones contactan para comenzar una aplicaciones contactan para comenzar una conexión JDBCconexión JDBC

DriverManager.getConnection(...)

Page 16: jdbc-100423010851-phpapp01

Programación de Bases de Datos ( 16 )© Francisco J. García IzquierdoIngeniería Técnica en Informática de Gestión

Departamento de

Matemáticas y Computación

Proceso de trabajo con JDBCProceso de trabajo con JDBC

AplicaciónAplicación

JDBCJDBC

Driver ADriver A

Connection

Statement

Gestor de drivers

Driver BDriver B

ResultSet

getConnection

createStatement

executeQuery

Page 17: jdbc-100423010851-phpapp01

Programación de Bases de Datos ( 17 )© Francisco J. García IzquierdoIngeniería Técnica en Informática de Gestión

Departamento de

Matemáticas y Computación

Mantenimiento de la lista de driversMantenimiento de la lista de drivers

¿Cómo se forma la lista de drivers disponibles?¿Cómo se forma la lista de drivers disponibles? Toda clase Toda clase DriverDriver debe auto-registrarse en el debe auto-registrarse en el

DrivermanagerDrivermanager nada más cargarse nada más cargarse Una clase Driver se carga, y por tanto se Una clase Driver se carga, y por tanto se

registra, de dos formas diferentes:registra, de dos formas diferentes: Cuando se inicia, el DriverManager consulta la

propiedad jdbc.drivers. Dicha propiedad contiene una lista de drivers (las clases) que se desea cargar.

Si se desea introducir un nuevo driver después de que el DriverManager se haya inicializado se utilizará el método forName de la clase Class

> java -Djdbc.drivers=sun.jdbc.odbc.JdbcOdbcDriver aplicación

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

Page 18: jdbc-100423010851-phpapp01

Programación de Bases de Datos ( 18 )© Francisco J. García IzquierdoIngeniería Técnica en Informática de Gestión

Departamento de

Matemáticas y Computación

Dónde poner el Dónde poner el forNameforName

El driver se debe registrar una única vez durante la vida El driver se debe registrar una única vez durante la vida de la aplicaciónde la aplicación

Se debe registrar al iniciar la aplicación (antes de pedir Se debe registrar al iniciar la aplicación (antes de pedir una conexión)una conexión)

Se debe elegir una clase que se inicialice al arrancar la Se debe elegir una clase que se inicialice al arrancar la aplicación y …aplicación y …

… … usar un bloque usar un bloque staticstatic para cargar el driver para cargar el driverpublic class GestorBD { static { try { Class.forName("oracle.jdbc.driver.OracleDriver"); } catch (ClassNotFoundException e) { System.out.println("No se ha podido cargar el driver de laBD"); } } ... Resto de la clase}

Page 19: jdbc-100423010851-phpapp01

Programación de Bases de Datos ( 19 )© Francisco J. García IzquierdoIngeniería Técnica en Informática de Gestión

Departamento de

Matemáticas y Computación

Obtención de conexionesObtención de conexiones

Es el Es el DriverDriver concreto el que realiza las conexiones, pero concreto el que realiza las conexiones, pero las solicitudes de conexión se realizan al las solicitudes de conexión se realizan al DriverManagerDriverManager

Una vez que la clase Una vez que la clase DriverDriver ha sido cargada y registrada ha sido cargada y registrada en en DriverManagerDriverManager, se pueden establecer conexiones , se pueden establecer conexiones con la BD. con la BD. Llamada al método DriverManager.getConnection(…) el DriverManager prueba los drivers registrados para ver si

puede establecer la conexión. Para ello usa la URL de conexión

Ejemplo (para Oracle)Ejemplo (para Oracle)

Class.forName("oracle.jdbc.driver.OracleDriver ");

String url = "jdbc:oracle:thin:@localhost:1521:PBD";

Connection con = DriverManager.getConnection(url, "PBD", "pbdpbd");

Page 20: jdbc-100423010851-phpapp01

Programación de Bases de Datos ( 20 )© Francisco J. García IzquierdoIngeniería Técnica en Informática de Gestión

Departamento de

Matemáticas y Computación

AgendaAgenda

IntroducciónIntroducción Drivers JDBCDrivers JDBC La clase La clase DriverManagerDriverManager ConexionesConexiones Ejecución de instruccionesEjecución de instrucciones Transacciones y SQLTransacciones y SQL Cuando las cosas van malCuando las cosas van mal Temas avanzadosTemas avanzados JDBC 2 JDBC 2

Page 21: jdbc-100423010851-phpapp01

Programación de Bases de Datos ( 21 )© Francisco J. García IzquierdoIngeniería Técnica en Informática de Gestión

Departamento de

Matemáticas y Computación

El interface El interface Connection

Un objeto de tipo Un objeto de tipo ConnectionConnection representa representa una sesión una sesión abierta con una base de datos.abierta con una base de datos.

Provee de un contexto en el que emitir sentencias SQL y Provee de un contexto en el que emitir sentencias SQL y obtener resultados.obtener resultados.

Una aplicación puede tener varias conexiones a una Una aplicación puede tener varias conexiones a una misma base de datos y/o varias conexiones a distintas misma base de datos y/o varias conexiones a distintas bases de datos.bases de datos.

A partir de una conexión se puede:A partir de una conexión se puede: Obtener objetos Statement, PreparedStatement o

CallableStatement para ejecutar sentencias SQL. Establecer el modo de las transacciones. Obtener información sobre la base de datos

(DatabaseMetadata). Las conexiones se obtienen del Las conexiones se obtienen del DriverManagerDriverManager

mediante el método mediante el método getConnection.getConnection.

Page 22: jdbc-100423010851-phpapp01

Programación de Bases de Datos ( 22 )© Francisco J. García IzquierdoIngeniería Técnica en Informática de Gestión

Departamento de

Matemáticas y Computación

URLs en JDBCURLs en JDBC

Uno de los parámetros del método Uno de los parámetros del método getConnectiongetConnection indica la indica la URL (con protocolo URL (con protocolo jdbcjdbc) que permite localizar la BD.) que permite localizar la BD.

La forma general de esta URL es:La forma general de esta URL es: jdbc:<subprotocolo>:<subnombre>

Por ejemplo:Por ejemplo: jdbc:oracle:thin:@172.77.77.77:1521:MIBD jdbc:odbc:MiBD

El subprotocolo es particular de cada SGBD y lo utiliza el El subprotocolo es particular de cada SGBD y lo utiliza el DriverManagerDriverManager para buscar el para buscar el DriverDriver adecuado para adecuado para manipular la base de datosmanipular la base de datos

El formato subnombre depende de cada subprotocolo concreto. El formato subnombre depende de cada subprotocolo concreto. El Driver será el encargado de interpretarlo y le ayudará a El Driver será el encargado de interpretarlo y le ayudará a localizar de alguna manera la base de datos.localizar de alguna manera la base de datos.

Los otros parámetros de Los otros parámetros de getConnectiongetConnection son el nombre de son el nombre de usuario y la contraseñausuario y la contraseña

Page 23: jdbc-100423010851-phpapp01

Programación de Bases de Datos ( 23 )© Francisco J. García IzquierdoIngeniería Técnica en Informática de Gestión

Departamento de

Matemáticas y Computación

Ejemplo de código de conexión a OracleEjemplo de código de conexión a Oracletry {

Class.forName("oracle.jdbc.driver.OracleDriver");

} catch (ClassNotFoundException 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 = DriverManager.getConnection(url, "PBD", "pbdpbd");

... Trabajo con la conexión

} catch (SQLException e) {

e.printStackTrace();

} finally {

try {

if (con != null) con.close();

} catch (SQLException e2) {

e2.printStackTrace();

}

}

Page 24: jdbc-100423010851-phpapp01

Programación de Bases de Datos ( 24 )© Francisco J. García IzquierdoIngeniería Técnica en Informática de Gestión

Departamento de

Matemáticas y Computación

ImportanteImportante

La aplicación no suele trabajar directamente con el La aplicación no suele trabajar directamente con el DriverDriver concreto. concreto.

Le pide al Le pide al DriverManagerDriverManager conexiones a la BD concreta conexiones a la BD concreta Busca por su lista de drivers alguno que sepa tratar el tipo Busca por su lista de drivers alguno que sepa tratar el tipo

de URL especificada y devuelve un objeto de URL especificada y devuelve un objeto ConnectionConnection (genérico)(genérico)

De esta manera las aplicaciones trabajan con De esta manera las aplicaciones trabajan con ConnectionConnections sin preocuparse del tipo de base de datos s sin preocuparse del tipo de base de datos con la que trabajan.con la que trabajan.

El mismo código sirve para cualquier BD. Sólo hay que El mismo código sirve para cualquier BD. Sólo hay que cambiar la URL.cambiar la URL.

IMPORTANTÍSIMO: IMPORTANTÍSIMO: cerrar la conexióncerrar la conexión. Usar el bloque . Usar el bloque finallyfinally

Page 25: jdbc-100423010851-phpapp01

Programación de Bases de Datos ( 25 )© Francisco J. García IzquierdoIngeniería Técnica en Informática de Gestión

Departamento de

Matemáticas y Computación

Page 26: jdbc-100423010851-phpapp01

Programación de Bases de Datos ( 26 )© Francisco J. García IzquierdoIngeniería Técnica en Informática de Gestión

Departamento de

Matemáticas y Computación

AgendaAgenda

IntroducciónIntroducción Drivers JDBCDrivers JDBC La clase La clase DriverManagerDriverManager ConexionesConexiones Ejecución de instruccionesEjecución de instrucciones Transacciones y SQLTransacciones y SQL Cuando las cosas van malCuando las cosas van mal Temas avanzadosTemas avanzados JDBC 2JDBC 2

Page 27: jdbc-100423010851-phpapp01

Programación de Bases de Datos ( 27 )© Francisco J. García IzquierdoIngeniería Técnica en Informática de Gestión

Departamento de

Matemáticas y Computación

El interface El interface Statement

Los objetos Los objetos StatementStatement permiten la ejecución de permiten la ejecución de sentencias SQL y obtener los resultados.sentencias SQL y obtener los resultados.

Es la propia conexión la que actúa como factoría de Es la propia conexión la que actúa como factoría de Statements:Statements:

Connection.createStatement()

Básicamente hay dos formas de lanzar sentencias SQL:Básicamente hay dos formas de lanzar sentencias SQL: Método executeQuery(<sql>) para comandos SQL que

producen tuplas como resultado (consultas SELECT)ResultSet rs = stmt.executeQuery("SELECT a, b, c FROM Table2");

Método executeUpdate(<sql>) en sentencias INSERT, DELETE, UPDATE, comandos DDL (CREATE, DROP, etc...) y bloques PL/SQL (entre begin y end;).

stmt.executeUpdate(”DROP TABLE Table2");

Connection con = DriverManager.getConnection(url, usr, pwd);

Statement stmt = con.createStatement();

ResultSet rs = stmt.executeQuery("SELECT a, b, c FROM Table2");

stmt.executeUpdate("DROP TABLE Table2");int n = stmt.executeUpdate("UPDATE Table2 SET a = a + 1");

Page 28: jdbc-100423010851-phpapp01

Programación de Bases de Datos ( 28 )© Francisco J. García IzquierdoIngeniería Técnica en Informática de Gestión

Departamento de

Matemáticas y Computación

El interface El interface Statement (II)(II)

El Método El Método executeQueryexecuteQuery devuelve un objeto de tipo devuelve un objeto de tipo ResultSetResultSet

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 El método executeUpdateexecuteUpdate devuelve un entero que devuelve un entero que indica el número de filas modificadas por el comandoindica el número de filas modificadas por el comando

Y en comandos DDL (CREATE, DROP, etc...) devuelve 0 Hay un método Hay un método execute(execute(<sql><sql>)) que ejecuta cualquier que ejecuta cualquier

tipo de sentenciatipo de sentencia Si es un SELECT devolverá true

El ResultSet se deberá conseguir con getResultSet() Si es un UPDATE, …, devolverá false

Las filas modificadas se consiguen con getUpdateCount()

Page 29: jdbc-100423010851-phpapp01

Programación de Bases de Datos ( 29 )© Francisco J. García IzquierdoIngeniería Técnica en Informática de Gestión

Departamento de

Matemáticas y Computación

El interface El interface Statement (III)(III)

Una vez que el resultado haya sido procesado Una vez que el resultado haya sido procesado se debe cerrar el se debe cerrar el StatementStatement mediante el mediante el método método close()close(). .

Esto cierra también el ResultSet asociado Aun así Sun recomienda CERRAR EL ResultSet

EXPLICITAMENTE Un mismo Un mismo StatementStatement puede reutilizarse en puede reutilizarse en

una misma conexión para ejecutar distintas una misma conexión para ejecutar distintas sentencias. sentencias.

Al reejecutar un Statement se cierran los ResultSet anteriores

Aun así Sun recomienda CERRAR EL ResultSet EXPLICITAMENTE

Page 30: jdbc-100423010851-phpapp01

Programación de Bases de Datos ( 30 )© Francisco J. García IzquierdoIngeniería Técnica en Informática de Gestión

Departamento de

Matemáticas y Computación

Ejemplo de código para OracleEjemplo de código para Oracle// Carga del driver (Class.forName ...

Connection con = null;

try {

String url = "jdbc:oracle:thin:@localhost:1521:PBD";

con = DriverManager.getConnection(url, "PBD", "pbdpbd");

Statement stmt = con.createStatement();

ResultSet rs = stmt.executeQuery(“SELECT a, b, c FROM Table2");

... Procesamiento del resultado

rs.close();

stmt.close();

} catch (SQLException e) {

e.printStackTrace();

} finally {

try {

if (con != null) con.close();

} catch (SQLException e2) {

e2.printStackTrace();

}

}

OJO QUE NO ACABE EN ;

Page 31: jdbc-100423010851-phpapp01

Programación de Bases de Datos ( 31 )© Francisco J. García IzquierdoIngeniería Técnica en Informática de Gestión

Departamento de

Matemáticas y Computación

Composición del SQLComposición del SQL

El SQL que aceptan los métodos El SQL que aceptan los métodos executeXxxexecuteXxx es un String (JDBC es CLI) es un String (JDBC es CLI)

Puede componerse dinámicamente en Puede componerse dinámicamente en función de valores de variablesfunción de valores de variables

Para componer el String del SQL habrá Para componer el String del SQL habrá que concatenar los distintos trozos del que concatenar los distintos trozos del SQL (los estáticos y los variables).SQL (los estáticos y los variables).

String id = "xx67yw8“;String sql = "SELECT a, b, c FROM Table2 WHERE id ='" + id + "'";ResultSet rs = stmt.executeQuery(sql);

Page 32: jdbc-100423010851-phpapp01

Programación de Bases de Datos ( 32 )© Francisco J. García IzquierdoIngeniería Técnica en Informática de Gestión

Departamento de

Matemáticas y Computación

El interface El interface ResultSetResultSet

Los objetos de tipo Los objetos de tipo ResultSetResultSet ofrecen métodos para ofrecen métodos para recorrer el resultado de una consulta.recorrer el resultado de una consulta.

Mantiene un puntero a la fila actual. Mantiene un puntero a la fila actual. Cada vez que se invoca el método next() se pasa a la

siguiente fila. 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!) next() devuelve

true, si el puntero ha avanzado a la siguiente fila false, si no quedan más filas que procesar

ResultSet rs = stmt.executeQuery("SELECT a, b, c FROM Table2");

while (rs.next()) {

... Tratamiento de cada fila

}

Page 33: jdbc-100423010851-phpapp01

Programación de Bases de Datos ( 33 )© Francisco J. García IzquierdoIngeniería Técnica en Informática de Gestión

Departamento de

Matemáticas y Computación

El interface El interface ResultSetResultSet (II) (II)

Se obtienen los valores de la fila actual utilizando las distintas Se obtienen los valores de la fila actual utilizando las distintas versiones del método versiones del método getget<tipo>(<columna>)<tipo>(<columna>) pudiendo pudiendo indicar la columna mediante su nombre o mediante su posición indicar la columna mediante su nombre o mediante su posición ((comienza por la 1comienza por la 1).).

Ejemplo: Ejemplo: devolverá N filas, con la columna 1 como un int, la 2 devolverá N filas, con la columna 1 como un int, la 2 como un String y la 3 como una fecha como un String y la 3 como una fecha

Conviene cerrar el Conviene cerrar el ResultSetResultSet aunque se cierra implícitamente aunque se cierra implícitamente al cerrar o reutilizar el al cerrar o reutilizar el StatementStatement que lo creó. que lo creó.

ResultSet rs = stmt.executeQuery("SELECT a, b, c FROM Table1");

while (rs.next()) {

int i = rs.getInt("a"); // rs.getInt(1)

String s = rs.getString("b"); // rs.getString(2)

java.sql.Date f = rs.getDate("c"); // rs.getDate (3)

System.out.println(“FILA = " + i + " " + s + " " + f);

}

Page 34: jdbc-100423010851-phpapp01

Programación de Bases de Datos ( 34 )© Francisco J. García IzquierdoIngeniería Técnica en Informática de Gestión

Departamento de

Matemáticas y Computación

ResultSetResultSet y valores nulos y valores nulos

Cuando se ha leído un Cuando se ha leído un nullnull de SQL usando uno de los de SQL usando uno de los métodos métodos get<tipo>get<tipo>, éste devuelve algo de lo siguiente:, éste devuelve algo de lo siguiente: Un valor nullnull de Java para aquellos métodos get<tipo> que

devuelven objetos Java (getStringgetString, getBigDecimalgetBigDecimal, getBytesgetBytes, getDategetDate, getTimegetTime, getTimestampgetTimestamp, …).

Un valor cero para getBytegetByte, getShortgetShort, getIntgetInt, getLonggetLong, getFloatgetFloat y getDoublegetDouble.

Un valor false para getBoolean. Para determinar si un valor resultado dado es Para determinar si un valor resultado dado es nullnull, ,

primero debe intentarse leer la columna y usar el método primero debe intentarse leer la columna y usar el método de de ResultSetResultSet wasNull()wasNull() para ver si lo que acabamos para ver si lo que acabamos de leer era de leer era nullnull

int i = rs.getInt("a"); // si el valor es null, i vale 0

if (rs.wasNull() {

...

}

Page 35: jdbc-100423010851-phpapp01

Programación de Bases de Datos ( 35 )© Francisco J. García IzquierdoIngeniería Técnica en Informática de Gestión

Departamento de

Matemáticas y Computación

Navegación por el Navegación por el ResultSetResultSet

En principio sólo se puede avanzar por En principio sólo se puede avanzar por las filas de datos (las filas de datos (next()next()))

No se puede retroceder, ni volver a No se puede retroceder, ni volver a procesar un procesar un ResultSetResultSet..

A partir de JDBC2, se incluyen métodos A partir de JDBC2, se incluyen métodos para ir hacia detrás, al principio, al final, a para ir hacia detrás, al principio, al final, a una fila determinada …una fila determinada …

… … pero tienen implicaciones en el pero tienen implicaciones en el rendimiento de la aplicaciónrendimiento de la aplicación

Page 36: jdbc-100423010851-phpapp01

Programación de Bases de Datos ( 36 )© Francisco J. García IzquierdoIngeniería Técnica en Informática de Gestión

Departamento de

Matemáticas y Computación

Tipos de datos y Tipos de datos y get<Tipo>get<Tipo>

Una “x” indica que el método Una “x” indica que el método getget<tipo><tipo> puede puede legalmente usarse para recuperar el tipo JDBC dado.legalmente usarse para recuperar el tipo JDBC dado.

Una “Una “XX” indica que el método ” indica que el método getget<tipo><tipo> es el es el recomendado para recuperar el tipo de dato dado.recomendado para recuperar el tipo de dato dado.

  T

INY

INT

SM

ALL

INT

INT

EG

ER

BIG

NT

RE

AL

FLO

AT

DO

UB

LE

DE

CIM

AL

NU

ME

RIC

BIT

CH

AR

VA

RC

HA

R

LON

GV

AR

CH

AR

BIN

AR

Y

VA

RB

INA

RY

LON

GV

AR

BIN

AR Y

DA

TE

TIM

E

TIM

ES

TA

MP

getByte X x x x x x x x x x x x x            

getShort x X x x x x x x x x x x x            

getInt x x X x x x x x x x x x x            

getLong x x x X x x x x x x x x x            

getFloat x x x x X x x x x x x x x            

getDouble x x x x x X X x x x x x x            

Page 37: jdbc-100423010851-phpapp01

Programación de Bases de Datos ( 37 )© Francisco J. García IzquierdoIngeniería Técnica en Informática de Gestión

Departamento de

Matemáticas y Computación

Tipos de datos y Tipos de datos y get<Tipo>get<Tipo>

 

TIN

YIN

T

SM

ALL

INT

INT

EG

ER

BIG

NT

RE

AL

FLO

AT

DO

UB

LE

DE

CIM

AL

NU

ME

RIC

BIT

CH

AR

VA

RC

HA

R

LON

GV

AR

CH

AR

BIN

AR

Y

VA

RB

INA

RY

LON

GV

AR

BIN

AR

Y

DA

TE

TIM

E

TIM

ES

TA

MP

getBigDecimal x x x x x x x X X x x x x            

getBoolean x x x x x x x x x X x x x            

getString x x x x x x x x x x X X x x x x x x x

getBytes                           X X x      

getDate                     x x x       X   x

getTime                     x x x         X x

getTimestamp                     x x x       x   X

getAsciiStream                     x x X x x x      

getUnicodeStream                     x x X x x x      

getBinaryStream                           x x X      

getObject x x x x x x x x x x x x x x x x x x x

Page 38: jdbc-100423010851-phpapp01

Programación de Bases de Datos ( 38 )© Francisco J. García IzquierdoIngeniería Técnica en Informática de Gestión

Departamento de

Matemáticas y Computación

try {

Class.forName("oracle.jdbc.driver.OracleDriver");

} catch (ClassNotFoundException 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 = DriverManager.getConnection(url, "PBD", "pbdpbd");

Statement stmt = con.createStatement();

ResultSet rs = stmt.executeQuery("SELECT a, b, c FROM Table1");

while (rs.next()) {

int i = rs.getInt("a"); // rs.getInt(1)

String s = rs.getString("b"); // rs.getString(2)

java.sql.Date f = rs.getDate("c"); // rs.getDate (3)

System.out.println(“FILA = " + i + " " + s + " " + f);

}

try {

Class.forName("oracle.jdbc.driver.OracleDriver");

} catch (ClassNotFoundException 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 = DriverManager.getConnection(url, "PBD", "pbdpbd");

Statement stmt = con.createStatement();

ResultSet rs = stmt.executeQuery("SELECT a, b, c FROM Table1");

while (rs.next()) {

int i = rs.getInt("a"); // rs.getInt(1)

String s = rs.getString("b"); // rs.getString(2)

java.sql.Date f = rs.getDate("c"); // rs.getDate (3)

System.out.println(“FILA = " + i + " " + s + " " + f);

}

Carga del driver

try {

Class.forName("oracle.jdbc.driver.OracleDriver");

} catch (ClassNotFoundException 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 = DriverManager.getConnection(url, "PBD", "pbdpbd");

Statement stmt = con.createStatement();

ResultSet rs = stmt.executeQuery("SELECT a, b, c FROM Table1");

while (rs.next()) {

int i = rs.getInt("a"); // rs.getInt(1)

String s = rs.getString("b"); // rs.getString(2)

java.sql.Date f = rs.getDate("c"); // rs.getDate (3)

System.out.println(“FILA = " + i + " " + s + " " + f);

}

Conexión

try {

Class.forName("oracle.jdbc.driver.OracleDriver");

} catch (ClassNotFoundException 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 = DriverManager.getConnection(url, "PBD", "pbdpbd");

Statement stmt = con.createStatement();

ResultSet rs = stmt.executeQuery("SELECT a, b, c FROM Table1");

while (rs.next()) {

int i = rs.getInt("a"); // rs.getInt(1)

String s = rs.getString("b"); // rs.getString(2)

java.sql.Date f = rs.getDate("c"); // rs.getDate (3)

System.out.println(“FILA = " + i + " " + s + " " + f);

}

Consulta

try {

Class.forName("oracle.jdbc.driver.OracleDriver");

} catch (ClassNotFoundException 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 = DriverManager.getConnection(url, "PBD", "pbdpbd");

Statement stmt = con.createStatement();

ResultSet rs = stmt.executeQuery("SELECT a, b, c FROM Table1");

while (rs.next()) {

int i = rs.getInt("a"); // rs.getInt(1)

String s = rs.getString("b"); // rs.getString(2)

java.sql.Date f = rs.getDate("c"); // rs.getDate (3)

System.out.println(“FILA = " + i + " " + s + " " + f);

}

Procesar resultado

Ejemplo completoEjemplo completo

Page 39: jdbc-100423010851-phpapp01

Programación de Bases de Datos ( 39 )© Francisco J. García IzquierdoIngeniería Técnica en Informática de Gestión

Departamento de

Matemáticas y Computación

Ejemplo completo (II)Ejemplo completo (II)...

rs.close();

stmt.close();

} catch (SQLException e) {

e.printStackTrace();

} finally {

try {

if (con != null) con.close();

} catch (SQLException e) {

e.printStackTrace();

}

}

...

rs.close();

stmt.close();

} catch (SQLException e) {

e.printStackTrace();

} finally {

try {

if (con != null) con.close();

} catch (SQLException e2) {

e2.printStackTrace();

}

}

Cerrar TODO

Page 40: jdbc-100423010851-phpapp01

Programación de Bases de Datos ( 40 )© Francisco J. García IzquierdoIngeniería Técnica en Informática de Gestión

Departamento de

Matemáticas y Computación

package sol;

import bd.AbstractDBManager;

import java.sql.*;

import model.*;

public class GestorBD extends AbstractDBManager {

// Registro del driver apropiado para la BD a utilizar

static {

try {

Class.forName("oracle.jdbc.driver.OracleDriver");

} catch (ClassNotFoundException e) {

System.out.println("No puedo cargar el driver JDBC de la BD");

}

}

public Articulo getArticulo(String codigo) {

}

}

Ejemplo de prácticasEjemplo de prácticas

Page 41: jdbc-100423010851-phpapp01

Programación de Bases de Datos ( 41 )© Francisco J. García IzquierdoIngeniería Técnica en Informática de Gestión

Departamento de

Matemáticas y Computación

public Articulo getArticulo(String codigo) {

Articulo articulo = null;

Connection con = null;

try {

con = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:pbd",

"prbd", "prbdprbd");

Statement stm = con.createStatement();

String sql = "SELECT nombre, PVP FROM Articulo WHERE codigo ='" +codigo+ "'";

ResultSet res = stm.executeQuery(sql);

if (res.next()) {

articulo = new Articulo(codigo, res.getString("nombre"),res.getDouble("PVP"));

}

res.close();

stm.close();

} catch (SQLException e) {

e.printStackTrace();

} finally {

if (con != null)

try {

con.close();

} catch (SQLException ex) {

ex.printStackTrace();

}

}

return articulo;

}

Page 42: jdbc-100423010851-phpapp01

Programación de Bases de Datos ( 42 )© Francisco J. García IzquierdoIngeniería Técnica en Informática de Gestión

Departamento de

Matemáticas y Computación

El interface El interface PreparedStatementPreparedStatement

Cada vez que se lanza un Cada vez que se lanza un StatementStatement el SGBD debe el SGBD debe interpretarla y calcular un plan de consultainterpretarla y calcular un plan de consulta

La clase La clase PreparedStatementPreparedStatement permite lanzar comandos permite lanzar comandos SQL precompilados.SQL precompilados.

En sentencias que van a ser ejecutadas múltiples veces En sentencias que van a ser ejecutadas múltiples veces se obtiene un aumento de rendimiento al tener la consulta se obtiene un aumento de rendimiento al tener la consulta ya analizada y optimizada.ya analizada y optimizada.

Los objetos Los objetos PreparedStatementPreparedStatement se obtienen de la se obtienen de la conexión, mediante el método conexión, mediante el método prepareStatement(<sql>)prepareStatement(<sql>)Connection con = DriverManager.getConnection(url, usr, pwd);

PreparedStatement stmt = con.prepareStatement(... SQL ...);

Page 43: jdbc-100423010851-phpapp01

Programación de Bases de Datos ( 43 )© Francisco J. García IzquierdoIngeniería Técnica en Informática de Gestión

Departamento de

Matemáticas y Computación

El interface El interface PreparedStatementPreparedStatement

Otro uso de Otro uso de PreparedStatementPreparedStatement es la posibilidad de es la posibilidad de parametrizar las consultasparametrizar las consultas

La sentencia SQL puede contiene uno o más parámetros La sentencia SQL puede contiene uno o más parámetros de entrada (indicados por ‘?’) los cuales podrán ser de entrada (indicados por ‘?’) los cuales podrán ser modificados en distintas ejecuciones de la sentencia.modificados en distintas ejecuciones de la sentencia.

Esta funcionalidad puede ser útil cuando no se sabe cómo Esta funcionalidad puede ser útil cuando no se sabe cómo escribir los valores de ciertos tipos de datos en el SQL del escribir los valores de ciertos tipos de datos en el SQL del SGBD destino (ejemplo, los valores DATE, boolean).SGBD destino (ejemplo, los valores DATE, boolean).

También puede evitar “inyecciones de SQL”También puede evitar “inyecciones de SQL”

PreparedStatement ps = con.prepareStatement("UPDATE table SET sueldo=? WHERE nombre=?");

Page 44: jdbc-100423010851-phpapp01

Programación de Bases de Datos ( 44 )© Francisco J. García IzquierdoIngeniería Técnica en Informática de Gestión

Departamento de

Matemáticas y Computación

Inyección de SQLInyección de SQL

Detrás de un formulario de autenticación habrá una Detrás de un formulario de autenticación habrá una consulta como:consulta como:SELECT * FROM users WHERE usr=‘Bob’ and

pwd=‘2kjlu’ Si la consulta devuelve resultado, el usuario puede entrar; Si la consulta devuelve resultado, el usuario puede entrar;

si no, adiós muy buenas.si no, adiós muy buenas. El código de la aplicación concatena la consulta El código de la aplicación concatena la consulta

basándose en el contenido de los campos del formulario:basándose en el contenido de los campos del formulario:"SELECT * FROM users WHERE usr='"+ elUsuario +"'

and pwd='"+ laContraseña +"'" Ej: Ej: SELECT * FROM users WHERE usr='fco' and pwd='xx' Si el usuario meteSi el usuario mete

Como usuario: admin Como contraseña: MeDaIgual' OR '1'='1

La cosa queda:La cosa queda:SELECT * FROM users WHERE usr='admin' and pwd='MeDaIgual' OR '1'='1'

Page 45: jdbc-100423010851-phpapp01

Programación de Bases de Datos ( 45 )© Francisco J. García IzquierdoIngeniería Técnica en Informática de Gestión

Departamento de

Matemáticas y Computación

El interface El interface PreparedStatementPreparedStatement

Antes de que la sentencia SQL pueda ser ejecutada Antes de que la sentencia SQL pueda ser ejecutada deberemos asignar algún valor a los parámetros de entradadeberemos asignar algún valor a los parámetros de entrada

La asignación se realiza mediante el método La asignación se realiza mediante el método set<tipo>()set<tipo>() siendo el tipo compatible con el del parámetro.siendo el tipo compatible con el del parámetro.

El método set<tipo> lleva dos argumentos:El método set<tipo> lleva dos argumentos: La posición del parámetro a asignar dentro de la sentencia (el

primero es el 1). El valor a asignar al parámetro.

Finalmente se ejecuta la sentencia:Finalmente se ejecuta la sentencia:ps.executeUpdate();

PreparedStatement ps = con.prepareStatement("UPDATE table SET sueldo=? WHERE nombre=?");ps.setFloat(1, 1500.0);ps.setString(2, “Pepe");

ps.executeUpdate();

Page 46: jdbc-100423010851-phpapp01

Programación de Bases de Datos ( 46 )© Francisco J. García IzquierdoIngeniería Técnica en Informática de Gestión

Departamento de

Matemáticas y Computación

EjemploEjemplotry {

Class.forName("oracle.jdbc.driver.OracleDriver");

} catch (ClassNotFoundException 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 = DriverManager.getConnection(url, "PBD", "pbdpbd"); float sueldos [] = {1500, 2000, 1205.75f}; String nombres [] = {"Juan","Ana","Maria"}; PreparedStatement ps = con.prepareStatement("UPDATE table SET sueldo=? WHERE nombre=?"); for (int i=0;i<sueldos.length;i++) { ps.setFloat(1,sueldos[i]); ps.setString(2,nombres[i]); ps.executeUpdate(); } ps.close();

Page 47: jdbc-100423010851-phpapp01

Programación de Bases de Datos ( 47 )© Francisco J. García IzquierdoIngeniería Técnica en Informática de Gestión

Departamento de

Matemáticas y Computación

Ejemplo (II)Ejemplo (II)} catch (SQLException e) { e.printStackTrace();} finally { try { if (con != null) con.close(); } catch (SQLException e2) { e2.printStackTrace(); }}

Page 48: jdbc-100423010851-phpapp01

Programación de Bases de Datos ( 48 )© Francisco J. García IzquierdoIngeniería Técnica en Informática de Gestión

Departamento de

Matemáticas y Computación

Parámetros con valores Parámetros con valores nullnull

Cuando se pasa un valor Cuando se pasa un valor nullnull Java en Java en alguno de los métodos alguno de los métodos set<tipo>()set<tipo>(), se , se almacena un valor SQL almacena un valor SQL nullnull en la BD. en la BD.

Si son valores de tipos primitivos (Si son valores de tipos primitivos (intint, , floatfloat, , booleanboolean, …), …) El método a utilizar es setNull() Hay que indicar el tipo

PreparedStatement ps = con.prepareStatement(“INSERT INTO Persona(nombre, casado) VALUES (?,?)");ps.setString (1, "Juan");ps.setNull(2, java.sql.Types.BOOLEAN);

Page 49: jdbc-100423010851-phpapp01

Programación de Bases de Datos ( 49 )© Francisco J. García IzquierdoIngeniería Técnica en Informática de Gestión

Departamento de

Matemáticas y Computación

Notas sobre fechas (Oracle)Notas sobre fechas (Oracle)

Al almacenar fechas en Oracle podemos perder precisiónAl almacenar fechas en Oracle podemos perder precisión Oracle tiene dos (tres) tipos para fechas:Oracle tiene dos (tres) tipos para fechas:

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 Cualquiera de los dos tipos de campos puede

consultarse / almacenarse con consultarse / almacenarse con setDatesetDate//getDategetDate o o setTimestampsetTimestamp//getTimestampgetTimestamp

Pero:Pero: setDate no almacena datos sobre la hora, sólo la fecha (la

hora la pone a 00:00:00) getDate no recupera datos sobre la hora (aunque sí esté en

la BD) setTimestamp/getTimestamp 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

Page 50: jdbc-100423010851-phpapp01

Programación de Bases de Datos ( 50 )© Francisco J. García IzquierdoIngeniería Técnica en Informática de Gestión

Departamento de

Matemáticas y Computación

El interface El interface CallableStatementCallableStatement

Los objetos Los objetos CallableStatementCallableStatement proporcionan un proporcionan un mecanismo para invocación de stored procedures de la mecanismo para invocación de stored procedures de la base de datos. base de datos.

Se obtienen de Se obtienen de ConnectionConnection mediante el método mediante el método prepareCall(...)prepareCall(...)

La sintaxis de la invocación es:La sintaxis de la invocación es: {[? = ]call <procedure_name>[(?, ?, ...)]}

Los procedimientos almacenados pueden tener Los procedimientos almacenados pueden tener parámetros de tres tiposparámetros de tres tipos Los parámetros IN se tratan como en PreparedStatement. Los parámetros OUT hay que registrarlos mediante:

registerOutParameter(<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 Finalmente se ejecuta la sentencia y se recogen los

valores OUT con la familia de métodos valores OUT con la familia de métodos get<tipo>(<indice>)get<tipo>(<indice>)

Page 51: jdbc-100423010851-phpapp01

Programación de Bases de Datos ( 51 )© Francisco J. García IzquierdoIngeniería Técnica en Informática de Gestión

Departamento de

Matemáticas y Computación

EjemploEjemplo

Supongamos una función llamada Supongamos una función llamada PrecioArticuloPrecioArticulo que que devuelve el precio de una cantidad de artículosdevuelve el precio de una cantidad de artículos

// Carga del driver ...

Connection con = null;

try { String url = "jdbc:oracle:thin:@localhost:1521:PBD"; con = DriverManager.getConnection(url, "PBD", "pbdpbd"); CallableStatement call=con.prepareCall("{?=call PrecioArticulo(?,?)}"); call.registerOutParameter(1, Types.DOUBLE); call.setString(2, "D786SCO"); call.setInt(3, 10); call.executeQuery(); precioLinea = call.getDouble(1); call.close();} ... cerrar la conexión

Page 52: jdbc-100423010851-phpapp01

Programación de Bases de Datos ( 52 )© Francisco J. García IzquierdoIngeniería Técnica en Informática de Gestión

Departamento de

Matemáticas y Computación

Ejemplo (II)Ejemplo (II)

Un procedimiento (Un procedimiento (swapswap) de intercambio de valores (dos ) de intercambio de valores (dos parámetros INOUT)parámetros INOUT)

// Carga del driver ...

Connection con = null;

try { // ... Establecimiento de la conexión CallableStatement call = con.prepareCall(“{call swap(?, ?)}"); call.registerOutParameter(1, Types.INTEGER); call.registerOutParameter(2, Types.INTEGER); call.setInt(1, 1); call.setInt(2, 2); call.execute(); int r1 = call.getInt(1); int r2 = call.getInt(2); call.close(); System.out.println("Los valores ahora son "+r1+" y "+r2);} ... cerrar la conexión

Page 53: jdbc-100423010851-phpapp01

Programación de Bases de Datos ( 53 )© Francisco J. García IzquierdoIngeniería Técnica en Informática de Gestión

Departamento de

Matemáticas y Computación

AgendaAgenda

IntroducciónIntroducción Drivers JDBCDrivers JDBC La clase La clase DriverManagerDriverManager ConexionesConexiones Ejecución de instruccionesEjecución de instrucciones Transacciones y SQLTransacciones y SQL Cuando las cosas van malCuando las cosas van mal Temas avanzadosTemas avanzados JDBC 2JDBC 2

Page 54: jdbc-100423010851-phpapp01

Programación de Bases de Datos ( 54 )© Francisco J. García IzquierdoIngeniería Técnica en Informática de Gestión

Departamento de

Matemáticas y Computación

Transacciones en JDBCTransacciones en JDBC

Una transacción es un conjunto de sentencias que se Una transacción es un conjunto de sentencias que se deben completar o anular en su totalidad.deben completar o anular en su totalidad.

Cuando se inicia una transacción la forma de hacerla Cuando se inicia una transacción la forma de hacerla definitiva es mediante el método definitiva es mediante el método commit()commit() del interface del interface ConnectionConnection..

Si se desean deshacer todas las sentencias de la Si se desean deshacer todas las sentencias de la transacción hay que invocar al método transacción hay que invocar al método rollback()rollback() del del interface interface ConnectionConnection..

Las conexiones están por defecto en modo autoCommit, Las conexiones están por defecto en modo autoCommit, es decir, las sentencias se auto-confirman sin necesidad es decir, las sentencias se auto-confirman sin necesidad de llamar a de llamar a commit()commit() cuando finalizan (luego cada cuando finalizan (luego cada sentencia es una transacción).sentencia es una transacción).

Page 55: jdbc-100423010851-phpapp01

Programación de Bases de Datos ( 55 )© Francisco J. García IzquierdoIngeniería Técnica en Informática de Gestión

Departamento de

Matemáticas y Computación

Transacciones en JDBCTransacciones en JDBC

El modo autoCommit se activa/desactiva con el El modo autoCommit se activa/desactiva con el método método setAutoCommit(boolean on)setAutoCommit(boolean on) del del interface interface ConnectionConnection..

Si el modo autoCommit está desactivado las Si el modo autoCommit está desactivado las transacciones no finalizarán hasta que se llame transacciones no finalizarán hasta que se llame a a commit()commit() o o rollback()rollback() explícitamente. explícitamente.

A su vez dichos métodos inician una nueva A su vez dichos métodos inician una nueva transacción, por lo que una transacción serán transacción, por lo que una transacción serán todas aquellas sentencias ejecutadas entre dos todas aquellas sentencias ejecutadas entre dos commit y/o rollback consecutivos.commit y/o rollback consecutivos.

También se puede establecer un punto de También se puede establecer un punto de recuperación con el método recuperación con el método setSavePoint() setSavePoint() del interface del interface ConnectionConnection (desde JDBC 3.0). (desde JDBC 3.0).

Page 56: jdbc-100423010851-phpapp01

Programación de Bases de Datos ( 56 )© Francisco J. García IzquierdoIngeniería Técnica en Informática de Gestión

Departamento de

Matemáticas y Computación

EjemploEjemplo... Carga del driver ...

String URL = "jdbc:oracle:thin:@localhost:1521:PBD";

Connection con = null;

try {

con = DriverManager.getConnection(URL, "PBD", "pbdpbd");

con.setAutoCommit(false);

float sueldos [] = {1500, 2000, 1205.75f};

String nombres [] = {"Juan","Ana","Maria"};

PreparedStatement ps =con.prepareStatement("UPDATE table SET sueldo=?"+

"WHERE nombre=?");

for (int i=0;i<sueldos.length;i++) {

ps.setFloat(1,sueldos[i]);

ps.setString(2,nombres[i]);

ps.executeUpdate();

}

ps.close();

con.commit();

Page 57: jdbc-100423010851-phpapp01

Programación de Bases de Datos ( 57 )© Francisco J. García IzquierdoIngeniería Técnica en Informática de Gestión

Departamento de

Matemáticas y Computación

Ejemplo (II)Ejemplo (II)} catch (SQLException e) { e.printStackTrace(); try { if (con != null) con.rollback(); } catch (SQLException e2) { e2.printStackTrace(); }} finally { try { if (con != null) con.close(); } catch (SQLException e2) { e2.printStackTrace(); }}

Page 58: jdbc-100423010851-phpapp01

Programación de Bases de Datos ( 58 )© Francisco J. García IzquierdoIngeniería Técnica en Informática de Gestión

Departamento de

Matemáticas y Computación

Control de la concurrenciaControl de la concurrencia

¿Que ocurre cuando un proceso está realizando una ¿Que ocurre cuando un proceso está realizando una transacción (no se sabe si la confirmará o no) y otro transacción (no se sabe si la confirmará o no) y otro intenta acceder a filas afectadas por la transacción?intenta acceder a filas afectadas por la transacción?

El programador debe decidir como debe comportarse la El programador debe decidir como debe comportarse la conexión en ese caso mediante el método conexión en ese caso mediante el método setTransactionIsolation(<tipo>)setTransactionIsolation(<tipo>)..

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).

Page 59: jdbc-100423010851-phpapp01

Programación de Bases de Datos ( 59 )© Francisco J. García IzquierdoIngeniería Técnica en Informática de Gestión

Departamento de

Matemáticas y Computación

Control de la concurrencia (II)Control de la concurrencia (II)

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.

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).

Page 60: jdbc-100423010851-phpapp01

Programación de Bases de Datos ( 60 )© Francisco J. García IzquierdoIngeniería Técnica en Informática de Gestión

Departamento de

Matemáticas y Computación

AgendaAgenda

IntroducciónIntroducción Drivers JDBCDrivers JDBC La clase La clase DriverManagerDriverManager ConexionesConexiones Ejecución de instruccionesEjecución de instrucciones Transacciones y SQLTransacciones y SQL Cuando las cosas van malCuando las cosas van mal Temas avanzadosTemas avanzados JDBC 2JDBC 2

Page 61: jdbc-100423010851-phpapp01

Programación de Bases de Datos ( 61 )© Francisco J. García IzquierdoIngeniería Técnica en Informática de Gestión

Departamento de

Matemáticas y Computación

SQLExceptionSQLException

La mayoría de los métodos de las clases e La mayoría de los métodos de las clases e interfaces JDBC lanzan la excepción interfaces JDBC lanzan la excepción java.sql.SQLExceptionjava.sql.SQLException cuando se produce cuando se produce algún error con relación a la BD:algún error con relación a la BD: No se puede conectar La sentencia está mal construida …

SQLExceptionSQLException es una exception explícita y es una exception explícita y proporcionaproporciona Un mensaje explicativo sobre la causa del error - getMessage()

Un código (entero) que identifica al error - getErrorCode()

Un enlace a la siguiente excepción anidada - getNextException()

Page 62: jdbc-100423010851-phpapp01

Programación de Bases de Datos ( 62 )© Francisco J. García IzquierdoIngeniería Técnica en Informática de Gestión

Departamento de

Matemáticas y Computación

AgendaAgenda

IntroducciónIntroducción Drivers JDBCDrivers JDBC La clase La clase DriverManagerDriverManager ConexionesConexiones Ejecución de instruccionesEjecución de instrucciones Transacciones y SQLTransacciones y SQL Cuando las cosas van malCuando las cosas van mal Temas avanzadosTemas avanzados JDBC 2JDBC 2

Page 63: jdbc-100423010851-phpapp01

Programación de Bases de Datos ( 63 )© Francisco J. García IzquierdoIngeniería Técnica en Informática de Gestión

Departamento de

Matemáticas y Computación

DatabaseMetaDataDatabaseMetaData

La conexión proporciona información sobre la La conexión proporciona información sobre la BD a la que se conectaBD a la que se conecta

Para ello dispone del método Para ello dispone del método getMetaData()getMetaData() que devuelve un objeto que devuelve un objeto DatabaseMetaDataDatabaseMetaData al al que se puede preguntar por:que se puede preguntar por: 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

Page 64: jdbc-100423010851-phpapp01

Programación de Bases de Datos ( 64 )© Francisco J. García IzquierdoIngeniería Técnica en Informática de Gestión

Departamento de

Matemáticas y Computación

ResultSetMetaDataResultSetMetaData

ResultSet proporciona información, además de ResultSet proporciona información, además de sobre el contenido, sobre la estructura de los sobre el contenido, sobre la estructura de los datos obtenidos en un SELECT. datos obtenidos en un SELECT.

Para ello dispone del método Para ello dispone del método getMetaData()getMetaData() que devuelve un objeto que devuelve un objeto ResultSetMetaDataResultSetMetaData al que se puede preguntar por:al que se puede preguntar por: 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

Page 65: jdbc-100423010851-phpapp01

Programación de Bases de Datos ( 65 )© Francisco J. García IzquierdoIngeniería Técnica en Informática de Gestión

Departamento de

Matemáticas y Computación

Secuencias de escapeSecuencias de escape

Los Los StatementStatement pueden contener SQL con pueden contener SQL con sintaxis de escape SQL. sintaxis de escape SQL.

La sintaxis de escape señala al driver que el La sintaxis de escape señala al driver que el código que lleva debe ser tratado código que lleva debe ser tratado diferentemente. diferentemente.

El driver traducirá la sintaxis de escape en El driver traducirá la sintaxis de escape en código que entiende la BD en particular. código que entiende la BD en particular.

Ejemplos:Ejemplos: escape para caracteres LIKE

d, t y ts para literales de fecha y tiempo una fecha se especifica en SQL JDBC mediante la

sintaxis: {d 'yyyy-mm-dd'}

st.executeQuery("SELECT * FROM Articulo WHERE Id LIKE '\_%' {escape '\'};

Page 66: jdbc-100423010851-phpapp01

Programación de Bases de Datos ( 66 )© Francisco J. García IzquierdoIngeniería Técnica en Informática de Gestión

Departamento de

Matemáticas y Computación

Sobre conexionesSobre conexiones

Las conexiones son un recurso limitado: Las conexiones son un recurso limitado: hay que hay que cerrarlascerrarlas

Pero cuando? ¿Tras cada transacción?Pero cuando? ¿Tras cada transacción? Regla general: si no es necesario usar la misma conexión Regla general: si no es necesario usar la misma conexión

a lo largo de varias interacciones, debe cerrarsea lo largo de varias interacciones, debe cerrarse Se pueden conservarSe pueden conservar

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 isClosed() y hay que hacer queries como SELECT 7 FROM DUAL)

Hay que cerrarla Hay que cerrarla Si puede haber muchos usuarios conectados

concurrentemente, por ejemplo en aplicaciones web. En estos casos tras cada servicio hay que cerrar la conexión.

Se suelen usar Pool de conexionesSe suelen usar Pool de conexiones

Page 67: jdbc-100423010851-phpapp01

Programación de Bases de Datos ( 67 )© Francisco J. García IzquierdoIngeniería Técnica en Informática de Gestión

Departamento de

Matemáticas y Computación

Pool de ConexionesPool de Conexiones

Ap

licac

ión

Ap

licac

ión DriverManagerDriverManager

newnew Connection( Connection(

con.close()con.close()

getConnection(getConnection(

Pool de ConexionesPool de Conexiones

getConnection(getConnection(

Page 68: jdbc-100423010851-phpapp01

Programación de Bases de Datos ( 68 )© Francisco J. García IzquierdoIngeniería Técnica en Informática de Gestión

Departamento de

Matemáticas y Computación

Cuando usar Cuando usar PreparedStatementPreparedStatement

No todos los SGBDs lo soportanNo todos los SGBDs lo soportan En principio mejoran el rendimiento, aunque este no es el En principio mejoran el rendimiento, aunque este no es el

único método de mejora:único método de mejora: 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 PreparedStatement.

Los Los PreparedStatementPreparedStatement están asociados a la conexión están asociados a la conexión que los creó:que los creó: viven mientras no se cierre la conexión

Es necesario combinar la reutilización de Es necesario combinar la reutilización de PreparedStatementPreparedStatement con pooling de conexiones. con pooling de conexiones. Los servidores de aplicaciones suelen hacerlo.

Page 69: jdbc-100423010851-phpapp01

Programación de Bases de Datos ( 69 )© Francisco J. García IzquierdoIngeniería Técnica en Informática de Gestión

Departamento de

Matemáticas y Computación

““The use of a Statement in JDBC should be The use of a Statement in JDBC should be 100% localized to being used for DDL (ALTER, 100% localized to being used for DDL (ALTER, CREATE, GRANT, etc) as these are the only CREATE, GRANT, etc) as these are the only statement types that cannot accept BIND statement types that cannot accept BIND VARIABLES. PreparedStatements or VARIABLES. PreparedStatements or CallableStatements should be used for EVERY CallableStatements should be used for EVERY OTHER type of statement (DML, Queries). As OTHER type of statement (DML, Queries). As these are the statement types that accept bind these are the statement types that accept bind variables. variables. This is a fact, a rule, a law -- use This is a fact, a rule, a law -- use prepared statements EVERYWHEREprepared statements EVERYWHERE””

Tom Kyte, Oracle's VP Tom Kyte, Oracle's VP

Page 70: jdbc-100423010851-phpapp01

Programación de Bases de Datos ( 70 )© Francisco J. García IzquierdoIngeniería Técnica en Informática de Gestión

Departamento de

Matemáticas y Computación

AgendaAgenda

IntroducciónIntroducción Drivers JDBCDrivers JDBC La clase La clase DriverManagerDriverManager ConexionesConexiones Ejecución de instruccionesEjecución de instrucciones Transacciones y SQLTransacciones y SQL Cuando las cosas van malCuando las cosas van mal Temas avanzadosTemas avanzados JDBC 2JDBC 2

Page 71: jdbc-100423010851-phpapp01

Programación de Bases de Datos ( 71 )© Francisco J. García IzquierdoIngeniería Técnica en Informática de Gestión

Departamento de

Matemáticas y Computación

Actualizaciones por lotesActualizaciones por lotes

Ejecutar un conjunto de actualizaciones de “una tacada”. Ejecutar un conjunto de actualizaciones de “una tacada”. No se pueden ejecutar SELECTs.No se pueden ejecutar SELECTs. Para ejecutar un lote primero crear un Para ejecutar un lote primero crear un StatementStatement e ir e ir

añadiéndole updates SQL (con añadiéndole updates SQL (con addBatch()addBatch()))

Se debería tratar al lote como una transacción poniendo el Se debería tratar al lote como una transacción poniendo el autocommit en falso, para luego hacer un autocommit en falso, para luego hacer un commit()commit(). .

Statement stmt = con.createStatement();

stmt.addBatch( "... un INSERT, algo que no sea SELECT ...");

stmt.addBatch( "...

...

stmt.executeBatch();

Page 72: jdbc-100423010851-phpapp01

Programación de Bases de Datos ( 72 )© Francisco J. García IzquierdoIngeniería Técnica en Informática de Gestión

Departamento de

Matemáticas y Computación

ResultSetResultSet recorrible y recorrible y actualizableactualizable

Con el Con el ResultSetResultSet tradicional sólo se puede avanzar por los datos tradicional sólo se puede avanzar por los datos Con JDBC2 es posible ir hacia delante y hacia atrás en un Con JDBC2 es posible ir hacia delante y hacia atrás en un ResultSetResultSet . . El El ResultSetResultSet debe ser configurado para tal cosa poniendo unos debe ser configurado para tal cosa poniendo unos

settings apropiados. settings apropiados. Los settings indican si se permite navegar por el Los settings indican si se permite navegar por el ResultSetResultSet y si se deja y si se deja

editar su contenido. editar su contenido. ResultSet.CONCUR_READ_ONLY, no se puede editar el contenido ResultSet.CONCUR_UPDATABLE, sí se puede editar ResultSet.TYPE_FORWARD_ONLY, solo se puede ir hacia adelante ResultSet.TYPE_SCROLL_INSENSITIVE, se puede navegar; una vez

consultados los datos si estos son cambiados por terceros no veremos los cambios

ResultSet.TYPE_SCROLL_SENSITIVE Estos settings se indican cuando se crea el Estos settings se indican cuando se crea el StatementStatement, debiéndose dar , debiéndose dar

un valor para definir las características de navegabilidad y de un valor para definir las características de navegabilidad y de modificafilidad. modificafilidad.

Ej: los resultSets de la siguiente statement serán navegables pero no se Ej: los resultSets de la siguiente statement serán navegables pero no se podrán modificar:podrán modificar:

con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,

ResultSet.CONCUR_READ_ONLY);

Page 73: jdbc-100423010851-phpapp01

Programación de Bases de Datos ( 73 )© Francisco J. García IzquierdoIngeniería Técnica en Informática de Gestión

Departamento de

Matemáticas y Computación

ResultSetResultSet recorrible y recorrible y actualizable (II)actualizable (II)

Los movimientos se realizan con los métodos Los movimientos se realizan con los métodos next()next(), , previous()previous(), , relative(n)relative(n), , absolute(n)absolute(n), , last()last(), , first()first(), , beforeFirst()beforeFirst(), , afterLast()afterLast(), pudiendo , pudiendo saber en que fila se está con el saber en que fila se está con el getRow()getRow()..

Los drivers de BD pueden no dar soporte a estas Los drivers de BD pueden no dar soporte a estas características. características.

Incluso en drivers que si las soportan, determinadas Incluso en drivers que si las soportan, determinadas queries complejas pueden devolver resultados que por queries complejas pueden devolver resultados que por ejemplo no sean modificables. ejemplo no sean modificables.

Como norma es preciso comprobar las características del Como norma es preciso comprobar las características del ResultSetResultSet devuelto para ver cual es el modo en el que devuelto para ver cual es el modo en el que trabaja (con los métodos trabaja (con los métodos getType()getType() y y getConcurency()getConcurency()).).

Estas características tienen su impacto en el rendimiento Estas características tienen su impacto en el rendimiento de la aplicaciónde la aplicación

Page 74: jdbc-100423010851-phpapp01

Programación de Bases de Datos ( 74 )© Francisco J. García IzquierdoIngeniería Técnica en Informática de Gestión

Departamento de

Matemáticas y Computación

Nuevos tipos de datosNuevos tipos de datos

Se pueden recuperar/almacenar en una base de Se pueden recuperar/almacenar en una base de datos objetos de tipodatos objetos de tipo BLOB (Binary Large Objects) CLOB (Character Large Objects).

Se recuperan con los métodos Se recuperan con los métodos getBlob()getBlob() y y getClob()getClob() de de ResultSetResultSet, que devuelven , que devuelven objetos de tipo objetos de tipo java.sql.Blobjava.sql.Blob y y java.sql.Clobjava.sql.Clob, los cuales incorporan , los cuales incorporan métodos para navegar por los contenidos de los métodos para navegar por los contenidos de los objetos.objetos.

También se pueden recuperar ARRAYs con el También se pueden recuperar ARRAYs con el método método getArray()getArray(), que devuelve un objeto , que devuelve un objeto de tipo de tipo java.sql.Arrayjava.sql.Array..

Page 75: jdbc-100423010851-phpapp01

Programación de Bases de Datos ( 75 )© Francisco J. García IzquierdoIngeniería Técnica en Informática de Gestión

Departamento de

Matemáticas y Computación

javax.sqljavax.sql

Incluye las extensiones JDBC para J2EEIncluye las extensiones JDBC para J2EE Destinado a su empleo en servidores de Destinado a su empleo en servidores de

aplicaciones (Weblogic, WebSphere, aplicaciones (Weblogic, WebSphere, Oracle9iAS, JRun, JBoss, …)Oracle9iAS, JRun, JBoss, …)

Proporciona: Proporciona: Otro mecanismo de obtención de conexiones:

Basado en DataSource Que hay que desplegar previamente Pueden ser pooled

Gestión de transacciones distribuidas Rowsets, como el CachedRowset

Page 76: jdbc-100423010851-phpapp01

Programación de Bases de Datos ( 76 )© Francisco J. García IzquierdoIngeniería Técnica en Informática de Gestión

Departamento de

Matemáticas y Computación

Novedades JDBC 4.0Novedades JDBC 4.0

Carga automática de drives JDBCCarga automática de drives JDBC Usando el mecanismo de Proveedores de Servicio de

Java SE Tipo de dato ROWIDTipo de dato ROWID Mejora en el soporte para CLOB y BLOBMejora en el soporte para CLOB y BLOB Soporte para SQL/XMLSoporte para SQL/XML Posibilidad de “des-envolver” las clases que Posibilidad de “des-envolver” las clases que

implementan JDBC para acceder a funcionalidad implementan JDBC para acceder a funcionalidad propietaria de un SGBD concretopropietaria de un SGBD concreto

Mejoras en la gestión de Connection y Mejoras en la gestión de Connection y Statement en poolStatement en pool

Nuevas funciones escalaresNuevas funciones escalares Nuevos métodos en varios interfacesNuevos métodos en varios interfaces

Page 77: jdbc-100423010851-phpapp01

Programación de Bases de Datos ( 77 )© Francisco J. García IzquierdoIngeniería Técnica en Informática de Gestión

Departamento de

Matemáticas y Computación

Cosas que se quedan en el tinteroCosas que se quedan en el tintero

La configuración y obtención de La configuración y obtención de conexiones vía DataSources JDBCconexiones vía DataSources JDBC

El empleo de pools de conexionesEl empleo de pools de conexiones Empleo de datos de tipos CLOB y BLOBEmpleo de datos de tipos CLOB y BLOB

Page 78: jdbc-100423010851-phpapp01

Logroño, 18 de Enero de 2000

Departamento deMatemáticas y Computación

Ingeniería Técnica en Informática de Gestión

Programación deBases de Datos

} } finallyfinally { { trytry { { ifif (presentacion != (presentacion != nullnull) ) presentacion.close(); presentacion.close(); } } catchcatch (SQLException e) { (SQLException e) { e.printStackTrace(); e.printStackTrace(); } }}}