【问题标题】:Convert all the mysql table data into JSON in spring boot在spring boot中将所有mysql表数据转换成JSON
【发布时间】:2020-03-05 10:21:34
【问题描述】:

我只想指定表名,它会自动将其所有数据转换为 JSON 格式

我已尝试使用 JDBC 将表中的数据存储到 JSON 中的代码。


public class DataBaseToJson {
    public static ResultSet RetrieveData() throws Exception {
        DriverManager.registerDriver(new com.mysql.jdbc.Driver());
        String mysqlUrl = "jdbc:mysql://localhost/studentsDB?autoReconnect=true&useSSL=false";
        Connection con = DriverManager.getConnection(mysqlUrl, "root", "root");
        Statement statement = con.createStatement();
        ResultSet resultSet = statement.executeQuery("Select * from students");
        return resultSet;
    }

    public static void main(String args[]) throws Exception {
        JSONObject jsonObject = new JSONObject();
        JSONArray array = new JSONArray();
        ResultSet resultSet = RetrieveData();
        while (resultSet.next()) {
            JSONObject record = new JSONObject();
            record.put("students ID", resultSet.getInt("students_id"));
            record.put("students Name", resultSet.getString("students_name"));
            array.add(record);
        }
        jsonObject.put("students Information", array);
        try {
            FileWriter file = new FileWriter("output.json");
            file.write(jsonObject.toJSONString());
            file.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

我不想在文件中指定文件。我想让它通用,这样我们就可以只输入表名,它会自动转换该表中的所有数据并保存到 JSON 文件中。

【问题讨论】:

    标签: mysql json spring


    【解决方案1】:

    您可以使用INFORMATION_SCHEMA 为给定表选择列列表:

    SELECT COLUMN_NAME FROM `INFORMATION_SCHEMA`.`COLUMNS` WHERE TABLE_NAME LIKE 'table_name'
    

    现在,将上述查询中的ResultSet 转换为列名的List<String>。之后我们可以使用它来将最终的ResultSet 转换为JSON Object

    伪代码:

    Connection connection = createConnection();
    List<String> columns = loadColumns(connection, tableName);
    ResultSet dataSet = loadData(connection, tableName);
    while (dataSet.next()) {
        JSONObject record = new JSONObject();
        for (String column : columns) {
            record.put(column, dataSet.getObject(column));
        }
        array.add(record);
    }
    // save array to file
    

    ResultSet 很大时,我们应该考虑使用JacksonGson 库中的Streaming API 以避免“内存不足”问题。

    另见:

    更新

    看起来我们不需要使用额外的SQL 查询来选择列名,因为ResultSetgetMetaData 方法:

    检索此 ResultSet 对象的数量、类型和属性 列。

    另见:

    【讨论】:

    • Ziober 这在 foreach 循环 处显示“线程“main”java.lang.NullPointerException 中的异常”。
    • 根据您的 SQL 查询,我们能够获取列的名称,但不能获取这些列中的数据。请指定我们可以自动获取列和数据的方式,而不是简单地将这些数据存储为 JSON
    • @RaoWaqasAkram,这是一个好的开始。您需要执行两个SQL 查询。第一个查询是我在答案中显示的 - 加载给定表的所有列。将结果集转换为列名列表。之后执行第二个 SQL 查询,它加载真实数据 - Select * from table_name。现在您可以使用列名将ResultSet 转换为JSON Object
    • 先生,您能否根据要求更新您的答案。我非常感谢你。
    • @RaoWaqasAkram,我在文档中注意到我们已经使用getMetaData 方法获得了有关列的所有必需信息。您可以通过使用它来改进您的解决方案。我们可以避免对 DB 的一次额外调用。在小型应用程序中这样做并不是什么大错误,但是如果您需要经常调用此代码,则可以使用此方法。很高兴看到您找到了实现这一点的方法。
    【解决方案2】:
    
        public static void main(String args[]) throws Exception {
            String tableName = "books";
            Connection connection = createConnection();
            JSONArray array = new JSONArray();
            JSONObject jsonObject = new JSONObject();
            List<String> columns = loadColumns(connection, tableName);
            ResultSet dataSet = loadData(connection, tableName);
            while (dataSet.next()) {
                JSONObject record = new JSONObject();
                for (String column : columns) {
                    record.put(column, dataSet.getObject(column));
                }
                array.add(record);
            }
            jsonObject.put(tableName, array);
            try {
                FileWriter file = new FileWriter("output.json");
                file.write(jsonObject.toJSONString());
                file.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
        private static Connection createConnection() throws SQLException {
            DriverManager.registerDriver(new com.mysql.jdbc.Driver());
            String mysqlUrl = "jdbc:mysql://localhost/library?autoReconnect=true&useSSL=false";
            Connection connection = DriverManager.getConnection(mysqlUrl, "root", "root");
            return connection;
        }
    
    
        public static List<String> loadColumns(Connection connection, String tableName) throws SQLException {
            Statement statement = connection.createStatement();
            ResultSet resultSet = statement.executeQuery("SELECT COLUMN_NAME FROM `INFORMATION_SCHEMA`.`COLUMNS` WHERE TABLE_NAME LIKE '"+tableName+"'");
            List<String> columnsName = new ArrayList<String>();
            while(resultSet.next()) {
                columnsName.add(resultSet.getString("COLUMN_NAME"));
            }
            return columnsName;
        }
    
        public static ResultSet loadData(Connection connection, String tableName) throws SQLException {
            Statement statement = connection.createStatement();
            ResultSet resultSet = statement.executeQuery("Select * from "+tableName+"");
            return resultSet;
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-09-10
      • 2020-05-14
      • 2020-03-10
      • 2019-04-19
      • 2019-10-13
      • 2020-10-21
      • 1970-01-01
      • 2014-09-04
      相关资源
      最近更新 更多