11 DAO-JDBC

23
Padrões de Projeto na Prática Como os padrões resolvem problemas, como selecionálos e utilizá-los.

Transcript of 11 DAO-JDBC

Page 1: 11 DAO-JDBC

Padrões de Projeto na Prática

Como os padrões resolvem

problemas, como selecionálos

e utilizá-los.

Page 2: 11 DAO-JDBC

DAO (Data Access Object)

• DAO (Data Access Object)

– Cria uma abstração responsável pelo acesso a

banco de dados.

– DAOs encapsulam todo o acesso a dados

referente às nossas entidades.

– É um padrão JEE

• Baseado no padrão de projeto Strategy (Gamma, 1995)

Page 3: 11 DAO-JDBC

• Data Access Object

• Encapsula as operações JDBC, provendo

acesso de nível mais alto aos demais

componentes da aplicação

• Pode ser usado em conjunto com outros

padrões, como o Singleton

Page 4: 11 DAO-JDBC

Data Access Object - DAO

Aplicação

(Objeto de negócio)

DAO

BDs XMLs Outras aplicações

Page 5: 11 DAO-JDBC

DAO - Data Access Object

• Data Access Object é um padrão da camada

de integração para recuperação de dados,

independente da fonte, ou seja,

– podem ser utilizadas vários data sources (de uma

mesma maneira), deixando o acesso totalmente

transparente para a aplicação;

– possibilita a troca do mecanismo de persistência

de forma transparente para a aplicação;

– Separa as lógicas de negócio e de acesso a

dados;

– Aumenta a portabilidade.

Page 6: 11 DAO-JDBC

Estrutura do padrão DAO

Page 7: 11 DAO-JDBC

DAO

• Participantes

– BusinessObject (BO)

• Requisita acesso para armazenar ou requisitar algum dado de

algum base.

– DataAccessObject (DAO)

• Oferece serviços para o BusinessObject de forma transparente.

– DataSource

• Representa a fonte de dados (ex: BD, outro sistema, repositório

XML, etc). Acessada pelo DAO.

– TransferObject (TO)

• Usado para representar os dados obtidos pelo DAO e para serem

compreendidos pelo BusinessObject.

Page 8: 11 DAO-JDBC

aplicação prática usando DAO

public class ClienteTO {

// atributos

// getters e setters

}

public interface ClienteDAOInterface {

ClienteTO create () ;

void insert ( ClienteTO c ) ;

void update (ClienteTO c ) ;

void delete (ClienteTO c ) ;

ClienteTO findByID ( Integer id ) ;

ClienteTO finfByNumber ( String number ) ;

}

Page 9: 11 DAO-JDBC

Aplicação prática usando DAO public class JDBCClienteDAO implements ClienteDAOInterface {

public ClienteTO create () {

}

public void insert (ClienteTO c ) {

}

public void update (ClienteTO c ) {

}

public void delete (ClienteTO c ) {

}

public ClienteTO findByID ( Integer id ) {

}

public ClienteTO finfByNumber ( String number ){

}

}

Page 10: 11 DAO-JDBC

Características do uso do padrão DAO

• TO - Objetos de transporte. Eles são encarregados de manter os dados em memoria na forma de objetos e estruturas de objetos. Exemplo: ClientePOJO

• Interface DAO - Interface para o DAO de um certo tipo de TO. Exemplo: ClienteDAOInterface

• Implementação DAO - Implementação da interface para o DAO de um certo tipo de TO e um certo tipo de API de persistência. Exemplo: JDBCClienteDAO

Page 11: 11 DAO-JDBC

DAO Genérico

• Usando tipos genéricos ajuda a diminuir o numero de métodos por interface DAO utilizando interfaces comuns. – Portanto, usar Generics não nos ajuda a diminuir o número

de classes ou simplificar a implementação!

