Projeto Back-end
- JDBC (Java Database Connectivity): API padrão do Java para acesso a dados
- Páginas oficiais:
- Pacotes utilizados: java.sql e javax.sql (API suplementar para servidores)
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:
- https://www.devmedia.com.br/dao-pattern-persistencia-de-dados-utilizando-o-padrao-dao/30999
- https://www.oracle.com/technetwork/java/dataaccessobject-138824.html
Lista de métodos de cada classe no pacote entities:
- Constructors
- Getters/Setters
- hashCode and equals
- toString
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:
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.
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.
- http://educandoweb.com.br/
- Curso: Programação Orientada a Objetos com Java
- Professor: Dr. Nelio Alves