zoukankan      html  css  js  c++  java
  • DB2 9 利用启示(733 测验)认证指南,第 7 部分: Java 编程(5)

    developerWorks








    用 SQLJ 读取和更新数据

    概述

    SQLJ API 是 JDBC 的一个扩展,它支持 SQL 语句的静态实行。由于 DB2 支持 SQLJ,以是 Java 启示人员可以战胜 JDBC 的首要限制,即 JDBC 只可以静态地实行 SQL 语句。静态绑定的 SQL 语句素日比静态绑定的语句运转得更快,这将使 SQLJ 利用法度具有比 JDBC 利用法度更除夜的后果优势。

    在本大节中,将学习怎样用 SQLJ API 编写法度,包括利用毗邻上下文,在 SQLJ 可实行子句中发出 SQL 语句,以及用迭代器分解下场集。

    启示 SQLJ 利用法度的任务

    在 SQLJ 利用法度的开头,需求导入包括 JDBC 和 SQLJ API 的 Java 包:

    import sqlj.runtime.*;
    import java.sql.*;
    


    SQLJ 利用法度利用 JDBC 驱动法度 大节中所讨论的相反的 JDBC 驱动法度。

    在编译 SQLJ 源代码之前,需求将其转换成 Java 代码,以便可以经过议定 Java 编译器遏制编译。sqlj 敕令实行这个转换,并挪用 Java 编译器。若是 SQLJ 源文件中有 SQL 语句,一个以 _SJProfile0.ser 收尾的文件将与 > 文件和 sqlj 文件一起出如今您的目次中。

    一旦转换并编译了源代码,就可以运转它了。可是,利用法度中的 SQL 语句未遏制静态绑定,这可以或许会招致较差的后果。为了在利用法度中静态绑定 SQL 语句,需求实行利用法度的设置装备陈设定制。可以用 db2sqljcustomize 东西实行这个定制。

    为了实行对已编译利用法度的设置装备陈设定制,要实行下列敕令:

    db2sqljcustomize -url jdbc:db2://localhost:50000/sample
                     -user uid -password pwd
                        app_SJProfile0.ser
    


    在该敕令中,uid 表示您的用户 ID,pwd 表示您的密码,app 表示利用法度的称号。

    以下是成功运转 db2sqljcustomize 时的一些示例输入:

    db2sqljcustomize -url jdbc:db2://localhost:50000/sample
                     -user me -password mypwd DbApp_SJProfile0.ser
    [ibm][db2][jcc][sqlj]
    [ibm][db2][jcc][sqlj] Begin Customization
    [ibm][db2][jcc][sqlj] Loading profile: DbApp_SJProfile0
    [ibm][db2][jcc][sqlj] Customization complete for profile DbApp_SJProfile0.ser
    [ibm][db2][jcc][sqlj] Begin Bind
    [ibm][db2][jcc][sqlj] Loading profile: DbApp_SJProfile0
    [ibm][db2][jcc][sqlj] Driver defaults(user may override): BLOCKING ALL VALIDATE BIND 
       STATICREADONLY YES
    [ibm][db2][jcc][sqlj] Fixed driver options: DATETIME ISO DYNAMICRULES BIND
    [ibm][db2][jcc][sqlj] Binding package DBAPP01 at isolation level UR
    [ibm][db2][jcc][sqlj] Binding package DBAPP02 at isolation level CS
    [ibm][db2][jcc][sqlj] Binding package DBAPP03 at isolation level RS
    [ibm][db2][jcc][sqlj] Binding package DBAPP04 at isolation level RR
    [ibm][db2][jcc][sqlj] Bind complete for DbApp_SJProfile0
    







    回页首



    设立扶植毗邻上下文

    在 SQLJ 利用法度中,SQL 操纵需求一个毗邻上下文(connection context),而不是 JDBC Connection 工具。每个 SQL 语句是经过议定 #sql SQLJ 子句发出的,并被显式或隐式地指派一个毗邻上下文。毗邻上下文的指派将语句与前面翻开的数据库毗邻联系关系起来。

    在设立扶植数据库毗邻之前,必须首先生成一个毗邻上下文类。下一行代码生成一个名为 Ctx 的毗邻上下文类:

    #sql context Ctx;
    


    为了设立扶植数据库毗邻,要利用 > 方式加载 JDBC 驱动法度,然后构造前面善成的上下文类的一个实例。至少需求将数据库的 URL 和一个布尔值传递给上下文构造函数,这个布尔值表示能否希望翻开主动提交。下面的代码片段在 SQLJ 中设立扶植数据库毗邻:

    String url = "jdbc:db2:sample";
    >

    在这个示例毗邻上下文 connCtx 中,利用 IBM DB2 通用 JDBC 和 SQLJ 驱动法度毗邻 DB2 管事器上的示例数据库,并翻开了主动提交。





    回页首



    发出 SQL 语句

    与许多其他数据库 API(包括 JDBC)角力计较,SQLJ 的一项明明优势便是 SQLJ 语法的复杂性和强除夜后果。下面的代码示例演示了 UPDATE 语句,该语句利用了一个宿主变量:

    String staffJob = "Sales";
    #sql [connCtx] {UPDATE STAFF SET COMM=400 WHERE JOB = :staffJob};
    


    为了编写前往下场集的 SQL 语句,需求利用迭代器(iterator)。稍后将在 利用迭代器 大节中讨论迭代器。





    回页首



    根本的 SQLJ 利用法度:示例代码

    下列利用法度演示了本节中曾经讨论的一切概念:

    • 导入包括 JDBC 和 SQLJ API 的 Java 包。
    • 加载 IBM DB2 通用 JDBC 和 SQLJ 驱动法度。
    • 生成毗邻上下文。
    • 用宿主变量实行 SQL 语句。

    在这个利用法度中,实行了一个 SELECT 语句,并将其标量下场传递给名为 stname 的宿主变量。

    //DbApp.sqlj
    import sqlj.runtime.*;
    import java.sql.*;
    #sql context Ctx;
    >

    为了转换和编译以上文件(名为 DbApp.sqlj),要实行下列敕令:

    sqlj DbApp.sqlj
    


    为了实行这个已编译利用法度的设置装备陈设定制,要实行下列敕令:

    db2sqljcustomize -url jdbc:db2://localhost:50000/sample
                     -user uid -password pwd
                     DbApp_SJProfile0.ser
    


    在这条敕令中,uid 表示您的用户 ID,pwd 表示您的密码。

    为了运转已编译的利用法度,要实行下列敕令:

    java DbApp
    


    这个利用法度的输入应该如下所示:

    The name of employee #10 is: Sanders
    







    回页首



    利用迭代器

    为了在 SQLJ 利用法度中分解下场集,需求利用迭代器。迭代器是 SQL 游标的 SQLJ 版本。可以在 SQLJ 中利用两种首要的迭代器:命名(named)迭代器和位置(positional)迭代器。

    命名迭代器

    命名迭代器是用下场集中各列的称号和数据圭表标准来声明的。在命名迭代器中,各列的挨次无关紧要。在利用法度中利用命名迭代器之前,必须首先生成一个迭代器类,此时必定要记住需求分解的下场集的特征。下列代码片段生成一个称作 NameIter 的命名迭代器类;该迭代器有两个列。

    #sql iterator NameIter(String Name, int Id);
    


    当发出 SQL 盘考时,应该将下场集传递给生成的迭代器类的实例。歧:

    NameIter nIter;
    #sql [connCtx] nIter = {SELECT ID, NAME FROM STAFF WHERE DEPT = 20};
    


    为了从命名迭代器检索列值,可以利用以下场集中的列名命名的迭代器方式。为领会析命名迭代器,要利用一个循环构造;在每个循环迭代之前,要经过议定运转 iterator.next() 方式进入下一行。下列代码片段分解 NameIter 命名迭代器的实例。

    while (nIter.next()) {
      System.out.println(nIter.Name()   ", ID #"   nIter.Id());
    }
    


    位置迭代器

    位置迭代器只用下场集中各列的数据圭表标准来声明。在位置迭代器中,各列的挨次是首要的。在利用法度中利用位置迭代器之前,必须首先生成一个迭代器类,此时必定要记住需求分解的下场集的特征。下列代码片段生成一个名为 PosIter 的位置迭代器类;该迭代器有两个列。

    #sql iterator PosIter(String, int);
    


    当发出 SQL 盘考时,要将下场集传递给生成的迭代器类的实例。歧:

    PosIter pIter;
    #sql [connCtx] pIter = {SELECT ID, NAME FROM STAFF WHERE DEPT = 20};
    


    为了从位置迭代器检索列值,需求将这些值读取到宿主变量中。利用 iterator.endFetch() 方式来辨别能否尚有更多的行要读取。下列代码片段分解一个 PosIter 位置迭代器的实例。

    #sql {FETCH :pIter INTO :nameHv, :idHv };
    while (!pIter.endFetch()) {
      System.out.println(nameHv   ", ID #"   idHv);
      #sql {FETCH :pIter INTO :nameHv, :idHv };
    }
    







    回页首



    命名和位置迭代器:示例代码

    下列利用法度演示了前面讨论的一切概念:

    • 生成命名迭代器。
    • 生成位置迭代器。
    • 利用命名迭代器分解下场集。
    • 利用位置迭代器分解下场集。

    在这个利用法度中,实行一个 SELECT 语句两次。第一次实行产生的下场集由名为 nIter 的命名迭代器来分解。第二次实行产生的下场集由名为 pIter 的位置迭代器来分解。

    //Iter.sqlj
    import sqlj.runtime.*;
    import java.sql.*;
    #sql context Ctx;
    #sql iterator NameIter(String Name, int Id);
    #sql iterator PosIter(String, int);
    >

    为了转换和编译以上文件(名为 Iter.sqlj),要实行下列敕令:

    sqlj Iter.sqlj
    


    为了实行已编译利用法度的设置装备陈设定制,要实行下列敕令 :

    db2sqljcustomize -url jdbc:db2://localhost:50000/sample
                     -user uid -password pwd Iter.ser
    


    在这个敕令中,uid 表示您的用户 ID,pwd 表示您的密码。

    为了运转已编译的利用法度,要实行下列敕令:

    java Iter
    


    这个利用法度的输入应该如下所示:

    Result set from named iterator:
    Sanders, ID #10
    Pernal, ID #20
    James, ID #80
    Sneider, ID #190
    Result set from positional iterator:
    Sanders, ID #10
    Pernal, ID #20
    James, ID #80
    Sneider, ID #190
    





    版权声明: 原创作品,答理转载,转载时请务必以超链接方式标明文章 原始因由 、作者信息和本声明。不然将追究法则责任。

  • 相关阅读:
    three.js-sun-lensflare
    three.js-Raycaster
    three.js-shadow
    three.js-core
    three.js-Basic-Expand
    Three.js Basic
    md5加密
    密码验证正则表达式
    启动线程开启信的线程
    获取WINDOW.OPEN url js中的get取值
  • 原文地址:https://www.cnblogs.com/zgqjymx/p/1972827.html
Copyright © 2011-2022 走看看