11 DAO-JDBC
-
Upload
hudson-alves -
Category
Documents
-
view
58 -
download
0
Transcript of 11 DAO-JDBC
Padrões de Projeto na Prática
Como os padrões resolvem
problemas, como selecionálos
e utilizá-los.
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)
• 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
Data Access Object - DAO
Aplicação
(Objeto de negócio)
DAO
BDs XMLs Outras aplicações
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.
Estrutura do padrão DAO
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.
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 ) ;
}
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 ){
…
}
}
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
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.
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 ) ;
}
• Java Database Connectivity
• Provê acesso SQL ao banco de dados
• Principais componentes:
– DriverManager
– Connection
– Statement
– PreparedStatement
– ResultSet
– SQLException
• 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
• 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)
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.");
}
• 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
• 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
• 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.
• Representa uma exceção retornada pela API
JDBC
• Deve ser tratada (try-catch) ou declarada
para ser passada (throws) ao método
chamador
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
}
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
}