如何使用JDBC在mysql中读取JSON数据类型

时间:2017-04-07 17:12:06

标签: java jdbc

Mysql 5.7引入了JSON数据类型,它提供了大量的查询功能。

由于没有兼容的结果集功能,我使用的方法和内容将检索存储在此数据类型中的数据。

3 个答案:

答案 0 :(得分:5)

应该是rs.getString,因为getStringVARCHARTEXT一起使用,我们可以将JSon视为String类型,所以您可以使用getString获得结果。

简单示例

使用MySQL 5.7和PostgreSQL 9.4进行仔细检查:

MySQL 5.7 SQL

create database db_test;
create table table_test(json JSON);
INSERT INTO table_test VALUES('{"key1": "value1", "key2": "value2"}');

<强> CODE

public static void checkJSon() {
    try {
        Class.forName(DRIVER);
        Connection connection = DriverManager.getConnection(DB_URL, DB_username, DB_password);
        String q = "SELECT * FROM table_test";
        PreparedStatement preparedStatement = connection.prepareStatement(q);
        preparedStatement.execute();
        ResultSet rs = preparedStatement.executeQuery();
        while (rs.next()) {
            System.out.println(rs.getString("json"));
        }

    } catch (ClassNotFoundException | SQLException e) {
        e.printStackTrace();
    }
}

它打印给我:

{"key1": "value1", "key2": "value2"}

答案 1 :(得分:0)

万一有人还在寻找,我尝试使用Mysql 5.7,但是上面建议的方法不能很好地处理非ascii数据(很多亚洲字符等)。它们最终显示为乱码。

解决方案是使用getBinaryStream读取原始字节。该代码如下所示:

public String fromJSON(ResultSet rs, String fieldName){
    InputStream is = rs.getBinaryStream(fieldName);
    BufferedReader br = new BufferedReader(new InputStreamReader(is));
    String content = br.lines().reduce("", String::concat);
    br.close();
    return content;
}

以上内容可以封装在来自JSON的函数中,并得到广泛使用。 例如

PreparedStatement st = getStatement("select json from x;");
ResultSet rs = st.executeQuery();
while (rs.next()) {
    return fromJSON(rs, "json");
}

答案 2 :(得分:0)

如果对JDBC的要求不是很高,则最近的jOOQ版本实现了一种现成的方式,可以使用流行的JSON映射库Jackson将SQL JSON值映射到任意Java类型。或gson(可以在您的类路径中找到)。然后,您可以编写:

List<MyClass> list =
ctx.select(TABLE.ID, TABLE.JSON_COLUMN)
   .from(TABLE)
   .where(...)
   .fetchInto(MyClass.class);

例如,

public class MyClass {
    public int id;
    public MyOtherClass jsonColumn;
}

public class MyOtherClass {
    public String something;
    public List<String> list;
}

假设您的JSON_COLUMN包含以下格式的数据:

{
  "something": "x",
  "list": [ "a", "b", "c" ]
}

这也适用于所有本机支持的SQL / JSON函数to create such JSON documents on the fly

(免责声明:我为jOOQ背后的公司工作)