• 博客访问: 603102
  • 博文数量: 136
  • 用 户 组: 普通用户
  • 注册时间: 2013-12-07 18:53
  • 认证徽章:
个人简介

Dylan, Oracle ACE-A, 山东Oracle用户组(http://www.sdoug.com)创始人, 从事Oracle开发工作超过7年, 已获得OCM认证并评为Oracle用户组年轻专家(Young Expert Program)。

文章分类

全部博文(136)

文章存档

2016年(16)

2015年(53)

2014年(40)

2013年(27)

分类: Oracle

2016-12-09 23:35:30

使用Java编写通过SODASimple Oracle Document Access)在Oracle数据库中使用JSON(而不仅仅是JSON!) SODA允许您的Java应用程序使用Oracle数据库作为NoSQL文档存储。

首先,要确保有一个Oracle 12.1.0.2实例,并且应用补丁20885778(注:并不是数据库所有版本都适用)。

可以通过My Oracle Supporthttps://support.oracle.com)搜索补丁编号,20885778或直接访问此URLhttps://support.oracle.com/rs?type=patch&id=20885778。并确保遵循README.txt文件中指定的所有安装步骤进行安装。

给用户授予SODA_APP权限(注:根据实际情况修改schemaName):

grant  SODA_APP  to  schemaName;

以下通Java程序演示SODA的几个常用操作:

1.创建新集合
2.将文档插入到集合中
3.通其自生成的键检索第一个插入的文档
4.检索匹配查询示例或QBE的文档

import  java.sql.Connection;

import  java.sql.DriverManager;

import  oracle.soda.rdbms.OracleRDBMSClient;

import  oracle.soda.OracleDatabase;

import  oracle.soda.OracleCursor;

import  oracle.soda.OracleCollection;

import  oracle.soda.OracleDocument;

import  oracle.soda.OracleException;

import  java.util.Properties;

import  oracle.jdbc.OracleConnection;

 

public  class  testSODA {

  public  static  void  main(String[] args) {

    // 设置连接字符串,注意根据实际连接修改

    String url ="jdbc:oracle:thin:@//hostName:port/serviceName";

    Properties props =new Properties();

    // 设置数据库用户名和密码,注意根据实际连接修改

    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 =new OracleRDBMSClient();

        // 获取数据库

        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{$ gte300}}

        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。从这里下载:

http://www.oracle.com/technetwork/database/features/jdbc/default-2280470.html

2.javax.json-1.0.4.jar。这是JSR353实现,从这里下载:

http://search.maven.org/remotecontent?filepath=org/glassfish/javax.json/1.0.4/javax.json-1.0.4.jar

3.orajsoda-version.jarSODA jar在这里下载:

https://github.com/oracle/soda-for-java/releases

编译并运行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()

阅读(137) | 评论(0) | 转发(0) |
0

上一篇:Oracle 12c中的SQL/JSON函数

下一篇:没有了

给主人留下些什么吧!~~
评论热议
请登录后评论。

登录 注册