• Com “Genérico”, diminui-se a quantidade de métodos na interface DAO específica de cada objeto de transporte, mas não ganhamos muito. – Criamos mais uma classe e a implementação ainda

continua específica.

Page 12: 11 DAO-JDBC

Exemplo de DAO Genérico

public interface GenericDAO<T> {

T create () ;

void insert ( <T> obj ) ;

void update ( <T> obj ) ;

void delete ( <T> obj ) ;

T findByID ( Integer id ) ;

}

public interface CustomerDAO extends GenericDAO<Customer> {

Customer finfByCustomerNumber ( String customerNumber ) ;

}

Page 13: 11 DAO-JDBC
Page 14: 11 DAO-JDBC

• Java Database Connectivity

• Provê acesso SQL ao banco de dados

• Principais componentes:

– DriverManager

– Connection

– Statement

– PreparedStatement

– ResultSet

– SQLException

Page 15: 11 DAO-JDBC

• Usa um driver disponível para realizar uma

conexão com o banco de dados

• Método estático getConnection que retorna

uma Connection e recebe os seguintes

parâmetros:

– Localização do host, porta e schema

– Usuário

– Senha

Page 16: 11 DAO-JDBC

• Representa uma conexão com o banco de

dados e pode ser usada para criar um

Statement ou para preparar um

PreparedStatement, por meio,

respectivamente dos métodos:

– createStatement()

– prepareStatement(sql)

Page 17: 11 DAO-JDBC

String driver = "org.gjt.mm.mysql.Driver";

String strConexao = "jdbc:mysql://localhost/persistenciaUmaTabela";

String usuario = "root";

String senha = "";

try {

Class.forName(driver);

Connection conn =

DriverManager.getConnection(

strConexao, usuario, senha);

} catch (ClassNotFoundException ex) {

System.out.println(

"Driver do banco nao encontrado.");

}

Page 18: 11 DAO-JDBC

• Representa um instrução SEM parâmetros, a

ser enviada para o banco de dados, pelo

acionamento dos métodos:

– int executeUpdate(), para instruções INSERT,

UPDATE e DELETE

– ResultSet executeQuery(), para instruções

SELECT

Page 19: 11 DAO-JDBC

• Representa um instrução COM

parâmetros a ser enviada para o banco de

dados pelo acionamento dos métodos:

– int executeUpdate(), para instruções INSERT,

UPDATE e DALETE

– ResultSet executeQuery(), para instruções

SELECT

• Antes da execução dos métodos acima,

os parâmetros devem ser configurados

com os métodos setString(), setInt(), etc

Page 20: 11 DAO-JDBC

• Conjunto de registros retornados depois

da execução de

Statement.executeQuery() ou

PreparedStatement.executeQuery()

• Principais métodos:

– boolena next(): avança e cursor e indica se

há dados

– int getInt(String) e String getString(String):

retorna o dado de uma coluna com um nome

especificado.

Page 21: 11 DAO-JDBC

• Representa uma exceção retornada pela API

JDBC

• Deve ser tratada (try-catch) ou declarada

para ser passada (throws) ao método

chamador

Page 22: 11 DAO-JDBC

try {

Statement stmt = conn.createStatement();

ResultSet rs =

stmt.executeQuery("SELECT * FROM empregado");

while (rs.next()) {

System.out.println(rs.getString("codigo"));

System.out.println(rs.getString("nome"));

System.out.println(rs.getInt("idade"));

}

} catch (SQLException e) {

// tratamento da exceção

}

Page 23: 11 DAO-JDBC

try {

PreparedStatement stmt =

conn.createStatement(

"SELECT * FROM empregado WHERE codigo = ?");

stmt.setString(1, codigoDePesquisa);

ResultSet rs = stmt.executeQuery();

if (rs.next()) {

System.out.println(rs.getString("codigo"));

System.out.println(rs.getString("nome"));

System.out.println(rs.getInt("idade"));

}

} catch (SQLException e) {

// tratamento da exceção

}