API Orientada a Objetos de Java - Wiki LES PUC-Rio

Propaganda
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
Download