Em vários pontos de elaboração da arquitetura de projetos, sempre me questionei sobre uma possível melhor implementação com o padrão DAO sobre tabelas no banco que se relacionam no modelo 1-N.
Imagine o seguinte contexto:
No banco de dados eu tenho as tabelas “student” e “book” (um student tem muitos books, logo um book pertence unicamente a um student).
Logo posso listar todos os students e seus respectivos books através da query:
select * from student, book where student.student_id = book.student;
ou
select * from student inner join(book) on (student.student_id = book.student);
No meu projeto, tenho a seguinte classe para representar um student:
class Student{
long id;
List<Book> books;
//getters and setters
}
(aqui vem o conflito)
Logo no meu DAO, para implementar um método que liste todos os students e seus respectivos books, e itera-los em um List, a única maneira possívelmente elegante que vejo é a seguinte:
Classe StudentDAO
//imports statements necessários
class StudentDAO{
//constructor para definir uma variável java.sql.Connection
List<Student> getList(){
PreparedStatement ps = con.prepareStatement("select * from students");
ResultSet rs = ps.executeQuery();
Student aluno = null;
List lista = new ArrayList<Student>;
while(rs.next()){
aluno = new Student();
aluno.setId(rs.getLong("student_id"));
aluno.setBooks(new BookDAO().getList(aluno.getId(), con));
lista.add(aluno);
}
return lista;
}
}
Classe BookDAO
//imports statements necessários
class BookDAO{
List<Book> getList(long studentId, Connection con){
PreparedStatement ps = con.prepareStatement("select * from book where book.student = ?");
ps.setLong(1, studentId);
ResultSet rs = ps.executeQuery();
Book livro = null;
List lista = new ArrayList<Livro>;
while(rs.next()){
livro= new Book();
livro.setId(rs.getLong("book_id"));
lista.add(livro);
}
return lista;
}
}
No seguinte contexto, pequenas queries estão sendo executadas para cada Student que venha a ser listado no primeiro ResultSet. Assim, não promovendo o uso do join. Porém, imaginem caso eu usasse apenas uma query com o join proposto no topo deste post nesse contexto, como iteraria de maneira elegante?