使用Java编写通过SODA(Simple Oracle Document Access)在Oracle数据库中使用JSON(而不仅仅是JSON!)。SODA允许您的Java应用程序使用Oracle数据库作为NoSQL文档存储。
首先,要确保有一个Oracle 12.1.0.2实例,并且应用补丁20885778(注:并不是数据库所有版本都适用)。
可以通过My Oracle Support()搜索补丁编号,20885778或直接访问此URL:/rs?type=patch&id=20885778。并确保遵循README.txt文件中指定的所有安装步骤进行安装。
给用户授予SODA_APP权限(注:根据实际情况修改schemaName):
grant SODA_APP to schemaName;
以下通过Java程序演示SODA的几个常用操作:
1.创建新集合
2.将文档插入到集合中
3.通过其自动生成的键检索第一个插入的文档
4.检索匹配查询示例或QBE的文档
importjava.sql.Connection;
importjava.sql.DriverManager;
importoracle.soda.rdbms.OracleRDBMSClient;
importoracle.soda.OracleDatabase;
importoracle.soda.OracleCursor;
importoracle.soda.OracleCollection;
importoracle.soda.OracleDocument;
importoracle.soda.OracleException;
importjava.util.Properties;
importoracle.jdbc.OracleConnection;
public classtestSODA{
public static voidmain(String[]args) {
//设置连接字符串,注意根据实际连接修改
String url="jdbc:oracle:thin:@//hostName:port/serviceName";
Properties props=newProperties();
//设置数据库用户名和密码,注意根据实际连接修改
props.setProperty("user","schemaName");
props.setProperty("password","password");
OracleConnection conn=null;
try{
//获取到Oracle实例的JDBC连接
conn=(OracleConnection) DriverManager.getConnection(url, props);
//启用JDBC隐式语句高速缓存
conn.setImplicitCachingEnabled(true);
conn.setStatementCacheSize(50);
//获取OracleRDBMSClient – SODA的起点
OracleRDBMSClient cl=newOracleRDBMSClient();
//获取数据库
OracleDatabase db=cl.getDatabase(conn);
//创建名为"MyFirstJSONCollection"的集合.
//注意:集合名称区分大小写。
//在RDBMS中创建名称为“MyFirstJSONCollection”的表来存储集合
OracleCollection col=db.admin().createCollection("MyFirstJSONCollection");
//创建几个JSON文档,表示用户和用户有多少个朋友
OracleDocument doc1=
db.createDocumentFromString(
"{ \"name\" : \"Alex\",\"friends\" : \"50\" }");
OracleDocument doc2=
db.createDocumentFromString(
"{ \"name\" : \"Mia\",\"friends\" : \"300\" }");
OracleDocument doc3=
db.createDocumentFromString(
"{ \"name\" : \"Gloria\",\"friends\" : \"399\" }");
//将文档逐个插入到集合中。
//注:SODA还提供了更高效的批量插入
OracleDocument resultDoc1=col.insertAndGet(doc1);
OracleDocument resultDoc2=col.insertAndGet(doc2);
OracleDocument resultDoc3=col.insertAndGet(doc3);
//使用其自动生成的唯一ID(即密钥)检索第一个文档
System.out.println ("*通过唯一KEY检索第一个文档*\n");
OracleDocument fetchedDoc=col.find().key(resultDoc1.getKey()).getOne();
System.out.println (fetchedDoc.getContentAsString());
//检索代表至少有300位朋友的用户的文档。使用以下查询示例:{friends:{$ gte:300}}。
System.out.println ("\n*检索代表至少有300位朋友的用户的文档*\n");
OracleDocument f=db.createDocumentFromString(
"{ \"friends\" : { \"$gte\": 300 }}");
OracleCursor c=null;
try{
//获取游标
c=col.find().filter(f).getCursor();
while(c.hasNext()) {
//获取下一个文档
fetchedDoc=c.next();
System.out.println (fetchedDoc.getContentAsString());
}
}
finally{
//必须关闭光标释放资源
if(c!=null) {
c.close();
}
}
//删除集合
if(args.length>0&&args[0].equals("drop")) {
col.admin().drop();
System.out.println ("\n*集合被删除*");
}
}
catch(Exception e) {
e.printStackTrace();
}
finally{
if(conn!=null) {
try{
conn.close();
}
catch(Exception e) {
}
}
}
}
}
注意修改程序开头的“url”字符串。此外,在程序开头设置的“用户”和“密码”属性需要根据实际情况修改。
此外,编译运行此程序还需要以下jar包:
1.Oracle数据库12.1.0.2附带的ojdbc6.jar。从这里下载:
。
2.javax.json-1.0.4.jar。这是JSR353实现,从这里下载:
。
3.orajsoda-version.jar。SODA jar,在这里下载:
。
编译并运行testSODA.java,确保必要的jar在类路径中。执行以下操作:
javac-classpath "orajsoda.jar" testSODA.java
java-classpath "orajsoda-version.jar:ojdbc6.jar:javax.json-1.0.4.jar:."testSODA
您应该看到以下输出:
*通过唯一KEY检索第一个文档*
{"name" : "Alex", "friends" : "50" }
*检索代表至少有300位朋友的用户的文档*
{"name" : "Mia", "friends" : "300" }
{"name" : "Gloria", "friends" : "399" }
此示例使用了集合检索文档的两种方法:使用唯一KEY键或使用QBE。在上面的代码中查找所有至少有300个朋友的用户使用了以下QBE:
{"friends": {"$gte" : 300}}
如你所见,QBE是一个JSON格式字符串,其结构类似于它试图匹配的JSON文档。各种操作符可以出现在QBE内部。示例中,$ gte运算符用于查找“friends”字段设置为大于或等于300的所有文档。
要检出支持此集合的表,可以使用SQLPlus或其他类似工具连接到上述示例中相关用户下,并执行:
SQL>desc "MyFirstJSONCollection"
Name Null? Type
------------------------------------------------- ----------------------------
ID NOTNULL VARCHAR2(255)
CREATED_ON NOT NULL TIMESTAMP(6)
LAST_MODIFIED NOT NULLTIMESTAMP(6)
VERSION NOT NULLVARCHAR2(255)
JSON_DOCUMENT BLOB
正如您所看到的,已经创建了一个包含以下列的表:
ID Stores the auto-generatedkey
JSON_DOCUMENT Stores the document content
CREATED_ON Stores the auto-generated created-ontimestamp
LAST_MODIFIED Stores the auto-generated last-modifiedtimestamp
VERSION Stores the auto-generateddocument version
此表模式使用的是默认集合配置,但SODA集合是高度可配置的。例如,时间戳和版本列是可选的,有许多可能的方法来生成ID或版本等。
要删除集合,删除基础表并清理数据库中持久保存的元数据,请再次运行示例,但这次在最后的参数中使用“drop”参数:
java-classpath "orajsoda.jar:ojdbc6-12.1.0.2.0.jar:javax.json-1.0.4.jar:."testSODA drop
现在的输出与前面的输出不同,因为将再次插入相同的三个文档。但是,最后,集合将被删除,并删除基础表。
注意:不要从SQL中删除集合表。集合具有存储在Oracle RDBMS中的元数据,因此必须使用drop()方法正确删除。参见代码中的:col.admin().drop()。