Мне нужно было сократить этот код. Мой проект содержит этот раздел 32x. Поэтому я хочу спросить, не знает ли кто-нибудь, как упростить и обобщить его.
conn[1] = DriverManager.getConnection(DATABASE_URL, USERNAME, PASSWORD);
{
PreparedStatement stmt = conn[1].prepareStatement("SELECT * FROM nfl.minnesota");
ResultSet rs = stmt.executeQuery();
while (rs.next()) {
teamA = rs.getInt("MinnvsAt");
teamB = rs.getInt("AtvsMinn");
ID = rs.getBoolean("MinnvsAtP");
placement();
place();
}
PreparedStatement stmt1 = conn[1].prepareStatement("SELECT SUM(MinnvsAt) FROM nfl.minnesota WHERE MinnvsAtP = TRUE");
ResultSet rs1 = stmt1.executeQuery();
rs1.next();
int SUMPointsAH = rs1.getInt(1);
PreparedStatement stmt2 = conn[1].prepareStatement("SELECT SUM(MinnvsAt) FROM nfl.minnesota WHERE MinnvsAtP = FALSE");
ResultSet rs2 = stmt2.executeQuery();
rs2.next();
int SUMPointsAA = rs2.getInt(1);
PreparedStatement stmt3 = conn[1].prepareStatement("SELECT SUM(AtvsMinn) FROM nfl.minnesota WHERE MinnvsAtP = TRUE");
ResultSet rs3 = stmt3.executeQuery();
rs3.next();
int SUMPointsBH = rs3.getInt(1);
PreparedStatement stmt4 = conn[1].prepareStatement("SELECT SUM(AtvsMinn) FROM nfl.minnesota WHERE MinnvsAtP = FALSE");
ResultSet rs4 = stmt4.executeQuery();
rs4.next();
int SUMPointsBA = rs4.getInt(1);
pointsH.add(SUMPointsAA);
}
Вы можете сделать 4 запроса, 2 запроса с некоторыми параметрами и извлечь два вспомогательных метода, чтобы быть более СУХОЙ, но в целом сделать ваш код более надежным и читаемым, потому что вы объявляете слишком много переменных, которые, кроме того, имеют слишком широкую область.
Вы могли бы написать что-то вроде:
public int executeMinnvsAtPQuery(String MinnvsAtP){
String query = "SELECT SUM(MinnvsAt) FROM nfl.minnesota WHERE MinnvsAtP = ?";
PreparedStatement stmt = conn[1].prepareStatement(minnvsAtPQuery);
stmt.setString(1, MinnvsAtP);
ResultSet rs = stmt.executeQuery();
rs.next();
return rs.getInt(1);
}
public int executeAtvsMinnQuery(String AtvsMinn){
String query = "SELECT SUM(AtvsMinn) FROM nfl.minnesota WHERE MinnvsAtP = ?";
PreparedStatement stmt = conn[1].prepareStatement(minnvsAtPQuery);
stmt.setString(1, AtvsMinn);
ResultSet rs = stmt.executeQuery();
rs.next();
return rs.getInt(1);
}
И используйте их таким образом:
int SUMPointsAH = executeMinnvsAtPQuery("TRUE");
int SUMPointsAA = executeMinnvsAtPQuery("FALSE");
int SUMPointsBH = executeAtvsMinnQuery("TRUE");
int SUMPointsBA = executeAtvsMinnQuery("FALSE");
Обратите внимание, что даже если эти два вопроса очень близки, я не думаю, что вы можете сделать sum(...)
агрегировать параметр, ценный для PreparedStatement
.
И я бы не рекомендовал конкатенацию частей SQL, которые являются как склонными к ошибкам, так и небезопасными.
Мой проект содержит этот раздел 32x.
Чтобы уменьшить это значение до 1X, вы можете следовать той же логике и извлекать набор этих запросов в методе с некоторыми параметрами, которые вы можете вызывать в любом месте.
Также обратите внимание, что выполнение запросов может иметь стоимость с точки зрения времени выполнения. Поэтому вы также должны убедиться, что ваши запросы оптимизированы и требуются.
Вы можете указать TRUE или FALSE с помощью параметра.
Таким образом, вам нужно только PreparedStatement
: SELECT SUM(MinnvsAt), SUM(AtvsMinn) FROM nfl.minnesota WHERE MinnvsAtP =?
,
Таким образом, вы можете сократить все это более чем наполовину.
Как отметил @GriffeyDog, вы можете сделать все это в одном запросе через GROUP BY
:
SELECT SUM(MinnvsAt), SUM(AtvsMinn) FROM nfl.minnesota GROUP BY MinnvsAtP ORDER BY MinnvsAtP
Таким образом, первая строка будет результатом FALSE, а вторая строка будет TRUE, а первым столбцом будет SUM(MinnvsAt)
и второй SUM(AtvsMinn)
.
Поэтому нужно выполнить только один PreparedStatement.executeQuery()
.
group by
SQLgroup by
.