Documente Academic
Documente Profesional
Documente Cultură
Ingenierí
Ingeniería del Software II
Ingeniería en Informática
Escuela Superior de Informática de Ciudad Real
Macario Polo, Ismael Caballero
Curso 2009/2010
Apuntes v1.0
2
Ideas fundamentales
Correspondencia entre esquema de clases y
esquema de tablas (páginas 109 y siguientes
del Manual de la asignatura)
Identidad del objeto (≈clave principal)
Asignación de responsabilidades de
persistencia
Materialización y desmaterialización
Uso de cachés
◦ Tipos de cachés
◦ Objetos sucios y limpios
◦ Commit y rollback
3
Correspondencia entre esquema de clases y
esquema de tablas: Patró
Patrón 1 clase, 1 tabla
Se construye una tabla por cada clase en el
diagrama de clases
Asociaciones, agregaciones y composiciones
se transforman a relaciones de clave externa
con la multiplicidad indicada por la propia
multiplicidad de la asociación
Las relaciones de herencia se transforman a
relaciones de clave externa con multiplicidad
1:1, realizándose una propagación de clave
4
Correspondencia entre esquema de clases y
esquema de tablas: Patró
Patrón 1 clase, 1 tabla
5
6
Correspondencia entre …: Patró
Patrón 1 árbol de
herencia, 1 tabla
Se construye una tabla por cada árbol de
herencia que exista en el diagrama de clases
Cada tabla procedente de un árbol de
herencia incluye una columna por cada
campo en la jerarquía representada
Puesto que en la tabla se van a almacenar
instancias de diferentes subtipos, habrá
columnas que permanezcan desaprovechadas
7
8
Correspondencia entre …: Patró
Patrón 1
camino de herencia, 1 tabla
Se construye una tabla por cada rama del
árbol de herencia
La casuística puede ser muy variada, en
función fundamentalmente de la presencia o
ausencia de clases abstractas
9
10
Asignació
Asignación de responsabilidades
de persistencia: operaciones CRUD
De alguna manera, el sistema debe permitir
que los objetos persistentes gestionen la
correspondencia de su estado en memoria
principal y en memoria secundaria
Los objetos persistentes deben poder ser
insertados, eliminados, actualizados.
Se trata de las operaciones CRUD (Create,
Read, Update y Delete)
11
Operaciones CRUD
Create ≈ insert
Read ≈ select
Update ≈ update
Delete ≈ delete
12
Operaciones CRUD: experto
public Empleado(String numeroSS) throws Exception
{
String SQL="Select * from Empleados where NumeroDeSeguridadSocial=’” +
numeroSS + “’”;
Connection bd=null;
try {
bd=DriverManager.getConnection("BDPersonas");
ResultSet r=bd.createStatement().executeQuery(SQL);
if (r.next())
{
apellidos=r.getString("Apellidos");
empresa=r.getString("Empresa");
estatura=r.getFloat("Estatura");
fechaDeNacimiento=r.getDate("FechaDeNacimiento");
nombre=r.getString("Nombre");
numeroDeSeguridadSocial=r.getString("NumeroDeSeguridadSocial");
peso=r.getFloat("Peso");
fechaDeContratacion=r.getDate("FechaDeContratacion");
} else throw new Exception("No se encuentra el registro");
}
catch (Exception ex)
{
throw new Exception("Error al leer el registro " + ex.getMessage());
}
finally
{
bd.close();
}
}
13
Operaciones CRUD: Fabricació
Fabricación
pura
public void insert() throws Exception
{
PersistEmpleado.insert(this);
}
14
Un diseñ
diseño alternativo
15
Alternativas de implementació
implementación
Construimos las sentencias SQL
(concatenando valores) y las enviamos a
ejecutar (chapucilla)
◦ Usamos el PreparedStatement de Java
Construimos sentencias SQL parametrizadas
(más elegante, más eficiente)
◦ Usamos el PreparedStatement, al que pasamos
parámetros
Si el SGBD lo permite, utilizamos
procedimientos almacenados
◦ Objeto CallableStatement de Java
16
Un proc.
proc. alm. en SQL Server
17
Un proc.
proc. alm. en SQL Server
public void update() throws SQLException {
CallableStatement cs=null;
try {
Connection bd=Agente.getAgente().getDB();
cs=bd.prepareCall("{call guardarParking (?, ?, ?)}");
cs.setString(1, this.casilla.getCiudad());
cs.setString(2, this.casilla.getVersion());
cs.setInt(3, this.casilla.getPos());
cs.executeUpdate();
}
catch (SQLException ex) { throw ex; }
finally { cs.close(); }
}
18
Objetos de java.sql
Los resultados, los recogemos y procesamos
con un objeto ResultSet
De forma general, es conveniente cerrar
todos los objetos que vayamos utilizando en
cada conexión salvo, quizás, la conexión
19
Un posible Agente, que ademá
además es
Singleton
package persistencia;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class Agente {
protected static Agente mInstancia=null;
protected Connection mBD;
protected String mURL=
"jdbc:microsoft:sqlserver://127.0.0.1:1433;DatabaseName=Monoploy";
20
Cachés (pág. 100 apuntes
Caché
antiguos)
Las cachés se utilizan para almacenar temporalmente
objetos
De vez en cuando, se sincronizan los objetos de las
cachés con sus registros correspondientes de la base
de datos
La gestión de las cachés se le asigna a una clase
determinada
Puede haber varios tipos de cachés:
◦ New Clean Caché
◦ Old Clean Caché
◦ New Dirty Caché
◦ Old Dirty Caché
◦ New Delete Caché
◦ Old Delete Caché
21
Cachés (pág. 100 apuntes antiguos)
Caché
22