强烈推荐 | 使用Oracle 19C 存储JSON格式数据
JSON就是一种数据格式;比如有一个txt文本文件,用来存放一个班级的成绩;规定此文本文件里的学生成绩的格式,是第一行,就是一行列头(姓名 班级 年级 科目 成绩),接下来,每一行就是一个学生的成绩。
这个文本文件内的信息存放格式,其实就是一种数据格式。
学生 班级 年级 科目 成绩
张三 一班 大一 高数 90
李四 二班 大一 高数 80
对应到JSON,它其实也是代表了一种数据格式,所谓数据格式,就是数据组织的形式。
比如说,刚才所说的学生成绩,用JSON格式来表示的话,如下:[{“学生”:“张三”, “班级”:“一班”, “年级”:“大一”, “科目”:“高数”, “成绩”:90}, {“学生”:“李四”, “班级”:“二班”, “年级”:“大一”, “科目”:“高数”, “成绩”:80}]
其实,JSON,很简单,一点都不复杂,就是对同样一批数据的,不同的一种数据表示的形式。
JSON的数据语法,其实很简单:
如包含多个数据实体的话,比如说多个学生成绩,需使用数组的表现形式,就是[]。对于单个数据实体,比如一个学生的成绩,那么使用一个{}来封装数据,对于数据实体中的每个字段以及对应的值,使用key:value的方式来表示,多个key-value对之间用逗号分隔;多个{}代表的数据实体之间,用逗号分隔。
Oracle方面:
Multi-model(多模)数据库,指的是在一个数据库中,可以同时支持多种存储引擎或存储类型,为应用提供各种数据服务,如下图所示:
Oracle数据库对于这几种存储格式都能够进行很好的支持,在Oracle 19c中,可使用JSON数据格式。
JSON数据格式在Oracle 12.1.0.2中就开始支持了,也就是说在Oracle数据库中,你可以存储、查询JSON数据格式,像访问普通的表一样,进行增删改操作、创建索引、创建虚拟列等,甚至可以把它放在内存数据库中(In-Memory)提高性能。
虽然JSON数据格式在Oracle 12.1.0.2中就开始支持,但在Oracle 19c以前,如果要更新JSON文档的某部分,你必须检索JSON文档,更新内容后要把整个文档替换为修改后的文档。现在,19C可以通过JSON_MERGEPATCH大大简化此过程。
在12c中早已支持对JSON文档创建索引,添加虚拟列、把JSON文档加载到 In-Memory中提高性能等等。
具体请参考手册《JSON Developer’s Guide》,链接如下:
https://docs.oracle.com/en/database/oracle/oracle-database/19/adjsn/
官方举例:
Example 4-1 Using IS JSON in a Check Constraint to Ensure JSON Data is Well-Formed
CREATE TABLE j_purchaseorder
(id VARCHAR2 (32) NOT NULL PRIMARY KEY,
date_loaded TIMESTAMP (6) WITH TIME ZONE,
po_document VARCHAR2 (23767)
CONSTRAINT ensure_json CHECK (po_document IS JSON));
Example 4-2 Inserting JSON Data Into a VARCHAR2 JSON Column
INSERT INTO j_purchaseorder
VALUES (
SYS_GUID(),
to_date('30-DEC-2014'),
'{"PONumber" : 1600,
"Reference" : "ABULL-20140421",
"Requestor" : "Alexis Bull",
"User" : "ABULL",
"CostCenter" : "A50",
"ShippingInstructions" :
{"name" : "Alexis Bull",
"Address" : {"street" : "200 Sporting Green",
"city" : "South San Francisco",
"state" : "CA",
"zipCode" : 99236,
"country" : "United States of America"},
"Phone" : [{"type" : "Office", "number" : "909-555-7307"},
{"type" : "Mobile", "number" : "415-555-1234"}]},
"Special Instructions" : null,
"AllowPartialShipment" : true,
[{"ItemNumber" : 1,
"Part" : {"Description" : "One Magic Christmas",
"UnitPrice" : 19.95,
"UPCCode" : 13131092899},
"Quantity" : 9.0},
{"ItemNumber" : 2,
"Part" : {"Description" : "Lethal Weapon",
"UnitPrice" : 19.95,
"UPCCode" : 85391628927},
"Quantity" : 5.0}]}');
INSERT INTO j_purchaseorder
VALUES (
SYS_GUID(),
to_date('30-DEC-2014'),
'{"PONumber" : 672,
"Reference" : "SBELL-20141017",
"Requestor" : "Sarah Bell",
"User" : "SBELL",
"CostCenter" : "A50",
"ShippingInstructions" : {"name" : "Sarah Bell",
"Address" : {"street" : "200 Sporting Green",
"city" : "South San Francisco",
"state" : "CA",
"zipCode" : 99236,
"country" : "United States of America"},
"Phone" : "983-555-6509"},
"Special Instructions" : "Courier",
"LineItems" :
[{"ItemNumber" : 1,
"Part" : {"Description" : "Making the Grade",
"UnitPrice" : 20,
"UPCCode" : 27616867759},
"Quantity" : 8.0},
{"ItemNumber" : 2,
"Part" : {"Description" : "Nixon",
"UnitPrice" : 19.95,
"UPCCode" : 717951002396},
"Quantity" : 5},
{"ItemNumber" : 3,
"Part" : {"Description" : "Eric Clapton: Best Of 1981-1999",
"UnitPrice" : 19.95,
"UPCCode" : 75993851120},
"Quantity" : 5.0}]}');
Oracle 19C 如何加载外部JSON数据?
具体详看如下链接:
https://docs.oracle.com/en/database/oracle/oracle-database/19/adjsn/loading-external-json-data.html#GUID-52EFC452-5E65-4148-8070-1FA588A6E697
Example 12-3 Creating a Table With a BLOB JSON Column
Table j_purchaseorder has primary key id and JSON column po_document, which is stored using data type BLOB. The LOB cache option is turned on for that column.
DROP TABLE j_purchaseorder;
CREATE TABLE j_purchaseorder
(id VARCHAR2 (32) NOT NULL PRIMARY KEY,
date_loaded TIMESTAMP (6) WITH TIME ZONE,
po_document BLOB
CONSTRAINT ensure_json CHECK (po_document IS JSON))
LOB (po_document) STORE AS (CACHE);
Example 12-4 Copying JSON Data From an External Table To a Database Table
INSERT INTO j_purchaseorder (id, date_loaded, po_document)
SELECT SYS_GUID(), SYSTIMESTAMP, json_document FROM json_dump_file_contents
WHERE json_document IS JSON;
看到这里就明白了,要向更好的使用Oracle的存储格式,强烈建议使用19C。
在19c中,可以创建包含JSON_TABLE的物化视图,增强了查询重写的功能。当JSON文档中包含数组时,特别有用,物化视图可以为JSON数组提供快速访问性能。
开发方面
阿里的fastjson工具包。使用这个工具包,可以方便的将字符串类型的JSON数据,转换为一个JSONObject对象,然后通过其中的getX()方法,获取指定的字段的值。
创建fastjson测试类
在包`com.erik.sparkproject.test下新建fastjson测试类FastjsonTest.java
package com.erik.sparkproject.test;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
/**
* fastjson测试类
* @author Erik
*
*/
public class FastjsonTest {
public static void main(String[] args) {
String json = "[{'学生':'张三','班级':'一班','年级':'大一','科目':'高数','成绩':90},"
+ "{'学生':'李四','班级':'二班','年级':'大一','科目':'高数','成绩':80}]";
JSONArray jsonArray = JSONArray.parseArray(json);
JSONObject jsonObject = jsonArray.getJSONObject(0);
System.out.println(jsonObject.getString("学生"));
}
}
【参考】
https://www.modb.pro/db/14097
【参考】
https://blog.csdn.net/u012318074/article/details/60607077
【参考】
https://docs.oracle.com/en/database/oracle/oracle-database/19/adjsn/
【参考】
https://docs.oracle.com/en/database/oracle/oracle-database/19/adjsn/loading-external-json-data.html#GUID-52EFC452-5E65-4148-8070-1FA588A6E697
文章结束。
以下是个人微信公众号,欢迎关注:
更多推荐
所有评论(0)