DATA ACCESS OBJECT (DAO)

Documentos relacionados
Exercícios de fixação: Listas

Banco de dados POO Márcio Delamaro. Programação Orientada a Objetos Prof Marcio Delamaro ICMC/USP

De forma simples, para a execução de comandos SQL com JDBC, precisa-se da instancia de três classes Java. São elas: Nome da classe Função

JDBC. Siga as instruções para instalar o banco de dados H2 e criar a tabela Alunos.

Lista de exercícios I - RESPOSTAS Servlets e banco de dados

Funcionamento da Aplicação. Simulações do funcionamento. Simulação SAC

JAVA COM BANCO DE DADOS PROFESSORA DANIELA PIRES

Listando, gravando, alterando e excluindo registro do banco de dados com JSP

Padrões de Projeto e Persistência com DAO

Java - Conexão ao Banco de Dados usando JDBC

Agenda. Instalação e configuração. Processamento de comandos SQL com JDBC. Driver JDBC Criação da classe de conexão

JDBC (Java Database Connectivity) Padrão de Projeto DAO (Data Access Object) Roteiro para instalação do banco de dados e do driver JDBC

Java & Bancos de Dados Adaptado de Slides da Universidade Salgado de Oliveira Goiânia

Web Services. EclipseSDK/DB2 Construindo/Consumindo Serviços

Acesso a banco de dados

Programação Orientada a Objetos II

Banco de Dados. Banco de Dados. Alcides Pamplona Alcides Pamplona Linguagem de Programação CESBD 2010

JDBC JDBC. JDBC - Arquitetura. JDBC Arquitetura Pacote Java.sql. Java Database Connectivity JDBC PostgreSQL

JDBC. Prof. Márcio Bueno

Programação Orientada a Objetos JDBC Java Database Connectivity

Computação II - Java - Prova 1 Prof. Adriano Joaquim de Oliveira Cruz /05/13. Questão: Total Pontos: Gráu:

Integrando Java com Banco de Dados

Drive MySql de conexão para Eclipse

JavaServer Faces JSF

Desenvolvimento Web TCC Turma A-1

Acesso a Banco. Conexão em Java. Conexão em Java. Programação Orientada a Objetos Profa. Cristiane e Prof. Daniel

Módulo 5 - JDBC java.sql - Conexão com Banco de Dados

Universidade Católica do Salvador Bacharelado em Informática. Antonio Yuri Jailson do Amor Divino Felipe Souza. Tutorial: Trabalhando com JDBC

1) Responda de acordo com os conceitos de orientação a objetos (0,5).

Implementar um exemplo de relacionamento entre classes um para muitos (1:N) e um para um (1:1). Sistema para uma Promotora de Evento Agenda Anual

JDBC. Java DataBase Connectivity

Persistência de Objetos no SGBD PostgreSQL, Utilizando as APIs: JDBC, JDK, Swing e Design Patteners DAO.

Código-Fonte da Prática 02

Lista de Exercícios da disciplina Aplicações de Linguagem de Programação Orientada a objetos

Leonardo Gresta Paulino Murta

Fernando Freitas Costa. Pós-Graduando em Gestão e Docência Universitária. blog.fimes.edu.br/fernando nando@fimes.edu.br

JDBC Tópicos avançados de acesso a base de dados relacional

Especialização em web com interfaces ricas

Manipulação de Banco de Dados com Java 1. Objetivos

Programação Estruturada e Orientada a Objetos. Objetos e Métodos

Driver Mysql para Banco de Dados. Conexão com um Banco de Dados

