Это не оптимально.
for (Pecas pecasVerificacao : pecasList) {
for (Pecas pecasBanco : pecasDAO.pegarPecas()) {
...
}
}
Это выполняет запрос один раз для каждого элемента в pecasList
.В общем, вы хотите сохранить связь с БД / объем передаваемых данных до минимума.Извлечение всех элементов несколько раз не требуется.Простое исправление без особой необходимости переписывать - просто получить результаты только один раз и использовать их повторно:
final List<Pecas> pecas = pecasDAO.pegarPecas();
for (Pecas pecasVerificacao : pecasList) {
for (Pecas pecasBanco : pecas) {
...
}
}
Однако при этом получается больше данных, чем вам действительно нужно.Оператор IN
может использоваться для получения только тех значений, которые вас интересуют. Кроме того, ваш первый фрагмент кода содержит много стандартного кода.Чтобы избежать этой проблемы, сохраните свои CheckBox
в списке:
private CheckBox[] checkBoxes;
Убедитесь, что следующий код выполняется один раз после создания CheckBox
es.
checkBoxes = new CheckBox[] {
checkMonitor,
checkTeclado,
checkMouse,
checkVGA,
checkPlacaMae,
checkHD,
checkFonte,
checkRam,
checkCabos,
checkGravador,
checkBateria
};
(Выможет потребоваться использовать другую структуру данных для хранения данных, если вы не можете гарантировать, что диапазон индекса равен 1, ..., n).
Таким образом, вы можете переписать заполнение кода pecasList
следующим образом (Я просто храню идентификаторы здесь):
List<Integer> pecasList = new ArrayList<>();
for (int i = 0; i < checkBoxes.length; i++) {
if (checkBoxes[i].isSelected()) {
pecasList.add(i+1);
}
}
public List<Pecas> pegarPecasById(List<Integer> ids) {
if (ids.isEmpty()) {
return new ArrayList<>(0);
} else {
String sql = ids.stream().map(Object::toString).collect(Collectors.joining(",", "SELECT * FROM pecas WHERE id_pecas IN (", ")"));
try {
PreparedStatement stmt = con.prepareStatement(sql);
ResultSet rs = stmt.executeQuery();
while (rs.next()) {
Pecas pecas = new Pecas();
pecas.setIdpecas(rs.getInt("id_pecas"));
pecas.setNome(rs.getString("nome"));
pecas.setQtd_Pecas(rs.getInt("qtdPecas"));
pecaslist.add(pecas);
}
stmt.close();
rs.close();
} catch (SQLException ex) {
Logger.getLogger(RequisicaoDAO.class.getName()).log(Level.SEVERE, null, ex);
return null;
}
return pecaslist;
}
}
Таким образом, вы получаете только результаты для отмеченных флажков.Это должно сделать ненужным вложенный цикл.