Skip to content

alissonfgc/java-dao-jdbc

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

23 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Acesso a banco de dados com JDBC

Projeto Back-end

Objetivo: Implementar o padrão DAO manualmente com JDBC

Feito com

  • Java
  • MySQL
  • IntelliJ IDEA
  • Git

Visão geral do JDBC

JDBC_operation

Padrão de projeto DAO (Data Access Object)

Ideia geral do padrão DAO:

  • Para cada entidade, haverá um objeto responsável por fazer acesso a dados relacionado a esta entidade. Por exemplo:
    • Cliente: ClienteDao
    • Produto: ProdutoDao
    • Pedido: PedidoDao
  • Cada DAO será definido por uma interface.
  • A injeção de dependência pode ser feita por meio do padrão de projeto Factory

Referências:

classes_diagram

Pacote Entities

Lista de métodos de cada classe no pacote entities:

  • Constructors
  • Getters/Setters
  • hashCode and equals
  • toString

entities_classes_diagram

UML do Banco de dados

database_UML

Observações

Important

Para a implementação do método findByDepartment, da classe sellerDAO, não basta criar um objeto para cada linha retornada do banco de dados.

O método findByDepartment() da implementação da classe sellerDAO execuda a seguinte requisição ao banco de dados:

 SELECT seller.*,department.Name as DepName
 FROM seller INNER JOIN department
 ON seller.DepartmentId = department.Id
 WHERE DepartmentId = ?
 ORDER BY Name

Onde a interrogação é substituida pelo valor recebido no parametro do método. Então o método retorna uma lista de objetos do tipo Seller, e para o relacionamento correto entre os objetos, foi necessária a seguinte implementação:

> Forma incorreta

st = conn.prepareStatement("SELECT seller.*,department.Name as DepName FROM seller INNER JOIN department ON seller.DepartmentId = department.Id WHERE DepartmentId = ? ORDER BY Name;");
st.setInt(1, department.getId());
rs = st.executeQuery();

List<Seller> sellers = new ArrayList<>();

while (rs.next()) {
 Department dep = instanciateDepartment(rs); //instanciateDepartment() é um metodo auxiliar, que instancia os objetos recebendo o ResultSet
 Seller seller = instanciateSeller(rs, dep); //instanciateDepartment() é um metodo auxiliar como o instanciateDepartment()
 sellers.add(seller);
}
return sellers;

Deste jeito vai ser instanciado um objeto do tipo Department, para cada objeto do tipo Seller. conforme o primeiro exemplo da imagem.

findByDepartment_method_UML

> Forma correta

st = conn.prepareStatement("SELECT seller.*,department.Name as DepName FROM seller INNER JOIN department ON seller.DepartmentId = department.Id WHERE DepartmentId = ? ORDER BY Name;");
st.setInt(1, department.getId());
rs = st.executeQuery();

List<Seller> sellers = new ArrayList<>();
Map<Integer, Department> map = new HashMap<>();

while (rs.next()) {
 Department dep = map.get(rs.getInt("DepartmentId"));
 if (dep == null) {
  dep = instanciateDepartment(rs);
  map.put(rs.getInt("DepartmentId"), dep);
 }

 Seller seller = instanciateSeller(rs, dep);
 sellers.add(seller);
}

return sellers;

Deste jeito apenas vai ser instanciado um objeto do tipo Department, caso não exista nenhum com o Id correspondente. conforme o segundo exemplo da imagem.

Creditos

About

Project Java using the DAO pattern.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages