Banco de Dados Sérgio Luiz Ruivace Cerqueira [email protected] Roteiro • Mapeamento de objetos para modelo relacional • Estratégias de persistência • Persistência JDBC © LES/PUC-Rio Mapeando Objetos para o Modelo Relacional Introdução • Os princípios básicos do paradigma da orientação a objetos e do modelo relacional são bastante diferentes. No modelo de objetos, os elementos (objetos) correspondem a abstrações de comportamento. No modelo relacional, os elementos correspondem a dados no formato tabular © LES/PUC-Rio Objetos transientes e persistentes • Objeto transiente – Existe somente na memória principal durante uma sessão de uso do sistema OO • Objeto persistente – Têm uma existência que perdura durante várias execuções do sistema OO – Precisam ser armazenados quando a sessão de uso do sistema termina, e restaurados quando uma outra sessão é iniciada © LES/PUC-Rio Descasamento de informações • Termo utilizado para denotar o problema das diferenças entre as representações do modelo OO e do modelo relacional – Problema principal de conciliar as informações representadas pelo estado de um objeto e pelos dados armazenados em registros de uma tabela © LES/PUC-Rio Projeto de banco de dados • O desenvolvimento do banco de dados a ser utilizado, se este não existir, é uma atividade do projeto detalhado • Principais tarefas do projeto de banco de dados – Construção do esquema do banco de dados – Criação de índices – Armazenamento físico dos dados – Definição de visões sobre os dados armazenados – Atribuição de direitos de acesso – Políticas de backup dos dados © LES/PUC-Rio Conceitos do modelo relacional (overview) • O conceito principal do modelo relacional é a relação – Cada coluna de uma relação pode conter apenas valores atômicos • Chave primária: coluna cujo valor pode ser utilizado para identificar unicamente cada linha de uma relação • Chave estrangeira: valores de uma coluna fazem referência a valores de uma outra coluna (associação entre linhas) – Uma chave estrangeira pode conter valores nulos (NULL) • O NULL é normalmente usado para indicar que um valor não se aplica, ou é desconhecido, ou não existe © LES/PUC-Rio Conceitos do modelo relacional (overview) © LES/PUC-Rio Conceitos do modelo relacional (overview) © LES/PUC-Rio Mapeamento objetos – modelo relacional • O mapeamento de objetos para o modelo relacional é feito a partir do modelo de classes – Necessidade do mapeamento dos valores de atributos de objetos persistentes para tabelas – Semelhante ao mapeamento do MER • O MER e o modelo de classes NÃO são equivalentes – Esses modelos são freqüentemente confundidos – O MER é um modelo de dados; o modelo de classes representa objetos (dados e comportamento) © LES/PUC-Rio Mapeamento objetos – modelo relacional • Notação (simplificada) – Cada relação é representada pelo seu nome e pelos nomes de suas colunas entre parênteses – Chaves primárias são sublinhadas – Chaves estrangeiras são tracejadas • Aqui usaremos sempre uma coluna de implementação como chave primária – Uma coluna de implementação é um identificador sem significado no domínio de negócio © LES/PUC-Rio Mapeamento - classe e atributo • Uma classe é mapeada para zero ou várias tabelas • Um atributo é mapeado para uma ou mais colunas – Nem todos os atributos de uma classe podem ser persistentes © LES/PUC-Rio Um exemplo © LES/PUC-Rio Mapeamento - associação • Uma associação normalmente é mapeada para uma chave estrangeira – Opcionalmente pode-se usar chaves estrangeiras nas duas relações • Um exemplo © LES/PUC-Rio Um exemplo – associação 1:1 • Deve-se adicionar uma chave estrangeira em uma das duas relações para referenciar a chave primária da outra relação © LES/PUC-Rio Um exemplo – associação 1:N • Pode-se adicionar uma chave estrangeira na relação da classe que participa da associação no lado N para referenciar a chave primária da outra relação © LES/PUC-Rio Um exemplo – associação 1:N • Pode-se criar uma tabela associativa com chave primária composta de duas chaves estrangeiras referenciando as duas chaves primárias © LES/PUC-Rio Um exemplo – associação N:N • Criar uma tabela associativa com chave primária composta de duas chaves estrangeiras referenciando as duas chaves primárias © LES/PUC-Rio Mapeamento - auto-associação • É uma forma especial de associação, podendo-se usar as mesmas técnicas anteriores © LES/PUC-Rio Mapeamento - associações N-árias • Pode-se usar o procedimento semelhante ao mapeamento da associação N:N – Uma relação para representar a associação é criada – São adicionadas nesta relação chaves estrangeiras – Se a associação n-ária possuir uma classe associativa, os atributos desta são mapeados como colunas da relação de associação © LES/PUC-Rio Mapeamento - associações N-árias © LES/PUC-Rio Mapeamento - classes associativas • Deve-se criar uma relação para representar a classe associativa – Os atributos da classe associativa são mapeados para colunas dessa relação – Essa relação deve conter chaves estrangeiras que referenciem as relações correspondentes às classes que participam da associação © LES/PUC-Rio Mapeamento - classes associativas © LES/PUC-Rio Mapeamento - agregação e composição • Pode-se utilizar o mesmo procedimento para o mapeamento de associações • Na composição, deve-se ter cuidado na hora de atualizar ou remover o todo – Remoção ou atualização em cascata – Uso de gatilhos e procedimentos armazenados • Cuidado também no acesso e na restauração (tanto de agregações quanto de composições) – Quando um objeto todo deve ser restaurado, é natural restaurar também os objetos parte – Definição de índices adequados para acesso eficiente às parte © LES/PUC-Rio Herança • Abordagem – Tabela por Subclasse – Tabela por Hierarquia – Tabela por Classe Concreta • Deve ser feito uma analise sobre qual forma deve ser abordada para cada hierarquia • Não existe a melhor técnica © LES/PUC-Rio Herança © LES/PUC-Rio Herança – Tabela por Subclasse • Uma tabela do banco para cada subclasse e uma para a super-classe • Na tabela da subclasse deve ter as propriedades especificas da subclasse • Vantagens – Permite definir restrições nas colunas – Tabelas Normalizadas • Desvantagens – Por causa dos JOINS tem desempenho inferior a estratégia por Hierarquia © LES/PUC-Rio Herança – Tabela por Hierarquia • Todos os atributos são colocados em uma única tabela • Necessita uma coluna para identificar o tipo • Vantagem – Simples implementação – Fácil inclusão de classes – Bom suporte a polimorfismo – Acesso rápido • Desvantagens – A modificação de uma classe pode afetar outras classes na hierarquia – Desperdício de espaço – Pode gerar tabelas muito grandes – Atributos não podem ter restrições do tipo not-null © LES/PUC-Rio Herança – Tabela por Classe Concreta • Cada classe concreta é mapeada para uma tabela • Vantagem – Boa performance para acesso de um único objeto – Permite definir restrições nas colunas – Facilidade de mapear esquemas legados • Desvantagem – Modificação de uma classe acarreta na modificação de sua tabela e todas as classes filhas – Dificuldade de manter diversos papeis para um único objeto – Dificuldade de modificar um papel de um objeto – Redundância de colunas © LES/PUC-Rio Estratégias de Persistência Estratégias de persistência • Acesso direto ao banco de dados • Uso do padrão DAO (Data Access Object) • Uso de framework de persistência © LES/PUC-Rio Estratégia – acesso direto • Fazer com que cada objeto persistente possua comportamento que permita a sua restauração, atualização ou remoção – O objeto tem operações cujos métodos possuem código SQL para realizar a inserção, remoção, atualização e consulta das tabelas onde está armazenado • É de fácil implementação © LES/PUC-Rio Estratégia – acesso direto • Justificável apenas para sistemas simples – A lógica da aplicação fica desprotegida de eventuais modificações na estrutura do banco de dados – A coesão das classes diminui, porque cada classe deve possuir responsabilidades relativas ao armazenamento e materialização de seus objetos, além de ter responsabilidades inerentes ao negócio – Dificuldades de manutenção e extensão do código fonte praticamente proíbe a utilização desta estratégia em sistemas complexos – Mais complicado migrar o sistema OO de um SGBD para outro © LES/PUC-Rio Estratégia de persistência – acesso DAO • O padrão DAO desacopla as classes do negócio dos aspectos relativos ao acesso ao armazenamento persistente • Nessa estratégia, um sistema OO obtém acesso a objetos de negócio através de uma interface, chamada interface DAO – Classes que implementam essa interface transformam informações provenientes do mecanismo de armazenamento em objetos de negócio, e vice-versa – A implementação dos objetos destas classes simplesmente não faz diferença para a aplicação – O objeto DAO isola completamente os seus clientes das particularidades do mecanismo de armazenamento (fonte de dados) sendo utilizado © LES/PUC-Rio Estratégia de persistência – acesso DAO © LES/PUC-Rio Estratégia de persistência – acesso DAO © LES/PUC-Rio Persistência com JDBC Introdução • JDBC (Java Database Connectivity) – Biblioteca de classes Java – Faz conexão com bancos de dados relacionais • Driver – Ponte para um banco de dados relacional • Driver JDBC – Ponte entre o JDBC e um banco de dados relacional © LES/PUC-Rio Introdução © LES/PUC-Rio JDBC - Exemplo public class Conexao { public Conexao() throws Exception { Connection conn = null; Statement st = null; ResultSet rs = null; try { Class.forName("com.mysql.jdbc.Driver"); conn = DriverManager.getConnection("jdbc:mysql://server/sistema", "user", "password"); st = conn.createStatement(); rs = st.executeQuery("SELECT id, nome FROM pessoa"); while (rs.next()) System.out.println(rs.getInt("id") + "\t" + rs.getString(“nome")); } catch (ClassNotFoundException e) { throw new Exception("Classe do Oracle não encontrada.", e); } catch (SQLException e) { throw new Exception("Erro de SQL.", e); } finally { if (rs != null) rs.close(); if (st != null) st.close(); if (conn != null) conn.close(); } } } © LES/PUC-Rio JDBC: Driver • Driver é carregado por – Class.forName(″com.mysql.jdbc.Driver″); • Não é necessário criar uma instância do driver – Chamada a Class.forName faz isto automaticamente – Após o carregamento, o driver está disponível para efetuar conexões com um banco de dados • Forma geral para o estabelecimento de uma conexão – DriverManager.getConnection("jdbc:mysql://server/sistema" , "user", "password"); © LES/PUC-Rio JDBC: URL • URL de acesso – Informa a forma de acesso e a localização do SGBD jdbc:mysql://server:3306/sistema • Protocolo Java: MySQL 5 (mysql) • Localização do SGBD: server (poderia ser um IP) • Porta de acesso: 3306 • Database: sistema – Essa informação vária de SGBD para SGBD • Oracle: jdbc:oracle:thin:@server:1521:XE • MS SQL: jdbc:microsoft:sqlserver://server:1433 © LES/PUC-Rio JDBC: manipulando a base • Objeto Statement – Usado para enviar comando SQL ao SGBD – Para se criar um objeto Statement é preciso ter um objeto Connection ativo Statement stmt = conn.createStatement(); © LES/PUC-Rio JDBC: manipulando a base • Após a criação de um objeto Statement – Para o comando SQL SELECT, deve-se usar o método executeQuery – Para os demais comandos SQL, deve-se usar o método executeUpdate st.executeUpdate("CREATE TABLE "pessoa" ("id" NUMBER(11,0) NOT NULL, "nome" VARCHAR2 (255 BYTE) NOT NULL)"); st.executeQuery("SELECT id, nome FROM pessoa"); © LES/PUC-Rio JDBC: recuperando dados • Objeto ResultSet – Um Statement retorna o resultado de um comando SQL em um objeto ResultSet ResultSet rs = st.executeQuery("SELECT id, nome FROM pessoa"); • O objeto rs possui linhas de id e conteudo – Método next() deve ser usado para percorrer o ResultSet • Uma chamada a next() move o cursor uma linha por vez do início ao fim do ResultSet © LES/PUC-Rio JDBC: recuperando valores • Métodos getX de ResultSet – Ex.: método para recuperar valor do tipo VARCHAR é getString – Ex.: método para recuperar valor do tipo FLOAT é getFloat • Do exemplo anterior ResultSet rs = st.executeQuery("SELECT id, nome FROM pessoa"); while (rs.next()) System.out.println(rs.getInt("id") + "\t" + rs.getString("nome")); © LES/PUC-Rio Exercícios • O objetivo dos exercícios é fixar os conceitos de: – Conexão com o Banco – Criação de Tabela – Inserção e Alteração de Registros 48 © LES/PUC-Rio Fim