Bases de Datos en Java

15
7/21/2019 Bases de Datos en Java http://slidepdf.com/reader/full/bases-de-datos-en-java 1/15 26/04/2007 1 Bases de Datos en Java: JDBC y Patrón DAO 26/04/2007 DAI Contenido Definición. Arquitectura. Driver. Conexión. Consultas. Curso 2006/2007 2 . Pool de conexiones. Patrón DAO.

description

Bases de Datos en JavaPatrones de diseño DAO

Transcript of Bases de Datos en Java

Page 1: Bases de Datos en Java

7/21/2019 Bases de Datos en Java

http://slidepdf.com/reader/full/bases-de-datos-en-java 1/15

26/04/2007

1

Bases de Datos en Java:JDBC y Patrón DAO

26/04/2007 DAI

Contenido

Definición.

Arquitectura.

Driver. Conexión.

Consultas.

Curso 2006/20072

.

Pool de conexiones.

Patrón DAO.

Page 2: Bases de Datos en Java

7/21/2019 Bases de Datos en Java

http://slidepdf.com/reader/full/bases-de-datos-en-java 2/15

26/04/2007

2

JDBC

 Java DataBase Connectivity

API Java para ejecutar consultas SQL en Bases deDatos Relacionales.

Independiente del Sistema Gestor Relacional. –  Similar en concepto a ODBC de Windows.

Distribuida en dos paquetes:

Curso 2006/20073

–  java.sql, dentro de J2SE

–   javax.sql extensión dentro de J2EE Para acceder a una base de datos es necesario un

driver . –  Implementación de todas las interfaces del API.

JDBC

El API ofrece las clases e interfaces para:

 –  Establecer una conexión a una base de datos.

 –  Ejecutar una consulta.

 –  Procesar los resultados.

// Establece la conexión

Connection con = DriverManager .getConnection ("jdbc:odbc:miBD", ”miLogin", ”miPassword");

Curso 2006/20074

 

Statement stmt = con.createStatement();ResultSet rs = stmt.executeQuery("SELECT nombre, edad FROM Empleados");// Procesa los resultados

while (rs.next()) {String nombre = rs.getString(”nombre");int edad = rs.getInt(”edad");

}

Page 3: Bases de Datos en Java

7/21/2019 Bases de Datos en Java

http://slidepdf.com/reader/full/bases-de-datos-en-java 3/15

26/04/2007

3

 Arquitectura

Statement

ResultSet

Statement   Statement

Curso 2006/20075

JVM

AplicaciónConnection

DriverManager

Driver

Access

Connection

Driver

Oracle

Driver 

Conjunto de clases encargadas de implementar las interfaces del API yacceder a la base de datos.

  Tipos: –    Driver Tipo 1:

Utilizan un API nativa estándar  Ejemplo: puente JDBC:ODBC

 –    Driver Tipo 2: Utilizan un API nativa de la base de datos Ejemplo: Oracle OCI

Curso 2006/20076

 –    r ver po : Servidor remoto con un API genérica. Útil para aplicaciones en internet.

 –    Driver Tipo 4: Totalmente desarrollado en Java Ejemplo: Oracle Thin.

Page 4: Bases de Datos en Java

7/21/2019 Bases de Datos en Java

http://slidepdf.com/reader/full/bases-de-datos-en-java 4/15

26/04/2007

4

Driver 

Los drivers Tipo 1 y 2 utilizan código nativo vía JNI. –  Son más eficientes.

Diseño Driver Tipo 3:

Curso 2006/2007   7

 –  En aplicaciones enterprise favorecen la gestión de las bases de datos,que se realiza en el servidor.

Carga de un driver: Class.forName(“acme.db.Driver”); Repositorio de drivers:

 –  http://industry.java.sun.com/products/jdbc/drivers

Conexión

Representa una conexión con una base de datos.

Se obtienen a partir de la clase DriverManager :

 –   DriverManager.getConnection(“URL”, “login”, “password”) –  Mantiene un registro de todos los drivers cargados en la

JVM.

  URL identifica el driver y su tipo, la localización de la base de

Curso 2006/20078

a os y su nom re:

 –  jdbc:oracle:oci:dis.um.es/MiBD

Alternativa a DriverManager: DataSource

Page 5: Bases de Datos en Java

7/21/2019 Bases de Datos en Java

http://slidepdf.com/reader/full/bases-de-datos-en-java 5/15

26/04/2007

5

DataSource

Actúa como factoría de conexiones.

 –  Método getConnection()

Abstrae los detalles de acceso:

 –  Cargar los drivers, URL, login, etc.

 –  Aplicaciones más portables.

Suelen mantener un pool de conexiones.

