PRDS 2013 24/01/2013 Ricardo A. Venieris Rodnei Couto
Review Hello World Tecnologia Java Variáveis, Operadores Expressões, Comandos e Blocos Controle de Fluxo: Decisão Classes e Interfaces Try, catch, finally, Unchecked Exceptions API e Coleções - Framework Alguém tem dívidas?
Review: Plataforma Java - Características Ferramentas de Desenvolvimento para Compilação Execução Monitoração Depuração Documentação Application Program Interface (API) Classes úteis Prontas para o uso Tecnologias de Deployment Java WebStart Java Plug-In Toolkits de Interface com Usuário Swing Java 2D Bibliotecas de Integração Acesso a Banco de Dados Manipulação de Objetos Remotos
Exercício: Sintaxe e IDE Eclipse Escreva um programa que Entrada: ano no formato yyyy (ex: 1998, 2006,...) Saída: calendário do ano no formato: Exemplo: Dia da Semana, dia/mês/ano. Imprimir na Tela Entrada: 2006 Saída: Dom, 01/01/2006 Seg, 02/01/2006 Ter, 03/01/2006... Sab, 30/12/2006 Dom, 31/12/2006 Dica: use a documentação da JAVA API
Resposta
Exercício: Escreva um programa que implemente o modelo de classes discutido na última aula criando: Todas as classes e relacionamentos necessários Uma classe que popule o sistema da seguinte forma: 2 Médicos 2 Pacientes 2 Atendimentos 2 Salas 1 UPA Uma classe que possua as listas de todos os objetos Uma classe que imprima todos os atendimentos Um validador de CPF, conforme proposto Dica: use padrões de projeto
Banco de Dados Ricardo Almeida Venieris <prds@les.inf.puc-rio.br>
Roteiro Mapeamento de objetos para modelo relacional Estratégias de persistência Persistência JDBC
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.
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
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
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
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
Conceitos do modelo relacional (overview)
Conceitos do modelo relacional (overview)
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)
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
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
Um exemplo
Mapeamento - associação Uma associação normalmente é mapeada para uma chave estrangeira Opcionalmente pode-se usar chaves estrangeiras nas duas relações Um exemplo
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
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
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
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
Mapeamento - auto-associação É uma forma especial de associação, podendo-se usar as mesmas técnicas anteriores
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
Mapeamento - associações N-árias
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
Mapeamento - classes associativas
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
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
Herança
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
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
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
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
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
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
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
Estratégia de persistência acesso DAO
Estratégia de persistência acesso DAO
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
Introdução
JDBC Exemplo (mysql) 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(); } } }
JDBC: Driver Registra o Driver Class.forName( oracle.jdbc.driver.oracledriver ); 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:oracle://server/sistema ", "user", "password"); Mais:http://docs.oracle.com/cd/E14072_01/appdev.112/e13995/ oracle/jdbc/oracledriver.html
JDBC: URL URL de acesso Informa a forma de acesso e a localização do SGBD jdbc:<protocolo>://<server>:<porta><: /><sistema> Protocolo Java: (oracle, mysql, microsoft, etc) Localização do SGBD: server (poderia ser um IP) Porta de acesso: (um número) Database: sistema Essa informação varia de SGBD para SGBD Oracle: jdbc:oracle:thin:@server:1521:xe ou jdbc:oracle:thin:@server:1521:orcl MS SQL: jdbc:microsoft:sqlserver://server:1433
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();
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");
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
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"));
Exercício 3 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 Conectar o banco PRDS e listar em console da tabela alunos todos os dados dos alunos que sejam do tipo Graduação. Descubra e guarde qual o seu ID, será importante para as próximas aulas. O projeto deve possuir uma classe main.main que execute a aplicação. TIPO BD: orcl HOST = 139.82.24.102 PORT = 1521 USER = prds PASS = lesprds2013 Query sugerida: select * from alunos where TP_ALUNO = 'Graduação 54
Obrigado 24/01/2013 Ricardo Almeida Venieris