Olá pessoal, tudo bem?
Tenho um projeto que utiliza JDBC puro e eu estou com algumas dúvidas se a a arquitetura dele está da melhor forma possível, principalmente em se tratando das consultas ao banco de dados. Inicialmente, este projeto era para ser algo pequeno, e também por não ter o conhecimento na época, não utilizei Hibernate (estou arrependido por isso).
Bom, o fato é o seguinte, tenho meus relacionamentos 1:N e hoje eu trato eles assim:
@Override
public List<Chamado> getLista() throws BusinessException {
PreparedStatement stmt;
try {
stmt = this.connection
.prepareStatement("select * from chamados order by DataChamado;");
ResultSet rs = stmt.executeQuery();
List<Chamado> chamados = new ArrayList<Chamado>();
while (rs.next()) {
Chamado chamado = new Chamado();
chamado.setIdChamado(rs.getInt("idChamado"));
chamado.setTecnico(new TecnicoDAO(connection).getById(String
.valueOf(rs.getInt("Tecnicos_idTecnico"))));
chamado.setNaturezaChamado(new NaturezaChamadoDAO(connection)
.getById(String.valueOf(rs
.getInt("NaturezasChamado_idNaturezaChamado"))));
chamado.setTipoChamado(new TipoChamadoDAO(connection)
.getById(String.valueOf(rs
.getInt("TiposChamado_idTipoChamado"))));
chamado.setUsuario(new UsuarioDAO(connection).getById(String
.valueOf(rs.getInt("Usuarios_idUsuario"))));
chamado.setSituacao(new SituacaoDAO(connection).getById(String
.valueOf(rs.getInt("Situacoes_idSituacao"))));
chamado.setDataChamado(rs.getDate("dataChamado"));
chamado.setDataFechamento(rs.getDate("dataFechamento"));
/* Subtraindo as datas */
SimpleDateFormat formatarDate = new SimpleDateFormat(
"yyyy-MM-dd-HH:mm:ss");
Date date1 = formatarDate.parse(formatarDate.format(new Date(
System.currentTimeMillis())));
Date date2 = formatarDate.parse(rs.getDate("dataChamado")
.toString() + "-" + rs.getString("horaChamado"));
Long diferencaMilliSeg = date2.getTime() - date1.getTime();
Long diferencaHoras = Math
.abs(diferencaMilliSeg / 1000 / 60 / 60); // diferença
// em horas
Integer tempoRestante = chamado.getTipoChamado().getnHoras()
- Integer.valueOf(diferencaHoras.toString());
chamado.setTempoRestante(tempoRestante.toString());
chamado.setTitulo(rs.getString("titulo"));
chamado.setDescricao(rs.getString("descricao"));
chamado.setEquipamento(rs.getString("equipamento"));
chamado.setHoraChamado(rs.getString("horaChamado"));
chamado.setHoraFechamento(rs.getString("horaFechamento"));
chamado.setUidAvaliacao(rs.getString("UidAvaliacao"));
chamado.setDataAvaliacao(rs.getDate("dataAvaliacao"));
chamado.setAvaliacao(rs.getInt("avaliacao"));
chamado.setUidAvaliacao(rs.getString("UidAvaliacao"));
chamado.setComentarioAvaliacao(rs.getString("ComentarioAvaliacao"));
chamados.add(chamado);
}
rs.close();
stmt.close();
rs = null;
stmt = null;
return chamados;
} catch (SQLException e) {
throw new BusinessException("Erro no banco de dados! Contacte o Administrador!");
} catch (ParseException e) {
throw new BusinessException("Erro na formatação de datas! Contacte o Administrador!");
}
}
Percebam que eu não estou utilizando Inner Join nos relacionamentos! Sei que esta abordagem gera muitos hits no banco, mas fica mais limpa quando cada DAO acessa os seus dados. Como o projeto está crescendo, quero consertar isso caso esteja errado!
O mais correto seria eu utilizar Inner Join em todos relacionamentos 1:N? E no casos em que a minha classe do lado N também possuir relacionamentos 1:N?
Obrigado pela atenção de todos!