Mysql 5.7引入了JSON数据类型,它提供了大量的查询功能。
由于没有兼容的结果集功能,我使用的方法和内容将检索存储在此数据类型中的数据。
答案 0 :(得分:5)
应该是rs.getString
,因为getString
与VARCHAR
,TEXT
一起使用,我们可以将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背后的公司工作)