View
9
Download
0
Category
Preview:
DESCRIPTION
Bases de Datos en JavaPatrones de diseño DAO
Citation preview
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.
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");
}
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.
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
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.
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.
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( )
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().
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.
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.
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
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
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:...
}
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;
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.
Recommended