Перебирать ключи набора результатов - возможно ли это? - PullRequest
0 голосов
/ 23 июня 2018

У меня есть метод, который принимает соединение с базой данных, запрос и параметры и анализирует этот запрос в объект набора результатов. Это здорово, но проблема в том, чтобы получить каждое значение из результирующего набора. Мне нужно написать по одной строке кода для каждой строки данных, которые я извлекаю, чтобы затем сохранить их в контейнере JSON. Есть ли способ сделать это систематически, чтобы я мог автоматически анализировать тип данных и создавать объект JSON на основе ключей, выбранных из результирующего набора, без указания ключей вручную?

public static JSONArray q2rs2j(Connection connection, String query, List<String> params) throws Exception {
    JSONArray tContainer = new JSONArray();
    PreparedStatement pStatement = connection.prepareStatement(query);
    int pit = 1;
    if(params != null) {
        for (String param : params) {
            try {
                double paramAsDouble = Double.parseDouble(param);
                try {
                    int paramAsInt = Integer.parseInt(param);
                    pStatement.setInt(pit, paramAsInt);
                } catch (NumberFormatException e) {
                    pStatement.setDouble(pit, paramAsDouble);
                }
            } catch (NumberFormatException e) {
                pStatement.setString(pit, param);
            }
            pit++;
        }
    }
    ResultSet resultSet = pStatement.executeQuery();
    try {
        while (resultSet.next()) {
            // Iterate through KEYS in the resultSet.next() row
            while (hasKey) {
                // Store key Name and key Value in variables - todo: determine data type via try parsing as Int, double, etc
                String thisKeyName = (nextKeyName);
                String thisKeyValue = (nextKeyValue);
                JSONObject tObject = new JSONObject();
                tObject
                    .put(nextKeyName, nextKeyValue);
            }
            tContainer.put(tObject);
        }
        resultSet.close();
    } catch (Exception e) { e.printStackTrace(); }
    return tContainer;
}

1 Ответ

0 голосов
/ 23 июня 2018

ResultSetMetaData предоставляет типы SQL и имена классов Java.

try (ResultSet resultSet = pStatement.executeQuery()) {
    ResultSetMetaData meta = resultSet.getMetaData();
    int ncols = meta.getColumnCount();
    while (resultSet.next()) {
        JSONObject tObject = new JSONObject();
        for (int colno = 1; colno <= ncols; ++colno) {
            String label = meta.getColumnLabel(colno); // Key
            String name = meta.getColumnName(colno);
            String sqlType = meta.getColumnType();
            String type = meta.getColumnClassName();
            String thisKeyName = label;
            Object thisKeyValue = result.getObject(colno);
            if (sqlType.contains("CHAR")) {
                thisKeyVaule = result.getString(colno);
                tObject.put(nextKeyName, nextKeyValue);
            } else if (sqlType.contains("INT")) {
                thisKeyVaule = result.getInt(colno);
                tObject.put(nextKeyName, nextKeyValue);
            } else {
                tObject.put(nextKeyName, nextKeyValue);
            }
        }
        tContainer.put(tObject);
    }
}

Использование try-with-resources позволяет автоматически закрывать (полезно для Connection, Statement и ResultSet) - даже когда включеноВозврат, разрыв или выброшенное исключение.

...