最新的DB2程序临时修订(PTF)组(用于7.1的SF99701和用于7.2的SF99702)在与IBM i 7.1的Technology Refresh 10和IBM i 7.2的Technology Refresh 2相同的日期发布,其中包括JSON Store Technology Preview。 这项新功能允许使用DB2 for i数据库表存储和检索JSON文档。 此功能增加了JSON支持,该支持与为Linux,UNIX和Windows的DB2和针对z / OS的DB2添加的支持相当。 IBM i上的JSON支持包括对DB2 JSON命令行处理器和DB2 JSON Java API的支持。 本文的目的是描述IBM i上的JSON功能,并向读者介绍其他包含更多详细信息的IBMdeveloperWorks®文章。 JSON Store技术功能仅由developerWorks文章描述。
JSON格式
正如DB2 JSON功能(第1部分:DB2 JSON简介)中所述,JSON是一种轻量级的格式,用于交换信息。 JSON文档很容易由Web浏览器上运行JavaScript程序创建和使用。 由于其简单的结构,JSON已成为Web应用程序信息交换的常用方法。 它之所以受欢迎是因为它比XML的替代方法要轻得多。 第1部分文章中介绍了有关JSON及其优点的更多详细信息。
有三种方法可以在IBM i上使用JSON。
- db2nosql-DB2 JSON命令行处理器
- DB2 JSON Java API
- SYSTOOLS.BSON2JSON-检索存储在DB2 for i表中的JSON文档的功能。
在DB2 for i中存储JSON文档可提供出色的可靠性和可用性。 DB2 JSON存储不包括查询引擎索引支持,也不支持使用SQL语句分解和发布JSON。
db2nosql:DB2 JSON命令行处理器
DB2 JSON命令行处理器包含在集成文件系统中的IBM i中。 包含处理器的完整IFS路径名是/ QIBM / ProdData / OS / SQLLIB / bin / db2nosql。 在IBM i上,从IBM i QSHELL环境中使用DB2 JSON命令行处理器。 要进入QSHELL环境,请运行“ Start QSHELL (STRQSH)
命令。
通过从/ QIBM / ProdData / OS / SQLLIB / bin目录下载以下文件,也可以在客户机系统上使用DB2 JSON命令行处理器。
- db2nosql
- db2nosql.bat
- jline-0.9.93.jar
- js.jar
- mongo-2.8.0.jar
- nosqljson.jar
- servlet-api.jar
您还需要获取jt400.jar文件的版本,该文件可以在/ QIBM / ProdData / os400 / jt400 / lib / java6目录中找到。 将这些文件放在客户机上的相同目录中,然后运行db2nosql(在UNIX系统上)或db2nosql.bat(在Windows系统上)以启动命令行处理器。 设置Microsoft®Windows®系统(安装了FTP)的一种简单方法是启动Windows命令提示符并运行以下命令,其中MYIBMI是IBM i分区的名称。
清单1. Windows客户端设置
C:\>mkdir nosql
C:\>cd nosql
C:\nosql>ftp MYIBMI
ftp> bin
ftp> cd /QIBM/ProdData/OS/SQLLIB/bin
ftp> mget *
ftp> cd /QIBM/ProdData/OS400/jt400/lib/java6
ftp> get jt400.jar
ftp> quit
在IBM i上启动db2nosql
要在IBM i上使用命令行处理器,请使用STRQSH启动QSHELL并运行/ QIBM / ProdData / OS / SQLLIB / bin / db2nosql。 在IBM i上使用时,命令行处理器使用本机JDBC驱动程序使用当前用户的凭证连接到当前分区。 如果需要使用其他用户的凭据进行连接,则可以使用db2nosql
的–user
和–password
参数指定这些凭据,如以下示例所示。
清单2.将db2nosql与其他用户的凭证一起使用
$ /QIBM/ProdData/OS/SQLLIB/bin/db2nosql -user myuserid-password mypassword
JSON Command Shell Setup and Launcher.
Type db2nosql -help to see options
…
IBM DB2 NoSQL JSON API 1.1.0.0 build 1.4.7
Licensed Materials - Property of IBM
(c) Copyright IBM Corp. 2013,2015 All Rights Reserved.
nosql>Type your JSON query and hit <ENTER>
nosql>Type help() or help for usage information. All commands are case sensitive.
在其他平台上启动db2nosql
可以在客户机系统上使用db2nosql
命令来与DB2 for i中的JSON数据交互工作。 使用-hostname
或-url
参数指定目标IBM i分区,其中URL是JDBC样式的URL。 对于IBM i,JDBC URL必须采用jdbc:as400:partitionName的形式。 以下示例使用这些选项,分区名称为MYIBMI
。
清单3.使用db2nosql的主机名和url参数
C:\nosql>db2nosql -hostname MYIBMI -user json –password PASSWORD
JSON Command Shell Setup and Launcher.
db2nosql.bat is launched with several options.
...
> db2nosql -url jdbc:as400:MYIBMI -user json –password PASSWORD
JSON Command Shell Setup and Launcher.
Type db2nosql -help to see options
...
注意 : db2nosql
要求在命令路径上提供Java版本。 使用的Java版本至少应为Java 6。
建立
在IBM i分区上使用JSON之前,必须执行一次性设置。 这是通过使用-setup enable
选项运行db2nosql来完成的,如以下示例所示。 每个IBM i分区仅需要执行一次此设置。
清单4.使用db2nosql启用JSON支持
$ /QIBM/ProdData/OS/SQLLIB/bin/db2nosql -setup enable
JSON Command Shell Setup and Launcher.
Type db2nosql -help to see options
IBM DB2 NoSQL JSON API 1.1.0.0 build 1.4.7
Licensed Materials - Property of IBM
(c) Copyright IBM Corp. 2013,2015 All Rights Reserved.
Executing SQL...
CDJSN1209I Database artifacts created successfully.
在IBM i上,JSON文档是使用DB2 for i表的二进制大对象(BLOB)列存储的。 如果使用承诺控制,则IBM i要求在使用这些表时激活日记功能。 为了确保满足此条件,建议在SQL模式中创建JSON集合,这会自动激活模式中表的日记功能。 使用“ CREATE SCHEMA” SQL语句创建一个SQL模式。 在IBM i库中使用JSON集合而不进行日志记录会导致SQL7008“文件对操作无效”,这是使用承诺控制来操作这些表时发生的错误。
使用db2nosql
有关使用db2nosql的详细信息,请参阅DB2 JSON功能,第2部分:使用命令行处理器 developerWorks文章。 在当前的文章中,我们提供了在IBM i上使用db2nosql可以实现的示例。
任何JSON 集合都映射到单个DB2 for i表。 该表位于JSON使用的任何模式中,并且专用于仅包含JSON文档。 要指定当前模式,请use
db2nosql use
命令。 例如,以下命令使db2nosql使用JSONLIB模式。
nosql>use JSONLIB
CDJSN1214I Switched to schema: "JSONLIB"
如上所述,该架构应该是使用CREATE SCHEMA
SQL语句创建的架构。 如果尚未创建模式,则可以使用db.sqlUpdate()
命令运行CREATE SCHEMA
SQL语句。 这是一个使用db2nosql创建JSONLIB模式然后使用它的示例。
清单5.创建和使用模式
nosql>db.sqlUpdate("CREATE SCHEMA JSONLIB")
0
nosql>use JSONLIB
CDJSN1214I Switched to schema: "JSONLIB"
nosql>
您可以使用db
命令查看有关当前数据库的信息。
nosql>db
Database: jdbc:db2:localhost Schema: JSONLIB
为了存储JSON文档,必须存在一个JSON集合以包含这些文档。 JSON集合使用DB2 for i表存储JSON文档。 该表的唯一目的是容纳db2nosql或DB2 Java JSON API访问的JSON文档。 包含JSON集合的表包含名为ID和DATA的两列。 ID列包含插入表中的JSON文档的唯一标识符。 DATA列是一个BLOB列,其中包含JSON文档[以二进制JSON(BSON)格式表示]。 JSON文档的最大大小约为16兆字节(MB)。
创建集合的一种方法是使用db.createCollection()
命令。 在JSON中,JSON集合名称区分大小写。 如果在创建集合时使用小写字母,那么将在IBM i上使用分隔名称创建表。 如果您不希望在模式中使用分隔表名,则应使用大写名称创建JSON集合。 以下命令创建JSON集合: JSONA
和jsonb
。
清单6.创建JSON集合
nosql>db.createCollection("JSONA")
CDJSN1006I Collection: "db.JSONLIB."JSONA"" created. Use "JSONA".
nosql>db.createCollection("jsonb")
CDJSN1006I Collection: "db.JSONLIB."jsonb"" created. Use "jsonb".
创建JSONA
和jsonb
集合之后,我们可以检查IBM i上JSONLIB库的内容。 我们看到使用小写或大小写混合的JSON集合名称的影响,因为jsonb
创建为带有分隔名称的FILE对象。
清单7. JSON文件对象
Work with Objects
Opt Object Type Library Attribute Text
"jsonb" *FILE JSONLIB PF
JSONA *FILE JSONLIB PF
因为DB2 for i表名称限制为128个字符,所以如果JSON集合名称仅由大写字母组成,则限制为128个字符,如果需要定界,则限制为126个字符。
创建JSON集合后,可以使用db.
插入文档db.
<collectionName>
.insert(
<document>
)
命令。 如果该集合不存在,则insert
命令将隐式创建该集合。 由于这种行为,没有必要使用前面描述的createCollection
命令。 这是将简单的JSON文档插入JSONA集合的示例。
清单8.插入一个JSON文档
nosql>db.JSONA.insert({name:"George",age:20,increase:0.12})
CDJSN1000I Command successfully completed.
由于JSON文档已转换为二进制格式,因此将对其进行检查以确保它是有效数据。 尝试插入无效的JSON文档会导致出现错误,如下例所示。
清单9.尝试插入无效的JSON
nosql>db.JSON.insert({notvalid})
CDJSN0114E Invalid command syntax
Error details shown below, but may not be the source of the problem.
db.JSON.insert({notvalid})
^
Error details: missing : after property id
Column number: 25
将文档插入JSON集合后,您可以使用db.
检索它们db.
<collectionName>
.find()
命令。 调用不带任何参数的find
命令将从集合中检索所有文档,如以下示例所示。
清单10.检索所有JSON文档
nosql>db.JSONA.find()
nosql>Row 1:
nosql> {
"_id":{"$oid":"5510844569849c86c5832917"},
"name":"George",
"age":20,
"increase":0.12
}
nosql>CDJSN1206I "1" row(s) returned in "61" milliseconds.
find
命令也可以与搜索选项一起使用。 有关更多详细信息,请参阅第2部分。 以下是查找先前插入的文档的示例。
清单11.查找名称为George的JSON文档
nosql>db.JSONA.find({name:"George"})
nosql>Row 1:
nosql> {
"_id":{"$oid":"5510844569849c86c5832917"},
"name":"George",
..
nosql>CDJSN1206I "1" row(s) returned in "240" milliseconds.
清单12.查找年龄为20岁的JSON文档
nosql>db.JSONA.find({age:20})
db.JSONA.find({age:20})
nosql>Row 1:
nosql> {
"_id":{"$oid":"5510844569849c86c5832917"},
"name":"George",
"age":20,
"increase":0.12
}
nosql>CDJSN1206I "1" row(s) returned in "42" milliseconds.
第2部分的文章还描述了用于查询,更新,聚合和管理JSON数据的其他选项。 第2部分中介绍的许多功能当前在IBM i上不可用。 当前不支持双向功能和时间旅行查询。 当前不支持使用索引。 同样,在sort()
skip()
操作之后使用任何limit()
或skip()
操作都不会产生预期的结果,因为limit()
和skip()
操作在内部应用于无序数据。
使用JSON Java API
JSON Store Technology Preview还包括一个JSON Java API,该API可通过编程方式与DB2 for i中存储的JSON文档一起使用。 您可以在developerWorks文章DB2 JSON功能,第3部分:使用Java API编写应用程序中找到有关JSON Java API的详细信息。 本文包含一个示例Java程序 ,该程序说明了Java API的某些功能。
Java API可以在上面引用的nosqljson.jar文件的com.ibm.nosql.json.api包中找到。 Java API包括以下主要对象:DB对象,DBCollection对象,DBBasicObject对象和DBCursor对象。
数据库对象
JSON DB对象代表JSON数据库,并且对应于IBM i分区上的SCHEMA。 如以下示例程序所示,可以通过将JDBC连接和SCHEMA名称传递给NoSQLClient.getDB()
方法来获取DB
对象。
清单13.使用JDBC连接获得一个数据库对象
// Obtain a JDBC connection using the JTOpen JDBC driver
String url = "jdbc:as400://"+system;
Connection con = DriverManager.getConnection(url,
userid,
password);
// get a DB object from a JDBC connection
DB db = NoSQLClient.getDB(con, schema)
也可以通过使用JDBC URL,用户ID和密码而不是JDBC连接来获取DB对象。
// Alternatively, you can get a DB using the JDBC url
db = NoSQLClient.getDB(url, userid, password, schema);
DB对象可用于运行SQL语句。 本文的示例程序使用sqlUpdate()
方法运行两个SQL语句。 第一条语句确保SCHEMA存在。 第二条语句删除程序将用于存储JSON文档的表的内容。
db.sqlUpdate("CREATE SCHEMA "+schemaName);
db.sqlUpdate("DELETE FROM "+schemaName+".JSONSAMPLE");
DBCollection对象
DBCollection
对象表示JSON文档的集合。 它是使用getCollection()
方法从数据库对象中获取的。 在以下示例代码中,DB2 for i表JSONSAMPLE是getCollection()
方法的目标。
DBCollection col = db.getCollection("JSONSAMPLE");
当第一个项目插入JSON集合时,将创建用于保存JSON集合的表。 要将项目插入集合,请使用insert()
方法。 以下示例将JSON文档插入到集合中。
清单14.插入一个JSON文档
//
// JSON documents can be inserted directly into the JSON collection.
//
col.insert("{'name':'George','phone':'555-3232'}" );
DBBasicObject对象
一个DBBasicObject
包含一个JSON文档。 它可用于以编程方式构建JSON文档,然后将其插入JSON集合中。 要构建JSON文档,只需创建一个DBBasicObject
对象,然后使用append方法将元素添加到文档中。 以下示例说明了JSON文档的构建并将其插入JSON集合中。
清单15.创建和插入一个DBBasicObject对象
// Create a BasicDBObject to create an object to be inserted
BasicDBObject json = new BasicDBObject();
json.append("name","Harry");
json.append("phone","555-4364");
col.insert (json);
DBCursor对象
DBCursor
对象用于从JSON集合返回JSON文档。 DBCursor
对象由DBCursor
的find()
方法DBCollection
。 可以使用hasNext()
和next()
方法访问DBCursor
对象的元素,如以下示例所示。
清单16.使用DBCursor访问JSON文档
System.out.println("Querying all");
DBCursor cursor = col.find();
while (cursor.hasNext()) {
DBObject obj = cursor.next();
System.out.println("Retrieved: "+obj);
}
您可以使用find()
命令指定要查找的文档。 可以使用JSON值(作为字符串传递)或DBBasicObject
对象传递find()
命令来完成此操作,如以下示例所示。
清单17.查找名称为George的JSON文档
cursor = col.find("{'name':'George'}");
while (cursor.hasNext()) {
DBObject obj = cursor.next();
System.out.println("Retrieved: "+obj);
}
清单18.查找名称为Harry的JSON文档
BasicDBObject queryObject = new BasicDBObject();
queryObject.append("name","Harry");
cursor = col.find(queryObject);
while (cursor.hasNext()) {
DBObject obj = cursor.next();
System.out.println("Retrieved: "+obj);
}
您可以在第3部分中找到有关此对象的更多详细信息。 另外,请参考Javadoc以获得Java API 。 当引用第3部分文章时,本文db2nosql部分中指定的限制也适用-特别是,不能在JSON集合上创建索引。
注意:缺乏索引支持会导致对JSON集合的查询在没有索引优化的情况下运行。
使用SQL查询生成JSON文档
JSON Java API还可以使用SQL查询生成简单的JSON文档。 这些简单的JSON文档不包含JSON数组或嵌套的JSON文档。 为此,只需使用数据库对象的sqlQueryMethod()
即可运行SQL查询。 这将返回一个DBCursor
对象,其中包含代表查询结果行的DBObject
对象。 每个DBObject
对象代表一个JSON文档,其中包含由列名和列值组成的元素。 这是一个使用这种方法的代码示例,该示例从SYSTOOLS.SYSJSON_INDEX表中查询名为SCHEMA和COL的两列。 SYSTOOLS.SYSJSON_INDEX表是DB2 JSON支持人员用来跟踪IBM i上存在的JSON集合(即表)的表。
清单19.使用SQL查询生成JSON文档
cursor = db.sqlQuery("select distinct "+
"COLLECTION_SCHEMA as schema, "+
"COLLECTION as col "+
"from SYSTOOLS.SYSJSON_INDEX "+
"WHERE COLLECTION_SCHEMA='"+schema+"'");
while (cursor.hasNext()) {
DBObject obj = cursor.next();
System.out.println("Retrieved: "+obj);
}
运行此代码示例时,将显示以下输出。 在此,SCHEMA和COL是查询中指定的列名,而JSONLIB和JSONSAMPLE是查询返回的那些列的值。
Retrieved: {"SCHEMA":"JSONLIB","COL":"JSONSAMPLE"}
此功能使Java程序能够根据SQL查询轻松创建JSON文档。
从SQL访问JSON文档
JSON存储技术预览版包括一个用户定义函数(UDF),该函数可用于将JSON文档从其内部二进制形式转换为其字符形式。 SYSTOOLS.BSON2JSON UDF可用于以JSON形式检索BSON文档的内容。 如上所述,JSON文档以BSON格式存储在表示JSON集合的表的DATA列中。 这是使用此UDF查看表中JSON的示例。
清单20.使用BSON2JSON查看JSON文档
>select SYSTOOLS.BSON2JSON(DATA) from JSONLIB.JSONSAMPLE
…
{"name":"George","phone":"555-3232"}
{"name":"Harry","phone":"555-4364"}
由于BSON2JSON UDF会生成CLOB,因此当STRSQL运行查询时,将显示以下输出。
BSON2JSON
*POINTER
*POINTER
******** End of data ********
要解决此问题,请将生成的CLOB强制转换为VARCHAR,如以下示例所示。
清单21.使用CAST查看JSON文档
select CAST(SYSTOOLS.BSON2JSON(DATA) AS VARCHAR(32000)) from JSON.JSONSAMPLE
…
CAST function
{"name":"George","phone":"555-3232"}
{"name":"Harry","phone":"555-4364"}
******** End of data ********
或者更好的是,使用现代化的战略界面运行交互式SQL语句。 从System i Navigator运行SQL脚本。 请参阅IBM i Access页面以获取更多详细信息。 该首选界面将带来更好的用户体验。
您可以在DB2 z / OS版的文档中找到有关SYSTOOLS.BSON2JSON UDF的更多信息。
JSON支持的局限性
提醒一下,IBM i上的JSON当前不支持其他developerWorks文章中提到的以下功能。 不支持任何时间功能。 不支持在JSON文档上创建索引。 developerWorks文章提到了有线侦听器。 有线侦听器不包含在IBM i JSON支持中。
摘要
本文介绍了IBM i的JSON存储技术预览。 使用DB2 JSON命令行启用JSON支持后,将使用DB2 JSON命令行和DB2 JSON Java API从DB2 for i表插入和检索JSON文档。 DB2 JSON Java API也可以用于从SQL查询构造一个简单的JSON文档。 最后,可以在SQL查询中使用SYSTOOLS.BSON2JSON UDF来查看存储在DB2 for i表中的JSON文档。
翻译自: https://www.ibm.com/developerworks/ibmi/library/i-json-store-technology/index.html