сокращая код JDBC

0

Мне нужно было сократить этот код. Мой проект содержит этот раздел 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);

    }
  • 2
    Вы можете посмотреть в group by SQL group by .
Теги:
jdbc

2 ответа

2
Лучший ответ

Вы можете сделать 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, вы можете следовать той же логике и извлекать набор этих запросов в методе с некоторыми параметрами, которые вы можете вызывать в любом месте.

Также обратите внимание, что выполнение запросов может иметь стоимость с точки зрения времени выполнения. Поэтому вы также должны убедиться, что ваши запросы оптимизированы и требуются.

0
  1. Вы можете сократить фактическое количество запросов, выполняемых пополам, одновременно получая оба столбца.
  2. Вы можете указать TRUE или FALSE с помощью параметра.

    Таким образом, вам нужно только PreparedStatement: SELECT SUM(MinnvsAt), SUM(AtvsMinn) FROM nfl.minnesota WHERE MinnvsAtP =? ,

    Таким образом, вы можете сократить все это более чем наполовину.

  3. Как отметил @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().

Ещё вопросы

Сообщество Overcoder
Наверх
Меню