使用jooq / postgresql从java中提取键/值对 - java

时间:2016-09-26 15:08:23

标签: java json postgresql jooq

我在PostgreSQL数据库列中有以下形式的json数据:

myData [{"key1": "value1", "key2": "value2"}, {"key1": "value1", "key2": "value2"} ]

其中myData是包含两个对象的数组。 我阅读以下链接只用java来解决我的问题,但我的问题略有不同。 Converting JSON to JavaParsing JSON Object in Java

  1. 提取数据库中的键/值对(postgresql)会更有效吗?还是应该在java中获取整个字符串并使用java库?是否可以在数据库中进行?

  2. 如果在数据库中执行此操作是一个选项,JOOQ是否为此提供任何支持?

  3. 如果在Java中解析是更好的选择,上面链接中给出的两个库中哪一个更稳定/更有效? org.json或Gson

2 个答案:

答案 0 :(得分:3)

这里有几个有趣的问题。

1。查询数据库中的逻辑与Java中的查询逻辑

取决于。首先,在PostgreSQL中,jsonb具有更好的索引支持。我不是这个主题的专家,但我很确定一旦你对1-2事情进行基准测试你会得出这个结论。这是一篇有趣的博客文章,比较了PostgreSQL中性能的不同数据类型:

http://www.databasesoup.com/2015/01/tag-all-things.html

...这让我想到了是否将谓词放入SQL查询中,或者稍后在Java中执行它们。一般来说:把它放在数据库中。如果您的谓词非常有选择性,那么您可以:

  1. 避免数据库中的大量不必要的I / O
  2. 使用数据库
  3. 避免大量不必要的I / O

    这两者都会导致查询延迟大大降低。如果你的谓词不是很有选择性,那么除了极端负载之外,这几乎不是问题。但是,如果您的系统处于极端负载且谓词 具有选择性,那么如果在数据库中运行谓词,您仍将大大减少该负载。

    2。 jOOQ支持JSON谓词

    jOOQ目前不提供对JSON(B)谓词的任何开箱即用支持,但您可以使用jOOQ的纯SQL支持轻松构建实用程序:

    http://www.jooq.org/doc/latest/manual/sql-building/plain-sql

    实质上,只需写下:

    public static Condition someJsonPredicate(Field<?> someJsonColumn, String someValue) {
        return DSL.condition("some_json_predicate({0}, {1})", 
            someJsonColumn, DSL.val(someValue));
    }
    

    3。 org.json vs Gson

    我不会在这里回答这一部分,因为你的基准可能与我的不同。

答案 1 :(得分:0)

从 Java PostgreSQL 数据库中获取 JSON 数据的解决方案。

  • this article 的摘要。
  • 我发现这个答案的最后一部分非常强大且易于阅读。易于将其包装在方法中
  • 代码用于提供视觉提示,而不是完整的示例。
  • 此答案不使用 jooq。

PostgreSQL JSON(以文本形式存储)和 JSONB(以二进制形式存储)的比较

<头>
JSON JSONB
以文本格式存储数据 以分解的二进制格式存储数据
输入很快,因为不需要转换 输入速度稍慢,因为存在与二进制转换相关的开销
处理函数必须在每次执行时重新解析数据 无需重新解析,显着加快数据处理
输入中的所有空格和换行符都保持原样 多余的空格和换行符被去除
不支持索引 支持索引
保留重复键,处理函数只考虑最后一个值 输入时清除重复键,只存储最后一个值
键的顺序被保留 不保留订单
<块引用>

数据库结构

my_table
   id = PK
   json_column = JSON or BYTEA

json_column 的数据示例

    {"customer_name": "John", "items": { "description": "milk", "quantity": 4 } }
    {"customer_name": "Susan", "items": { "description": "bread", "quantity": 2 } }
<块引用>

JAVA 解析 json (bof bof...)

String sql = "select json_column from my_table";
Statement stmt = conn.createStatement(...);
ResultSet rs = stmt.executeQuery(sql);
 
while(rs.next()) {
   // Not really true as data are store in binary, not nice to parse it in string here...
   JSONObject json = new JSONObject(rs.getString(1));
   JSONObject json2 = (JSONObject)json.get("items");
   System.out.println(json.get("customer_name"));
   System.out.println(json2.get("quantity"));
}
<块引用>

PostgreSQL(喜欢这部分!

select json_column->'customer_name' from my_table
select json_column->'items'->'quantity' from my_table
<块引用>

两者(非常好的解决方案)

sql = "select json_column->'items'->'quantity' from my_table";
ps = conn.prepareStatement(sql);
rs = ps.executeQuery();
while(rs.next()) {
   rs.getInt(1);
   ...
}