Curso 2006/20079

 Naming and Directory Interface). –  Los detalles de acceso se indican en ficheros de configuración.

 –  Acceso a los servicios de nombres y directorios.

 –  Ejemplo: acceso a recursos, LDAP.

Consultas SQL

El API JDBC no restringe las sentencias que se envían a la BD. En principio, todos los drivers deben ser compatibles con ANSI SQL-2

Entry Level.

Tipos de sentencias: –  Statement: para sentencias sencillas en SQL. –  PreparedStatement: para consultas preparadas,

Ejemplo: las que tienen parámetros.

Curso 2006/200710

 –   la BD.

El API distingue dos tipos de consultas: –  Consultas: SELECT –  Actualizaciones: INSERT, UPDATE, DELETE, sentencias DDL.

Page 6: Bases de Datos en Java

7/21/2019 Bases de Datos en Java

http://slidepdf.com/reader/full/bases-de-datos-en-java 6/15

26/04/2007

6

Statement

Son creadas a partir de la conexión:

 –   Statement stmt = conexion.createStatement();

Ejecución de una consulta:

 –   stmt.executeQuery(“SELECT * FROM Pedidos”);

 –  Devuelve un objeto ResultSet.

Ejecución de una actualización:

Curso 2006/200711

 –   stmt.executeUpdate(“DELETE FROM Pedidos WHEREcodigo = 15”)

 –  Devuelven un entero indicando los registros actualizados ó0 si es una consulta DDL.

ResultSet

Es un proxy sobre los registros del resultado de la búsqueda.

 –  Controla la recuperación de los registros.

Representa un cursor (iterador) sobre los resultados. –  Movimiento: métodos next() y previous()

 –  Inicialmente el cursor está posicionado antes del primerregistro.

Curso 2006/200712

Depende del objeto consulta:

 –  Cada vez que se realice una consulta se pierden losresultados.

Page 7: Bases de Datos en Java

7/21/2019 Bases de Datos en Java

http://slidepdf.com/reader/full/bases-de-datos-en-java 7/15

26/04/2007

7

ResultSet

Tenemos dos alternativas para acceder a las columnas delresultado:

 –  rs.getString(“nombre”);⇒ Nombre de la columna

 –  rs.getString(1);⇒ Posición en la consulta

El acceso por posición es útil cuando:

 –  Acceso a una columna derivada, ej. calcular la media

Curso 2006/200713

 –  Cuando hay columnas con los mismos nombres ( join) Recuperación de los valores de las columnas:

 –  Métodos de acceso (getXXX).

 –  Es conveniente leer los datos de izquierda a derecha.

 –  Para averiguar si se ha leído un nulo: wasNull()

ResultSet – Métodos de Acceso

Tipo de dato SQL Método de AccesoCHAR Str i ng get Str i ng( )

VARCHAR Str i ng get Str i ng( )LONGVARCHAR I nput St r eam

getAsci i Stream( ) ógetUni codeStr i ng()

NUMERI C j ava. math. Bi gDeci malgetBi gDeci mal ( )DECI MAL j ava. math. Bi gDeci mal

getBi gDeci mal ( )BIT bool ean getBool ean( )

 TI NYI NT byt e getByt e( )SMALLI NT short get Short ( )I NTEGER i nt getI nt( )

Curso 2006/200714

ong ge ongREAL f l oat getFl oat( )

FLOAT doubl e getDoubl e( )DOUBLE doubl e get Doubl e( )BINARY byte[ ] get Bytes( )

VARBI NARY I nput Str eamgetBi nayStr eam( )

DATE j ava. sql . Date getDate( ) TI ME j ava. sql . Ti me get Ti me( )

 TI MESTAMP j ava. sql . Ti meSt ampgetTi meStamp( )

Page 8: Bases de Datos en Java

7/21/2019 Bases de Datos en Java

http://slidepdf.com/reader/full/bases-de-datos-en-java 8/15

26/04/2007

8

PreparedStatement

Problema con Statement: –  Cuando la consulta se realiza dentro de un bucle y varía

sólo en unos valores: stmt.executeQuery(“SELECT * FROM Cliente WHERE

codigo = “ + i); La base de datos planifica cada consulta.

 –    Conviene disponer de una consulta con parámetros.

Curso 2006/200715

  PreparedStatement: –  Especialización de Statement que permite definir consultas

parametrizadas. –  La BD sólo planifica la consulta cuando se crea. –  Evitan tener que formatear los datos al construir la cadena

de consulta: ‘ ’ para cadenas, fechas y horas.

PreparedStatement

También se crean a partir de la conexión:

 –  PreparedStatement pstmt =conexion.prepareStatement(“SELECT * FROM Cliente WHERE

codigo = ?”) Los parámetros de entrada se especifican por posición utilizando

