сокращая код JDBC - PullRequest
0 голосов
/ 24 мая 2018

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

0 голосов
/ 25 мая 2018
  1. Фактическое число запросов, выполненных в два раза, можно сократить, извлекая оба столбца одновременно.
  2. Вы можете указать значение ИСТИНА или ЛОЖЬ с помощью параметра.

    Таким образом, единственное, что вам нужно 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().

0 голосов
/ 24 мая 2018

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...