escuela técnica superior de ingeniería informática Diseño de la capa de datos para el POS Departamento de Lenguajes y Sistemas Informáticos Ingeniería del Software de Gestión III Índice • Introducción • Estrategias • • • • Identificadores únicos Conexiones Clases persistentes Navegabilidad • Solución Capa de negocio pos.domain 1..* <<interface>> IPOSProcessor boolean cancelOrder(String orderId); List listOrders(); boolean placeOrder(Order o); Order retrieveOrder(); 1 Order Address deliverto stores - orderID: String deliverto: Addres payment: CreditCard timeplaced: Date details:List placedbyCustomer: String - city: String - email: String - fax: String - phone: String - name: String - state: String - street: String - zipcode: int getters/setters 1 getters/setters payment 1..* POSProcessor CreditCard 1..* 1 Detail Product - holder: String - number: String - month: int - year: int - note: String - quantity: int - product: Product - productID: String - description: String - price: int getters/setters getters/setters getters/setters Modelo de datos 1..* 1 1 Address 1..* deliverto CreditCard OID: varchar(50) = <<PK>> holder: varchar(50) number: varchar(50) month: int year: int payment Order OID : varchar(50) = <<PK>> city: varchar(50) email: varchar(50) fax: varchar(50) phone: varchar(50) name: varchar(50) street: varchar(50) zipcode: int OID: varchar(50) = <<PK>> orderid: varchar(50) addressOID: varchar(50) = <<FK>> creditcardOID: varchar(50)=<<FK>> timeplaced: bigint placedbyCustomer: varchar(50) 1..* 1 Detail Product OID: varchar(50) = <<PK>> orderOID: varchar(50)=<<FK >> productOID: varchar(50)=<<FK >> note: varchar(250) quantity: int OID: varchar(50) = <<PK>> productID: varchar(50) description: varchar(250) price: int Índice • Introducción • Estrategias • • • • Identificadores únicos Conexiones Clases persistentes Navegabilidad • Solución Generador de identificadores únicos pos.utils <<Singleton >> UIDGenerator + String getKey() Generador de identificadores únicos package pos.utils; import java.security.SecureRandom; public class UIDGenerator { private static UIDGenerator guidgen; private SecureRandom random; private UIDGenerator() { this.random = new SecureRandom(); } public static synchronized UIDGenerator getInstance() { if (guidgen == null) { guidgen = new UIDGenerator(); } return guidgen; } public String getKey() { String key = "" + System.currentTimeMillis() + Long.toHexString(random.nextInt()); return key; } } Índice • Introducción • Estrategias • • • • Identificadores únicos Conexiones Clases persistentes Navegabilidad • Solución ConnectionManager <<Singleton>> ConnectionManager - Driver dBDriver - String dBUri - String driverName - String password - String username + Connection checkOut() + void checkIn(Connection conn) ConnectionManager package pos.data; import java.sql.*; public class ConnectionManager { private static ConnectionManager cm; private Driver dBDriver = null; private static final String dBUri = "jdbc:mysql://127.0.0.1:3306/pos"; private static final String driverName = "com.mysql.jdbc.Driver"; private static final String password = "practica"; private static final String username = "practica"; private ConnectionManager() { try { dBDriver = (Driver) Class.forName(driverName).newInstance(); DriverManager.registerDriver(dBDriver); } catch (Exception e) { System.err.println("Unable to register JDBC Driver"); e.printStackTrace(); } } public static synchronized ConnectionManager getInstance() { if (cm == null) {cm = new ConnectionManager();} return cm; } ... ConnectionManager public Connection checkOut() { Connection conn = null; try { conn = DriverManager.getConnection(dBUri, username, password); } catch (Exception e) { e.printStackTrace(); } return conn; } public void checkIn(Connection conn) { try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } protected void finalize() { System.out.println("Llamando a finalize de ConnectionManager"); try { DriverManager.deregisterDriver(dBDriver); } catch (SQLException e) { e.printStackTrace(); } } } Índice • Introducción • Estrategias • • • • Identificadores únicos Conexiones Clases persistentes Navegabilidad • Solución Clases persistentes pos.domain 1..* <<interface>> IPOSProcessor boolean cancelOrder(String orderId); List listOrders(); boolean placeOrder(Order o); Order retrieveOrder(); 1 Order Address deliverto stores - orderID: String deliverto: Addres payment: CreditCard timeplaced: Date details:List placedbyCustomer: String - city: String - email: String - fax: String - phone: String - name: String - state: String - street: String - zipcode: int getters/setters 1 getters/setters payment 1..* POSProcessor CreditCard 1..* 1 Detail Product - holder: String - number: String - month: int - year: int - note: String - quantity: int - product: Product - productID: String - description: String - price: int getters/setters getters/setters getters/setters DAO • Por cada clase persistente, tendremos en la capa de acceso: • Una interfaz (IClassnameDAO) • Una clase que implementa dicha interfaz (JDBCClassnameDAO) Capa de datos pos.data <<interface>> ICreditCardDAO <<Singleton >> ConnectionManager <<interface>> IProductDAO - Driver dBDriver - String dBUri - String driverName - String password - String username + Connection checkOut() + void checkIn(Connection conn) JDBCCreditCardDAO <<interface>> IOrderDAO JDBCProductDAO <<interface>> IDetailDAO <<interface>> IAddressDAO JDBCOrderDAO JDBCDetailDAO JDBCAddressDAO Definición de las interfaces DAO <<interface>> IProductDAO <<interface>> IDetailDAO void delete(...) void insert(...) List select(...) List selectAllProducts(...) Product select(...) <<interface>> IOrderDAO Void delete(...) List selectAllOrders(...) void insertOrder(...) Order selectOldOrder(...) <<interface>> IAddressDAO <<interface>> ICreditCardDAO void delete(...) void insert(...) Address select(...) void delete(...) void insert(...) CreditCard select(...) Índice • Introducción • Estrategias • • • • Identificadores únicos Conexiones Clases persistentes Navegabilidad • Solución Navegabilidad • Nos permite: • Refinar las definiciones de los IClassnameDAO • Establecer relaciones entre los distintos IClassnameDAO • Establecer una política para la gestión de conexiones Navegabilidad pos.domain 1..* <<interface>> IPOSProcessor boolean cancelOrder(String orderId); List listOrders(); boolean placeOrder(Order o); Order retrieveOrder(); 1 Order Address deliverto stores - orderID: String deliverto: Addres payment: CreditCard timeplaced: Date details:List placedbyCustomer: String - city: String - email: String - fax: String - phone: String - name: String - state: String - street: String - zipcode: int getters/setters 1 getters/setters payment 1..* POSProcessor CreditCard 1..* 1 Detail Product - holder: String - number: String - month: int - year: int - note: String - quantity: int - product: Product - productID: String - description: String - price: int getters/setters getters/setters getters/setters Navegabilidad pos.data <<interface>> ICreditCardDAO <<Singleton >> ConnectionManager uses <<interface>> IProductDAO List selectAllProducts() Product select(Connection conn, String productOID) String selectProductOID(Connection conn, String productid) void delete(Connection conn, String creditCardOID) void insert(Connection conn, String creditCardOID, CreditCard c) CreditCard select(Connection conn, String creditCardOID) - Driver dBDriver - String dBUri - String driverName - String password - String username + Connection checkOut() + void checkIn(Connection conn) uses JDBCCreditCardDAO <<interface>> IOrderDAO JDBCProductDAO <<interface>> IDetailDAO void delete(String OrderID) List selectAllOrders() void insertOrder(Order o) Order selectOldOrder() void delete(Connection conn, String orderOID) void insert(Connection conn, List details, String orderOID) List select(Connection conn, String orderOID) JDBCOrderDAO <<interface>> IAddressDAO void delete(Connection conn, String addressOID) void insert(Connection conn, String addressOID, Address a) Address select(Connection conn, String addressOID) JDBCDetailDAO JDBCAddressDAO Índice • Introducción • Estrategias • • • • Identificadores únicos Conexiones Clases persistentes Navegabilidad • Solución Solución pos.domain 1..* 1 <<interface >> IPOSProcessor Order Address deliverto stores boolean cancelOrder(String orderId); List listOrders(); boolean placeOrder(Order o); Order retrieveOrder(); - orderID: String - deliverto: Addres - payment: CreditCard - timeplaced: Date - details:List - placedbyCustomer: String - getters/setters city: String email: String fax: String phone: String name: String state: String street: String zipcode: int 1 <<Singleton >> UIDGenerator getters/setters payment 1..* + String getKey() POSProcessor CreditCard 1..* - odao: IOrderDAO - pos.utils holder: String number: String month: int year: int getters/setters 1 Detail Product - note: String - quantity: int - product: Product - productID: String - description: String - price: int getters/setters getters/setters uses uses pos.data <<interface >> ICreditCardDAO <<Singleton>> ConnectionManager uses <<interface>> IProductDAO List selectAllProducts() Product select(Connection conn, String productOID) String selectProductOID(Connection conn, String productid) void delete(Connection conn, String creditCardOID) void insert(Connection conn, String creditCardOID, CreditCard c) CreditCard select(Connection conn, String creditCardOID) - Driver dBDriver - String dBUri - String driverName - String password - String username + Connection checkOut() + void checkIn(Connection conn) uses JDBCCreditCardDAO <<interface>> IOrderDAO <<interface>> IDetailDAO JDBCProductDAO void delete(Connection conn, String orderOID) void insert(Connection conn, List details, String orderOID) List select(Connection conn, String orderOID) void delete(String OrderID) List selectAllOrders() void insertOrder(Order o) Order selectOldOrder() <<interface>> IAddressDAO void delete(Connection conn, String addressOID) void insert(Connection conn, String addressOID, Address a) Address select(Connection conn, String addressOID) JDBCOrderDAO JDBCDetailDAO JDBCAddressDAO !Gracias! • ¿Podemos mejorar esta lección? Mándanos un email a [email protected] Visite la web: www.lsi.us.es