métodos setXXX:

 –  psmt.setInt(1, 20);

Curso 2006/200716

 –  Misma equivalencia que los getXXX de ResultSet.

 –  Los valores se conservan entre ejecuciones.

Borrar parámetros: clearParameters()

  Ejecución:

 –  Consulta: executeQuery().

 –  Actualización: executeUpdate().

Page 9: Bases de Datos en Java

7/21/2019 Bases de Datos en Java

http://slidepdf.com/reader/full/bases-de-datos-en-java 9/15

26/04/2007

9

Transacciones

Ejecución de bloques de consultas SQL manteniendo laspropiedades ACID ( Atomicy-Consistency-Isolation-Durability)

Una conexión funciona por defecto en modo autocommit:

 –  Cada consulta representa una sola transacción.

 –  Método: conexion.setAutocommit (false);

Definimos bloques de consultas:

Curso 2006/200717

 –  Deshabilitando el modo autocommit. –  Finalizamos la transacción ejecutando commit() o

rollback() sobre la conexión.

Nivel de AislamientoTransaccional

Niveles de aislamiento: –   TRANSACTION_NONE:

Sin soporte transaccional. –   TRANSACTION_READ_UNCOMMITED:

Permite lecturas sobre datos no comprometidos. –   TRANSACTION_READ_COMMITED:

Permite lecturas sólo sobre datos comprometidos.

Curso 2006/200718

 Nivel por defecto. –   TRANSACTION_REPEATABLE_READ.

Bloquea los datos leídos. –   TRANSACTION_SERIALIZABLE.

Sólo una transacción al mismo tiempo. Suelen estar disponibles read commited y serializable.

Page 10: Bases de Datos en Java

7/21/2019 Bases de Datos en Java

http://slidepdf.com/reader/full/bases-de-datos-en-java 10/15

26/04/2007

10

Concurrencia

Establecer el modo de aislamiento: –  conexion.setTransactionIsolation(

Connection.TRANSACTION_SERIALIZABLE);   Consejos de uso:

 –  Bloque con sólo actualizaciones: TRANSACTION_READ_COMMITED

 –  Bloque donde leamos varias veces el mismo registro:

Curso 2006/200719

 _ _ –  Bloque en el que leamos un valor para actualizarlo: TRANSACTION_SERIALIZABLE

 –  Bloque donde realicemos varias veces la misma consulta (variosregistros): TRANSACTION_SERIALIZABLE

Bases de Datos en Entornos Web

  Motivación:

 –  Múltiples conexiones simultáneas a la base de datos.

 –  El establecimiento de una conexión es costoso.   Consecuencia:

 –  Definir cuidadosamente las transacciones.

 –  Establecer algún mecanismo para optimizar el uso de

Curso 2006/200720

conexiones Pool de Conexiones

Pool de Conexiones:

 –  Habitualmente implementado por los DataSource.

Page 11: Bases de Datos en Java

7/21/2019 Bases de Datos en Java

http://slidepdf.com/reader/full/bases-de-datos-en-java 11/15

26/04/2007

11

Pool de Conexiones

Cuando no dispongamos de un DataSource que loimplemente.

Recomendaciones de diseño: –  Definir la clase ConnectionPool como Singleton. –  Implementará la interface DataSource Objeto que

devuelve el getInstance. –  Definir una clase ConnectionWrapper que implemente

Curso 2006/200721

Connection: Todos los métodos a excepción de close delegan en un

objeto Connection. close libera la conexión del pool.

 –  Creará un lista de conexiones inicial que expandirá si nohay ninguna libre.

ConnectionPool - Estructura

DataSou rce

ge t Conn ec t i on ( ) : Con nec t i on

<<In te r face>>

Connec t ionPoo l

ge t Conn ec t i on ( ) : Con nec t i on

Connec t ionWrappe r  

crea t eSt a t emen t ( ) : S ta t eme n tp repa reS t a tem en t (consu l t a : S t r i ng ) : Prepa redS t a tem en t

+poo l

Connec t ion

crea t eSt a t emen t ( ) : S ta t eme n tp repa reS t a tem en t (consu l t a : S t r i ng ) : Prepa redS t a tem en tc l o s e ( )

...()

<<In te r face>>

1

+c o n e x i o n

1

Curso 2006/200722

re t u rnConne c ti on (c : Con nec t i onPoo l )<<s ta t i c>> ge t I ns t ance ( ) : Da t aSource

DriverManager 

crea t eConn ec t i on ( ) : Conn ec t i on

< < u s e s > >

c l o s e ( )...()

**