RESPOSTA: import java.util.arraylist; import java.util.list; class CarrinhoDeCompras2 { List<Produto> produtos;

Introdução. Atributos em Java. Atributos. Acesso à atributos em Java. Atributo versus variável. Atributos, métodos e encapsulamento.

Tipos, Literais, Operadores

Tipos, Literais, Operadores

Manipulação de Banco de Dados com Java. Ms. Bruno Crestani Calegaro Maio/ 2015

JDBC - Java Data Base Connectivity

Programação Estruturada e Orientada a Objetos

JDBC Acessando Banco de Dados

PADRÕES DE PROJETO DE SOFTWARE

UNIP - Ciência da Computação e Sistemas de Informação. Estrutura de Dados. AULA 5 Pilhas

JDBC com Banco de Dados Standalone

SISTEMA EXPERIMENTALL 15/11/2009. Olá! A partir de agora vamos conhecer a IDE NetBeans efetuando um micro projeto swing.

Linguagem de Programação Orientada a Objeto Abstração - Encapsulamento

Autenticação e Autorização

Universidade Federal de Uberlândia Faculdade de Computação Programação Orientada a Objetos II Prof. Fabiano Dorça. Padrão Observer (Observador)

Roteiro. Introdução. Uma Introdução à Programação Orientada a Objetos e JAVA usando NetBeans. Objetos. Princípios da Orientação a Objetos

Encapsulamento. Alberto Costa Neto DComp - UFS

Autor: Ricardo Francisco Minzé Júnior - ricardominze@yahoo.com.br Desenvolvendo aplicações em camadas com PHP 5.

1 Introdução e Conceitos básicos

O JUnit permite a realização de testes de unidades, conhecidos como "caixa branca", facilitando assim a correção de métodos e objetos.

Programação Orientada a Objetos (DPADF 0063)

Linguagem de Programação II Implementação

PLATAFORMA SIGA RIO DAS VELHAS MANUAL DO CÓDIGO FONTE

Faça Fácil Proficy Historian e SQL Linked Server

CONEXÃO JAVA - BANCO DE DADOS

Linguagem de Programação II Implementação

Unidade 9: Middleware JDBC para Criação de Beans

Java e Conexão com Banco de Dados

Faça Fácil. Proficy Historian e SQL Linked Server

DSS 08/09. Camada de Dados - JDBC. Aula 1. António Nestor Ribeiro /António Ramires Fernandes/ José Creissac Campos {anr,arf,jfc}@di.uminho.

Tratamento de Exceções

Lista 05 Herança. public class PessoaFisica extends Pessoa { private String RG; public PessoaFisica(){ super(); } public String getrg(){ return RG; }

PadrãoIX. Módulo II JAVA. Marcio de Carvalho Victorino. JDBC - Java Database Connectivity A,L,F,M

Desenvolvimento Web com Java. Sérgio Lopes Caelum -

Orientação a Objetos AULA 09

Como criar um banco de dados usando o mysql

Transcrição:

Universidade de São Paulo, Instituto de Ciências Matemáticas e de Computação DATA ACCESS OBJECT (DAO) SSC 621: Análise e Projeto Orientados a Objetos Prof. Dr. Lucas Bueno R. Oliveira 2º Semestre 2015

2/60 DATA ACCESS OBJECT (DAO) CONTEXT0 A maioria dos sistemas precisa persistir dados em algum ponto de seu funcionamento Dados de um sistema podem ser armazenados de diferentes formas O acesso ao banco de dados depende fortemente do tipo de armazenamento e da tecnologia utilizada A interação entre as regras de negócio e as regras de armazenamento de dados influencia na qualidade do sistema

3/60 DATA ACCESS OBJECT (DAO) PROBLEMA MVC Visão Controle Modelo??? Persistência C1 C2 M1 M2 M3 BD File XML Java/.NET/C++??? SQL/I-O/XML

4/60 DATA ACCESS OBJECT (DAO) SOLUÇÃO Visão Controle Modelo DAO Persistência C1 M1 DM1 BD M2 DM2 File C2 M3 DM3 XML Java/.NET/C++ Java/.NET/SQL/XML SQL/I-O/XML

5/60 DATA ACCESS OBJECT (DAO) SOLUÇÃO Criar um objeto para gerenciar a obtenção e o armazenamento de dados Abstrair e encapsular todo o acesso às fontes de dados Ocultar do cliente a forma de acesso por meio de uma interface Fornecer os dados do banco usando um objeto de transferência

DATA ACCESS OBJECT (DAO) SOLUÇÃO 6/60

DATA ACCESS OBJECT (DAO) SOLUÇÃO 7/60

8/60 DATA ACCESS OBJECT (DAO) SOLUÇÃO A aplicação cria um objeto do tipo DAO

9/60 DATA ACCESS OBJECT (DAO) SOLUÇÃO O DAO acessa o banco de dados e retorna um objeto de transferência

10/60 DATA ACCESS OBJECT (DAO) SOLUÇÃO Objeto de transferência é modificado pela aplicação

11/60 DATA ACCESS OBJECT (DAO) SOLUÇÃO A aplicação usa o DAO para atualizar o objeto de transferência no banco de dados

DATA ACCESS OBJECT (DAO) EXEMPLO 12/60

13/60 DATA ACCESS OBJECT (DAO) EXEMPLO CRUD Create = Criar Read = Ler Update = Atualizar Delete = Remover

SEM DAO EXEMPLO DE IMPLEMENTAÇÃO 14/60

15/60 SEM DAO EXEMPLO DE IMPLEMENTAÇÃO public class Aluno { private long matricula; private String nome, instituicao; private boolean sexo; public static final boolean MASCULINO = false; public static final boolean FEMININO = true; public Aluno(){ // Setters e Getters para manter o encapsulamento public long getmatricula() {return matricula; public void setmatricula(long matr) {this.matricula = matr; public String getnome() {return nome; public void setnome(string nome) {this.nome = nome; public String getinstituicao() {return instituicao; public void setinstituicao(string inst) {this.instituicao = inst; public boolean getsexo() {return sexo; public void setsexo(boolean sexo) {this.sexo = sexo; Continua...

16/60 SEM DAO EXEMPLO DE IMPLEMENTAÇÃO public class Aluno { private long matricula; private String nome, instituicao; private boolean sexo; public static final boolean MASCULINO = false; public static final boolean FEMININO = true; public Aluno(){ // Setters e Getters para manter o encapsulamento public long getmatricula() {return matricula; public void setmatricula(long matr) {this.matricula = matr; public String getnome() {return nome; public void setnome(string nome) {this.nome = nome; public String getinstituicao() {return instituicao; public void setinstituicao(string inst) {this.instituicao = inst; public boolean getsexo() {return sexo; public void setsexo(boolean sexo) {this.sexo = sexo; Continua...

17/60 SEM DAO EXEMPLO DE IMPLEMENTAÇÃO public class Aluno { private long matricula; private String nome, instituicao; private boolean sexo; public static final boolean MASCULINO = false; public static final boolean FEMININO = true; public Aluno(){ // Setters e Getters para manter o encapsulamento public long getmatricula() {return matricula; public void setmatricula(long matr) {this.matricula = matr; public String getnome() {return nome; public void setnome(string nome) {this.nome = nome; public String getinstituicao() {return instituicao; public void setinstituicao(string inst) {this.instituicao = inst; public boolean getsexo() {return sexo; public void setsexo(boolean sexo) {this.sexo = sexo; Continua...

18/60 SEM DAO EXEMPLO DE IMPLEMENTAÇÃO public class Aluno { private long matricula; private String nome, instituicao; private boolean sexo; public static final boolean MASCULINO = false; public static final boolean FEMININO = true; public Aluno(){ // Setters e Getters para manter o encapsulamento public long getmatricula() {return matricula; public void setmatricula(long matr) {this.matricula = matr; public String getnome() {return nome; public void setnome(string nome) {this.nome = nome; public String getinstituicao() {return instituicao; public void setinstituicao(string inst) {this.instituicao = inst; public boolean getsexo() {return sexo; public void setsexo(boolean sexo) {this.sexo = sexo; Continua...

19/60 SEM DAO EXEMPLO DE IMPLEMENTAÇÃO // Os métodos a seguir misturam as regras de negócio (Java) // com as regras de bancos de dados (SQL), o que diminui a coesão public void createaluno(){ try { Class.forName("com.mysql.jdbc.Driver"); Connection conexao = DriverManager.getConnection("jdbc:mysql://localhost/IFSP_DAO", "IFSP_DAO", "123123"); // cria um preparedstatement baseado em uma string SQL String sql = "INSERT INTO aluno (id, nom, inst, gen) values (?,?,?,?)"; PreparedStatement stmt = conexao.preparestatement(sql); // preenche os valores para (?,?,...,?) stmt.setlong(1, matricula); stmt.setstring(2, nome); stmt.setstring(3, instituicao); stmt.setboolean(4, sexo); // executa o comando SQL stmt.execute(); stmt.close(); Continua...

20/60 SEM DAO EXEMPLO DE IMPLEMENTAÇÃO // Os métodos a seguir misturam as regras de negócio (Java) // com as regras de bancos de dados (SQL), o que diminui a coesão public void createaluno(){ try { Class.forName("com.mysql.jdbc.Driver"); Connection conexao = DriverManager.getConnection("jdbc:mysql://localhost/IFSP_DAO", "IFSP_DAO", "123123"); // cria um preparedstatement baseado em uma string SQL String sql = "INSERT INTO aluno (id, nom, inst, gen) values (?,?,?,?)"; PreparedStatement stmt = conexao.preparestatement(sql); // preenche os valores para (?,?,...,?) stmt.setlong(1, matricula); stmt.setstring(2, nome); stmt.setstring(3, instituicao); stmt.setboolean(4, sexo); // executa o comando SQL stmt.execute(); stmt.close(); Continua...

21/60 SEM DAO EXEMPLO DE IMPLEMENTAÇÃO // Os métodos a seguir misturam as regras de negócio (Java) // com as regras de bancos de dados (SQL), o que diminui a coesão public void createaluno(){ try { Class.forName("com.mysql.jdbc.Driver"); Connection conexao = DriverManager.getConnection("jdbc:mysql://localhost/IFSP_DAO", "IFSP_DAO", "123123"); // cria um preparedstatement baseado em uma string SQL String sql = "INSERT INTO aluno (id, nom, inst, gen) values (?,?,?,?)"; PreparedStatement stmt = conexao.preparestatement(sql); // preenche os valores para (?,?,...,?) stmt.setlong(1, matricula); stmt.setstring(2, nome); stmt.setstring(3, instituicao); stmt.setboolean(4, sexo); // executa o comando SQL stmt.execute(); stmt.close(); Continua...

22/60 SEM DAO EXEMPLO DE IMPLEMENTAÇÃO // Os métodos a seguir misturam as regras de negócio (Java) // com as regras de bancos de dados (SQL), o que diminui a coesão public void createaluno(){ try { Class.forName("com.mysql.jdbc.Driver"); Connection conexao = DriverManager.getConnection("jdbc:mysql://localhost/IFSP_DAO", "IFSP_DAO", "123123"); // cria um preparedstatement baseado em uma string SQL String sql = "INSERT INTO aluno (id, nom, inst, gen) values (?,?,?,?)"; PreparedStatement stmt = conexao.preparestatement(sql); // preenche os valores para (?,?,...,?) stmt.setlong(1, matricula); stmt.setstring(2, nome); stmt.setstring(3, instituicao); stmt.setboolean(4, sexo); // executa o comando SQL stmt.execute(); stmt.close(); Continua...

23/60 SEM DAO EXEMPLO DE IMPLEMENTAÇÃO System.out.println("O aluno " + nome + " foi gravado no banco de dados."); conexao.close(); return true; catch (ClassNotFoundException e) { System.err.println("Não foi possível encontrar a classe de conexão!"); e.printstacktrace(); catch (SQLException e) { System.err.println("Erro na comunicação com o banco de dados!"); e.printstacktrace(); Continua...

24/60 SEM DAO EXEMPLO DE IMPLEMENTAÇÃO System.out.println("O aluno " + nome + " foi gravado no banco de dados."); conexao.close(); return true; catch (ClassNotFoundException e) { System.err.println("Não foi possível encontrar a classe de conexão!"); e.printstacktrace(); catch (SQLException e) { System.err.println("Erro na comunicação com o banco de dados!"); e.printstacktrace(); Continua...

25/60 SEM DAO EXEMPLO DE IMPLEMENTAÇÃO System.out.println("O aluno " + nome + " foi gravado no banco de dados."); conexao.close(); return true; catch (ClassNotFoundException e) { System.err.println("Não foi possível encontrar a classe de conexão!"); e.printstacktrace(); catch (SQLException e) { System.err.println("Erro na comunicação com o banco de dados!"); e.printstacktrace(); Continua...

26/60 SEM DAO EXEMPLO DE IMPLEMENTAÇÃO public Aluno readaluno(long matr){ try { Class.forName("com.mysql.jdbc.Driver"); Connection conexao = DriverManager.getConnection("jdbc:mysql://localhost/IFSP_DAO", IFSP_DAO", "123123"); // Busca o aluno pela matrícula String sql = "SELECT * FROM aluno WHERE id =?" ; PreparedStatement stmt = conexao.preparestatement(sql); stmt.setlong(1, matr); ResultSet resultado = stmt.executequery(); if(resultado.next()){ Aluno a = new Aluno(); // Cria o objeto de transferência a.setnome(resultado.getstring("nom")); a.setmatricula(resultado.getint("id")); a.setinstituicao(resultado.getstring("inst")); a.setsexo(resultado.getboolean("gen")); System.out.println("O aluno " + a.getnome() + ", matrícula n. " + a.getmatricula() + ", estuda no " + a.getinstituicao() + "."); return a; // retorna o objeto de transferência Continua...

27/60 SEM DAO EXEMPLO DE IMPLEMENTAÇÃO public Aluno readaluno(long matr){ try { Class.forName("com.mysql.jdbc.Driver"); Connection conexao = DriverManager.getConnection("jdbc:mysql://localhost/IFSP_DAO", IFSP_DAO", "123123"); // Busca o aluno pela matrícula String sql = "SELECT * FROM aluno WHERE id =?" ; PreparedStatement stmt = conexao.preparestatement(sql); stmt.setlong(1, matr); ResultSet resultado = stmt.executequery(); if(resultado.next()){ Aluno a = new Aluno(); // Cria o objeto de transferência a.setnome(resultado.getstring("nom")); a.setmatricula(resultado.getint("id")); a.setinstituicao(resultado.getstring("inst")); a.setsexo(resultado.getboolean("gen")); System.out.println("O aluno " + a.getnome() + ", matrícula n. " + a.getmatricula() + ", estuda no " + a.getinstituicao() + "."); return a; // retorna o objeto de transferência Continua...

28/60 SEM DAO EXEMPLO DE IMPLEMENTAÇÃO public Aluno readaluno(long matr){ try { Class.forName("com.mysql.jdbc.Driver"); Connection conexao = DriverManager.getConnection("jdbc:mysql://localhost/IFSP_DAO", IFSP_DAO", "123123"); // Busca o aluno pela matrícula String sql = "SELECT * FROM aluno WHERE id =?" ; PreparedStatement stmt = conexao.preparestatement(sql); stmt.setlong(1, matr); ResultSet resultado = stmt.executequery(); if(resultado.next()){ Aluno a = new Aluno(); // Cria o objeto de transferência a.setnome(resultado.getstring("nom")); a.setmatricula(resultado.getint("id")); a.setinstituicao(resultado.getstring("inst")); a.setsexo(resultado.getboolean("gen")); System.out.println("O aluno " + a.getnome() + ", matrícula n. " + a.getmatricula() + ", estuda no " + a.getinstituicao() + "."); return a; // retorna o objeto de transferência Continua...

29/60 SEM DAO EXEMPLO DE IMPLEMENTAÇÃO else{ System.out.println("Matrícula não encontrada!"); conexao.close(); return null; catch (ClassNotFoundException e) {... catch (SQLException e) {... Continua...

30/60 SEM DAO EXEMPLO DE IMPLEMENTAÇÃO else{ System.out.println("Matrícula não encontrada!"); conexao.close(); return null; catch (ClassNotFoundException e) {... catch (SQLException e) {... Continua...

31/60 SEM DAO EXEMPLO DE IMPLEMENTAÇÃO public boolean updatealuno(){ try { Class.forName("com.mysql.jdbc.Driver"); Connection conexao = DriverManager.getConnection("jdbc:mysql://localhost/IFSP_DAO", "IFSP_DAO", "123123"); // cria um preparedstatement baseado em uma string SQL String sql = "UPDATE aluno SET nom =?, inst =?, gen =? WHERE id =?"; PreparedStatement stmt = conexao.preparestatement(sql); // preenche os valores para (?,?,...,?) stmt.setstring(1, nome); stmt.setstring(2, instituicao); stmt.setboolean(3, sexo); stmt.setlong(4, matricula); stmt.executeupdate(); stmt.close(); System.out.println("O aluno " + nome + " foi atualizado no BD."); conexao.close(); // adiciona os métodos catch Continua...

32/60 SEM DAO EXEMPLO DE IMPLEMENTAÇÃO public boolean deletealuno(){ try { Class.forName("com.mysql.jdbc.Driver"); Connection conexao = DriverManager.getConnection("jdbc:mysql://localhost/IFSP_DAO", "IFSP_DAO", "123123"); // Remove o aluno String sql = "DELETE FROM aluno WHERE id =?" ; PreparedStatement stmt = conexao.preparestatement(sql); stmt = conexao.preparestatement(sql); stmt.setlong(1, matricula); stmt.execute(); stmt.close(); conexao.close(); System.out.println("O aluno " + nome + " foi removido do BD."); // adiciona os métodos catch // fim do método deletealuno // fim da classe Aluno

33/60 SEM DAO EXEMPLO DE IMPLEMENTAÇÃO public boolean deletealuno(){ try { Class.forName("com.mysql.jdbc.Driver"); Connection conexao = DriverManager.getConnection("jdbc:mysql://localhost/IFSP_DAO", "IFSP_DAO", "123123"); // Remove o aluno String sql = "DELETE FROM aluno WHERE id =?" ; Arrg! Deve ter um PreparedStatement stmt = conexao.preparestatement(sql); stmt = conexao.preparestatement(sql); jeito mais fácil! stmt.setlong(1, matricula); stmt.execute(); stmt.close(); conexao.close(); System.out.println("O aluno " + nome + " foi removido do BD."); // adiciona os métodos catch // fim do método deletealuno // fim da classe Aluno

34/60 SEM DAO EXEMPLO DE IMPLEMENTAÇÃO public class ClienteExemplo { public static void main(string[] args) { //Cria um aluno Aluno jorge = new Aluno(); jorge.setmatricula(101010); jorge.setinstituicao("ifsp São Carlos"); jorge.setsexo(aluno.masculino); jorge.setnome("jorge"); //Salva o aluno no banco de dados jorge.createaluno(); //Atualiza as informações do aluno jorge.setnome("jorge Fernandes"); jorge.updatealuno(); //Busca as informações cadastradas no banco de dados jorge.readaluno(jorge.getmatricula()); Continua...

35/60 SEM DAO EXEMPLO DE IMPLEMENTAÇÃO public class ClienteExemplo { public static void main(string[] args) { //Cria um aluno Aluno jorge = new Aluno(); jorge.setmatricula(101010); jorge.setinstituicao("ifsp São Carlos"); jorge.setsexo(aluno.masculino); jorge.setnome("jorge"); //Salva o aluno no banco de dados jorge.createaluno(); Regras de armazenamento ou de negócio? //Atualiza as informações do aluno jorge.setnome("jorge Fernandes"); jorge.updatealuno(); //Busca as informações cadastradas no banco de dados jorge.readaluno(jorge.getmatricula()); Continua...

36/60 SEM DAO EXEMPLO DE IMPLEMENTAÇÃO //Remove o aluno jorge.deletealuno(); //Verifica se as informações foram mesmo removidas jorge.readaluno(jorge.getmatricula());

37/60 SEM DAO EXEMPLO DE IMPLEMENTAÇÃO //Remove o aluno jorge.deletealuno(); //Verifica se as informações foram mesmo removidas jorge.readaluno(jorge.getmatricula()); Ops! Um aluno responsável por ler outro aluno?

38/60 SEM DAO EXEMPLO DE IMPLEMENTAÇÃO O que será que acontece se eu usar mais de um BD?

39/60 SEM DAO EXEMPLO DE IMPLEMENTAÇÃO Sem problemas, está funcionando... - coesão + complexidade - Modularidade

40/60 SEM DAO EXEMPLO DE IMPLEMENTAÇÃO - - - coesão +++ complexidade - - - Modularidade D oh! Como eu reúso e mantenho isso?!

COM DAO EXEMPLO DE IMPLEMENTAÇÃO 41/60

42/60 COM DAO EXEMPLO DE IMPLEMENTAÇÃO public class Aluno { private long matricula; private String nome; private String instituicao; private boolean sexo; public static final boolean MASCULINO = false; public static final boolean FEMININO = true; public Aluno(){ // Setters e Getters para manter o encapsulamento public long getmatricula() {return matricula; public void setmatricula(long matr) {this.matricula = matr; public String getnome() {return nome; public void setnome(string nome) {this.nome = nome; // Continua a definição dos Setters e Getters...

43/60 COM DAO EXEMPLO DE IMPLEMENTAÇÃO public class ConnectionFactory { public ConnectionFactory(){ public Connection createconnection() throws SQLException{ try { Class.forName("com.mysql.jdbc.Driver"); return DriverManager.getConnection( "jdbc:mysql://localhost/ifsp_dao", "IFSP_DAO", "123123"); catch (ClassNotFoundException e) { System.err.println("Não foi possível encontrar a classe de conexão!"); e.printstacktrace(); return null; Com o padrão Método Fábrica facilitamos a criação de conexões com o banco de dados!

44/60 COM DAO EXEMPLO DE IMPLEMENTAÇÃO public class AlunoDAO{ public void create(aluno a){ try { // utiliza a fábrica de conexões para criar uma Connection Sql ConnectionFactory fabricacon = new ConnectionFactory(); Connection conexao = fabricacon.createconnection(); // cria um preparedstatement baseado em uma string SQL String sql = "INSERT INTO aluno (id, nom, inst, gen) values (?,?,?,?)"; PreparedStatement stmt = conexao.preparestatement(sql); // preenche os valores para (?,?,...,?) stmt.setlong(1, a.getmatricula()); stmt.setstring(2, a.getnome()); stmt.setstring(3, a.getinstituicao()); stmt.setboolean(4, a.getsexo()); // executa o comando SQL stmt.execute(); stmt.close(); Reduzi a complexidade Continua...

45/60 COM DAO EXEMPLO DE IMPLEMENTAÇÃO System.out.println("O aluno " + a.getnome() + " foi gravado BD."); conexao.close(); catch (SQLException e) { System.err.println("Erro na comunicação com o banco de dados!"); e.printstacktrace(); Diminui as exceções! Continua...

46/60 COM DAO EXEMPLO DE IMPLEMENTAÇÃO public Aluno read(long matr){ try { // Utiliza a fábrica de conexões para criar uma Connection Sql ConnectionFactory fabricacon = new ConnectionFactory(); Connection conexao = fabricacon.createconnection(); // Busca o aluno pela matrícula String sql = "SELECT * FROM aluno WHERE id =?" ; PreparedStatement stmt = conexao.preparestatement(sql); stmt.setlong(1, matr); ResultSet resultado = stmt.executequery(); if(resultado.next()){ Aluno a = new Aluno(); a.setnome(resultado.getstring("nom")); a.setmatricula(resultado.getint("id")); a.setinstituicao(resultado.getstring("inst")); a.setsexo(resultado.getboolean("gen")); System.out.println("O aluno " + a.getnome() + ", matrícula n. " + a.getmatricula() + ", estuda no " + a.getinstituicao() + "."); return a; Continua...

47/60 COM DAO EXEMPLO DE IMPLEMENTAÇÃO else{ System.out.println("Matrícula não encontrada!"); conexao.close(); return null; catch (SQLException e) { System.err.println("Erro na comunicação com o banco de dados!"); e.printstacktrace(); return null; Continua...

48/60 COM DAO EXEMPLO DE IMPLEMENTAÇÃO public void update(aluno a) { try { // utiliza a fábrica de conexões para criar uma Connection Sql ConnectionFactory fabricacon = new ConnectionFactory(); Connection conexao = fabricacon.createconnection(); // cria um preparedstatement baseado em uma string SQL String sql = "UPDATE aluno SET nom =?, inst =?, gen =? WHERE id =?"; PreparedStatement stmt = conexao.preparestatement(sql); // preenche os valores para (?,?,...,?) stmt.setstring(1, a.getnome()); stmt.setstring(2, a.getinstituicao()); stmt.setboolean(3, a.getsexo()); stmt.setlong(4, a.getmatricula()); stmt.executeupdate(); stmt.close(); conexao.close(); System.out.println("O aluno " + a.getnome() + " foi atualizado no BD"); catch (SQLException e) {... // fim do método update Continua...

49/60 COM DAO EXEMPLO DE IMPLEMENTAÇÃO public void delete(aluno a) { try { // utiliza a fábrica de conexões para criar uma Connection Sql ConnectionFactory fabricacon = new ConnectionFactory(); Connection conexao = fabricacon.createconnection(); // Remove o aluno String sql = "DELETE FROM aluno WHERE id =?" ; PreparedStatement stmt = conexao.preparestatement(sql); stmt = conexao.preparestatement(sql); stmt.setlong(1, a.getmatricula()); stmt.execute(); stmt.close(); System.out.println("O aluno "+ a.getnome() +" foi removido do BD."); conexao.close(); catch (SQLException e) {... // fim do método delete // fim da classe AlunoDAO

50/60 COM DAO EXEMPLO DE IMPLEMENTAÇÃO public class ClienteExemplo { public static void main(string[] args) { //Cria um aluno Aluno jorge = new Aluno(); jorge.setmatricula(101010); jorge.setinstituicao("ifsp São Carlos"); jorge.setsexo(aluno.masculino); jorge.setnome("jorge"); //Cria o DAO para conexão com o banco de dados AlunoDAO alunodao = new AlunoDAO(); //Salva o aluno no banco de dados; alunodao.create(jorge); //Atualiza as informações do aluno jorge.setnome("jorge Fernandes"); // gerencia a aplicação alunodao.update(jorge); //gerencia o banco de dados Continua...

51/60 COM DAO EXEMPLO DE IMPLEMENTAÇÃO public class ClienteExemplo { public static void main(string[] args) { //Cria um aluno Aluno jorge = new Aluno(); jorge.setmatricula(101010); jorge.setinstituicao("ifsp São Carlos"); jorge.setsexo(aluno.masculino); jorge.setnome("jorge"); Separação de interesses! //Cria o DAO para conexão com o banco de dados AlunoDAO alunodao = new AlunoDAO(); //Salva o aluno no banco de dados; alunodao.create(jorge); //Atualiza as informações do aluno jorge.setnome("jorge Fernandes"); // gerencia a aplicação alunodao.update(jorge); //gerencia o banco de dados Continua...

52/60 COM DAO EXEMPLO DE IMPLEMENTAÇÃO //Busca as informações cadastradas no banco de dados alunodao.read(jorge.getmatricula()); //Remove o aluno alunodao.delete(jorge); //Verifica se as informações foram mesmo removidas alunodao.read(jorge.getmatricula());

53/60 COM DAO EXEMPLO DE IMPLEMENTAÇÃO //Busca as informações cadastradas no banco de dados alunodao.read(jorge.getmatricula()); //Remove o aluno alunodao.delete(jorge); //Verifica se as informações foram mesmo removidas alunodao.read(jorge.getmatricula()); Maior coesão!

54/60 COM DAO EXEMPLO DE IMPLEMENTAÇÃO O que será que acontece se eu usar mais de um BD?

55/60 COM DAO EXEMPLO DE IMPLEMENTAÇÃO + + + coesão + + + modularidade + + + reusabilidade Bem melhor agora!!

56/60 RESUMO MVC: Organizar o sistema de forma mais coesa, separando a representação gráfica, o controle e as regras de negócio DAO: Encapsular o acesso ao banco de dados separando as regras de persistência das regras de negócio O acesso ao banco pode variar sem que a aplicação seja alterada A aplicação pode ter múltiplas formas de acesso aos dados de forma mais organizada Maior flexibilidade, coesão, modularidade e facilidade de manutenção

57/60 EXERCÍCIOS 1. Criar uma classe Instituicao com uma relação um para muitos com Aluno. Desenvolver uma classe InstituicaoDAO para persistir objetos da classe Instituicao. 2. Estender a estrutura do Exercício 1 utilizando o padrão Fábrica Abstrata para fabricar objetos do tipo DAO. 3. Implementar classes DAO para gravar objetos do tipo Aluno e Instituicao em arquivos de texto. Criar também a fábrica para construir os objetos do tipo DAO.