"c lose" devuelve e l objetoConnec t ionWrappe r a l Poo l

Page 12: Bases de Datos en Java

7/21/2019 Bases de Datos en Java

http://slidepdf.com/reader/full/bases-de-datos-en-java 12/15

26/04/2007

12

Patrón DAO

  Motivación:

 –  Almacenar y recuperar información persistente de diferentesfuentes: bases de datos relacionales, LDAP, XML, etc.

 –  Las APIs para el acceso a datos son muy diferentes.

 –  La portabilidad y mantenimiento de los componentes (servlets,EJB, ...) se ve limitada.

  Solución:

Curso 2006/200723

 –  Usar un objeto DAO (Data Access Object) que abstraiga yencapsule el acceso a la fuente de datos.

 –  El DAO gestiona la conexión con la fuente de datos para obtener yalmacenar la información.

Colaboración

  Participantes:

 –  Objeto de negocio

 – 

ServletEdicion dao : DAOCliente c : Cliente Fuente dedatos

getClienteByUsuario(usuario)Obtiene los datos

new( )return c

getNombre()Accede a losdatos

setCorreo( correo)

li

Curso 2006/2007   24

 – 

 –  ValueObject

 –  Fuente de datos

updateCliente(c) getNombre()

Recupera lainformación

Actualiza los datos

Page 13: Bases de Datos en Java

7/21/2019 Bases de Datos en Java

http://slidepdf.com/reader/full/bases-de-datos-en-java 13/15

26/04/2007

13

Estrategia de Implementación

Basada en los patrones “ Abs trac t Factory ” y “Factory Method”.

  Pasos:

 –  Definir la interface DAO de nuestros objetos de datos

public interface   ClienteDAO{

public Cliente create (String nombre, String nif, Stringcorreo,

String usuario, String clave) throws

Curso 2006/200725

;

public Cliente findClienteByUsuario (String usuario) throwsDAOException;

public java.util.Collection   findAll () throws DAOException;

public void   update (Cliente c) throws DAOException;}

Factoría Abstracta

Definir la factoría abstracta de objetos DAO:

public abstract class   DAOFactoria

{public abstract   ClienteDAO   getClienteDAO () throws DAOException;

public abstract ProductoDAO getProductoDAO() throws DAOException;

public final static int ACCESS = 1;

Curso 2006/200726

...public static DAOFactoria   getDAOFactoria (int tipo) {

switch (tipo) {case ACCESS:

return new   AccessDAOFactoria();case XML:...

}

Page 14: Bases de Datos en Java

7/21/2019 Bases de Datos en Java

http://slidepdf.com/reader/full/bases-de-datos-en-java 14/15

26/04/2007

14

Factoría Concreta

Implementar la factoría concreta:

public class   AccessDAOFactoria extends DAOFactoria{...

public   ClienteDAO   getClienteDAO () {

return (ClienteDAO ) newAccessClienteDAO(ds);

Curso 2006/200727

 –  Simplemente instancia objetos DAO concretos.

}}

Clase DAO

Implementar las clases DAO concretas:

import java.sql.*;

public class   AccessClienteDAO implements ClienteDAO{ ...

public Cliente create (String nombre, String nif, Stringcorreo,

String usuario, String clave) throwsDAOException

{

Curso 2006/200728

Connection con = null;try {

con = ds.getConnection();Statement stmt = con.createStatement();stmt.executeUpdate(...);stmt.close();con.close();Cliente c = new Cliente();c.setNombre(nombre);

...

return c;

Page 15: Bases de Datos en Java

7/21/2019 Bases de Datos en Java

http://slidepdf.com/reader/full/bases-de-datos-en-java 15/15

26/04/2007

Estructura

DAOFactoria

getClienteDAO() : ClienteDAOgetProductoDAO() : ProductoDAO<<static>> getDAOFactoria() : DAOFactoria

AccessDAOFactoria

getClienteDAO() : ClienteDAOgetProductoDAO() : ProductoDAO

<<create>>

XMLDAOFactoria

getClienteDAO() : ClienteDAOgetProductoDAO() : ProductoDAO

<<create>>

Curso 2006/200729

ClienteDAO

create() : ClientefindAll() : CollectionfindByUsuario() : Clienteupdate()

<<Interface>>

AccessClienteDAO

ProductoDAO<<Interface>>

AccessProductoDAO

Consecuencias

  Beneficios:

 –  Favorece la transparencia.

 –  Facilita la migración de los componentes. –  Reduce la complejidad del código.

 –  Centraliza todo el acceso a datos en una capa.

Curso 2006/200730

  Inconvenientes:

 –  Diseño de una jerarquía de clases.

 –  Introduce una nueva capa.