dyerac  
          dyerac In Java
          公告

          日歷
          <2025年8月>
          272829303112
          3456789
          10111213141516
          17181920212223
          24252627282930
          31123456
          統(tǒng)計
          • 隨筆 - 36
          • 文章 - 10
          • 評論 - 94
          • 引用 - 0

          導航

          常用鏈接

          留言簿(5)

          隨筆分類(49)

          隨筆檔案(36)

          文章分類(11)

          文章檔案(10)

          相冊

          dyerac

          搜索

          •  

          積分與排名

          • 積分 - 79790
          • 排名 - 705

          最新隨筆

          最新評論

          閱讀排行榜

          評論排行榜

           
           

          使用 SQLJ 開發(fā)應用程序

          用 DB2 UDB V8.1 和 Application Developer V5.1.2 創(chuàng)建使用 SQLJ 的 Java 和 J2EE 應用程序

          文檔選項

          將此頁作為電子郵件發(fā)送

          未顯示需要 JavaScript 的文檔選項

          樣例代碼

          級別: 初級

          Owen Cline (owenc@us.ibm.com), 認證的 IT 咨詢專家 - WebSphere 軟件服務, IBM

          2005 年 2 月 01 日

          這篇 "how-to" 文章將解釋如何在 Java™ 應用程序和 J2EE™ 應用程序中使用 SQLJ。文中將介紹 SQLJ 語法,使用 SQLJ 訪問數(shù)據(jù)源,建立 WebSphere® Application Developer 項目以支持 SQLJ,以及創(chuàng)建和調(diào)用 DB2® 存儲過程。

          SQLJ 概述

          SQL 語句包括查詢(SELECT)、插入(INSERT)、更改(UPDATE)、刪除(DELETE)語句以及其他對存儲在關系數(shù)據(jù)庫表中的數(shù)據(jù)進行操作的語句。SQLJ 是在 Java 中嵌入這些 SQL 語句的一種約定,它是以某種允許編程工具對 Java 中 SQL 進行編譯時分析的方式實現(xiàn)嵌入的,在編譯時會對 SQL 語句進行語法檢查以保證語法的正確性,進行類型檢查以確定 Java 和 SQL 之間交換的數(shù)據(jù)具有兼容的類型和適當?shù)念愋娃D換,以及進行模式檢查以確保 SQL 結構在它們執(zhí)行時所在的數(shù)據(jù)庫模式中是格式良好的、合法的。嵌入式 SQL 語句被稱為是 "靜態(tài)的(static)",因為這些語句在 Java 程序中一目了然,因而嵌入式 SQL 語句隨著包含它們的 Java 程序的編譯而編譯(通常的術語是"預編譯")。我們提議將 SQLJ 作為用于緊密集成 Java/SQL 程序的一種方便有效的標準。

          SQLJ 簡史

          正如 Connie Tsui 在她的文章(后面有引用)中解釋的那樣,一個非正式的、開放的數(shù)據(jù)庫供應商組織在 1997 年 4 月開始定期的會面,以便交換關于如何在 Java 編程語言中使用靜態(tài) SQL 語句和結構的思想。主要參與者包括 IBM®、Oracle、Compaq、Informix®、Sybase、Cloudscape™ 和 Sun Microsystems。該組織將他們?yōu)橹Φ囊?guī)范命名為 JSQL。在發(fā)現(xiàn) JSQL 已經(jīng)是商標術語后,JSQL 被更名為 SQLJ。在 1997 年 12 月,Oracle 向其他成員提供了 Java 中嵌入式 SQL 的一個參考實現(xiàn)。該參考實現(xiàn)可以在任何支持 JDK 1.1 的平臺上運行,并且是與供應商無關的。在 1998 年 12 月,用于在 Java 中嵌入 SQL 的規(guī)范被完全開發(fā)出來,并且被接受為 ANSI 標準 Database Language —— SQL, Part 10 Object Language Bindings (SQL/OLB) ANSI x3.135.10-1998。該規(guī)范已經(jīng)被當作 SQLJ 規(guī)范的 Part 0 供大家引用。如今它被稱作 SQL/OLB (Object Language Bindings)。

          SQLJ 與 JDBC 的比較

          SQLJ —— Java 數(shù)據(jù)庫應用程序的開門咒語

          SQLJ 標準現(xiàn)在為 Java 應用程序提供了基于 SQL 的數(shù)據(jù)庫訪問。SQLJ —— Java 數(shù)據(jù)庫應用程序的開門咒語

          下面是 SQLJ 相對于直接在 JDBC 中編寫代碼的優(yōu)勢:

          SQLJ 程序需要的代碼行數(shù)比 JDBC 程序更少。SQL 程序更簡短,因而更易于調(diào)試。SQLJ 可以通過在編譯時使用數(shù)據(jù)庫連接,對代碼執(zhí)行語法和語義上的檢查。SQLJ 提供了對查詢結果及其他返回參數(shù)的強類型檢查,而 JDBC 值則是直接從 SQL 返回,在編譯時未進行任何檢查。

          SQLJ 為處理 SQL 語句提供了一種簡化的方式。現(xiàn)在無需編寫不同的方法調(diào)用來綁定每個輸入?yún)?shù)和獲取每個選擇列表項,而只需編寫一條使用 Java 宿主變量的 SQL 語句。SQLJ 會替您完成綁定。

          然而,JDBC 提供了對 SQL 語句的執(zhí)行的細粒度控制,并提供了真正的動態(tài) SQL 能力。如果應用程序需要動態(tài)能力(在運行時發(fā)現(xiàn)數(shù)據(jù)庫或?qū)嵗獢?shù)據(jù)),那么應該使用 JDBC。

          回頁首

          為 SQLJ 建立 WebSphere Studio Application Developer 項目

          如果您計劃將 SQLJ 代碼包括到所有 WebSphere Studio Application Developer (Application Developer) 項目中,那么需要使您的項目支持 SQLJ。為此,可以右擊項目并選擇 Add SQLJ Support。這將彈出 SQLJ 向?qū)В缦滤尽?

          圖 1. 使 Application Developer 項目支持 SQLJ

          回頁首

          SQLJ 和 Java 應用程序

          從 Application Developer 主菜單中,選擇 File -> New -> Other ,然后選擇 Java Java Project。單擊 Next

          圖 2. 創(chuàng)建 Java 項目

          輸入項目名,單擊 Next

          圖 3. 輸入 Java 項目名

          選擇 Finish 創(chuàng)建該項目。

          圖 4. 輸入 Java 項目設置

          為了讓 Java 應用程序能夠成功運行,還需添加 DB2 JDBC 驅(qū)動程序 db2java.zip。右擊 Java 項目,選擇 Properties

          圖 5. 編輯 Java 項目屬性

          接下來,選擇 Java Build path,然后選擇 Libraries 標簽頁。然后選擇 Add External JARs

          圖 6. 添加外部 JAR —— db2java.zip

          完成這些設置后,庫路徑應該如下所示:

          圖 7. 添加外部 JAR —— db2java.zip

          接下來的步驟是創(chuàng)建有關 Java 類,用于容納主方法。為此,需要右擊 Java 項目,然后選擇 New -> Class。填入包名和類名。另外,確保勾選了關于創(chuàng)建主方法的復選框。單擊 Finish

          圖 8. 創(chuàng)建 Java 主類

          最后,需要創(chuàng)建 SQLJ 文件。從 Application Developer 主菜單中,選擇 File -> New -> Other,然后選擇 Data -> SQLJSQLJ File。最后單擊 Next。Application Developer 將保證 SQLJ 文件被轉換成一個 Java 文件。

          圖 9. 選擇 SQLJ 文件向?qū)?/p>

          填入包名和文件名。然后單擊 Finish

          圖 10. 創(chuàng)建 SQLJ 文件

          至此,還需要將代碼添加到 Java 主方法中,另外必須創(chuàng)建一個 SQLJ 方法。首先讓我們明確要完成什么。我們將創(chuàng)建一個 SQLJ 方法,該方法從 DB2 SAMPLE 數(shù)據(jù)庫中根據(jù)給定的雇員號讀取一個雇員記錄。這個 SQLJ 方法以雇員號(一個 Java String)作為輸入,并將其作為參數(shù)傳遞給一條 SQLJ Select 語句。Java 主方法將調(diào)用這個 SQLJ 方法。

          清單 1. 包含主方法的 Java 類

          <![CDATA[
          /*
          * Created on Nov 27, 2004
          *
          */
          package com.ibm.sqlj.main;
          import com.ibm.sqlj.Select;
          /**
          * @author Owen Cline
          *
          */
          public class SQLJJave {
          public static void main(String[] args) {
          Select select = new Select();
          select.selectEmployee("000110");
          }
          }
          ]]>

          清單 2. 包含 SQLJ 方法的 SQLJ 類

          <![CDATA[
          /*
          * Created on Nov 27, 2004
          *
          */
          package com.ibm.sqlj;
          import java.sql.*;
          import sqlj.runtime.ref.*;
          /**
          * @author Owen Cline
          *
          */
          public class Select {
          // First, load the JDBC driver
          static
          { try
          { Class.forName ("COM.ibm.db2.jdbc.app.DB2Driver").newInstance ();
          } catch (Exception e)
          { System.out.println ("\n Error loading DB2 Driver...\n");
          System.out.println (e);
          System.exit(1);
          }
          }
          public void selectEmployee(String empNo) {
          Connection con = null; DefaultContext ctx = null; try {
          String firstName = null;
          String lastName = null;
          // use the DB2 SAMPLE database
          String url = "jdbc:db2:SAMPLE";
          // Get the connection
          con = DriverManager.getConnection(url); // Set the default context
          ctx = new DefaultContext(con); DefaultContext.setDefaultContext(ctx);
          // Lookup the employee given the employee number
          #sql { SELECT FIRSTNME, LASTNAME INTO :firstName, :lastName
          FROM EMPLOYEE
          WHERE EMPNO = :empNo } ;
          System.out.println ("Employee " + firstName + " " + lastName);
          ctx.close();
          con.close();
          }
          catch( Exception e )
          {
          System.out.println (e);
          }
          }
          }
          ]]>

          現(xiàn)在便可以運行這個 Java 應用程序了。選中您的 Java 項目,然后從 Application Developer 主菜單中選擇 Run -> Run As -> Java Application。您應該可以看到在控制臺 "Employee VINCENZO LUCCHESSI" 中打印出如下消息。

          回頁首

          SQLJ 和 J2EE 應用程序

          您可能想到,還可以在 J2EE 應用程序、servlet、會話 bean、BMP 實體 bean 和 MDB bean 中使用 SQLJ。現(xiàn)在我們要做的就是將我們創(chuàng)建的在 Java 應用程序中運行的上述代碼移植,使之在一個會話 bean 中運行。

          首先,需要創(chuàng)建一個 EJB 項目。從 Application Developer 主菜單中,選擇 File- > New -> Project。 然后選擇 EJB and EJB Project。單擊 Next

          圖 11. 創(chuàng)建 EJB Project

          確保選擇了 Create 2.0 EJB Project ,然后單擊 Next

          圖 12. 選擇一個 EJB 版本

          現(xiàn)在,輸入 SQLJSession 作為 EJB 項目名。EAR 項目應該是 DefaultEAR。單擊 Next

          圖 13. 輸入 EJB 項目名

          在 Module Dependencies 對話框中,選擇 Finish 創(chuàng)建 EJB 項目和 EAR 項目。

          圖 14. 輸入 EJB 模塊依賴

          在這里,我們還想創(chuàng)建一個會話 Bean。 選擇 Application Developer 主菜單中的 File -> New -> Enterprise Bean。然后單擊 Next

          圖 15. 創(chuàng)建一個會話 Bean —— 步驟 1

          確保選擇了 Session bean 單選按鈕,并輸入了一個 Bean 名稱。然后單擊 Next

          圖 16. 創(chuàng)建一個會話 Bean —— 步驟 2

          確保選中 Local client view 復選框,以得到本地接口(如果 EJB 容器部署在本地,那么這樣做會更快一些),然后單擊 Finish 創(chuàng)建會話 Bean。

          圖 17. 創(chuàng)建一個會話 Bean - 步驟 3

          現(xiàn)在我們來創(chuàng)建一個 SQLJ 文件,該文件將包含我們的業(yè)務邏輯。右擊 EJB 項目 SQLJSession 并選擇 New -> Other,然后選擇 Data -> SQLJSQLJ File。最后單擊 Next

          圖 18. 創(chuàng)建 SQLJ 文件 —— 步驟 1

          輸入包名和文件名,然后選擇 Finish 創(chuàng)建 SQLJ 文件。還應注意的是,由于是在一個項目中創(chuàng)建這個 SQLJ 文件,而這個項目還沒有添加 SQLJ 支持,因此這一次需添加該支持。

          接著,使用上述步驟創(chuàng)建第二個 SQLJ 文件,文件名為 SessionBeanSelectUsingDefaultDatasource,以便以后演示如何使用 defaultDataSource。現(xiàn)在,我們可以在創(chuàng)建的 SQLJ 文件中添加自己的業(yè)務邏輯,如下所示:

          圖 19. 創(chuàng)建 SQLJ File —— 步驟 2

          清單 3. SessionBeanSelect.sqlj

          <![CDATA[
          package com.ibm.sqlj;
          import java.sql.*;
          import sqlj.runtime.ref.*;
          import javax.sql.DataSource;
          /**
          * @author Owen Cline
          *
          */
          public class SessionBeanSelect {
          // Setup datasource to use. Notice that I am not using a global JNDI name // but instead using a Resource Reference which points to the global JNDI name. // This is a best practice.
          #sql public static context Ctx with (dataSource="java:comp/env/sqljDS");
          public void selectEmployee(String empNo) {
          String firstName = null;
          String lastName = null;
          try {
          // Create context
          Ctx conCtx = new Ctx();
          // Lookup the employee given the employee number
          #sql [conCtx] { SELECT FIRSTNME, LASTNAME INTO :firstName, :lastName
          FROM EMPLOYEE
          WHERE EMPNO = :empNo } ;
          System.out.println ("SessionBeanSelect-Employee " + firstName + " " + lastName);
          conCtx.close();
          } catch (Exception e) {
          System.out.println(e);
          }
          }
          }
          ]]>

          清單 4. SessionBeanSelectUsingDefaultDatasource.sqlj

          <![CDATA[
          package com.ibm.sqlj;
          import java.sql.*;
          import sqlj.runtime.ref.*;
          import javax.sql.DataSource;
          /**
          * @author Owen Cline
          *
          */
          public class SessionBeanSelectUsingDefaultDatasource {
          public void selectEmployee(String empNo) {
          String firstName = null;
          String lastName = null;
          try {
          // Lookup the employee given the employee number
          #sql { SELECT FIRSTNME, LASTNAME INTO :firstName, :lastName
          FROM EMPLOYEE
          WHERE EMPNO = :empNo } ;
          System.out.println ("SessionBeanSelectUsingDefaultDatasource-Employee " + firstName + " " + lastName);
          } catch (Exception e) {
          System.out.println(e);
          }
          }
          }
          ]]>

          現(xiàn)在,我們要添加 bean 模塊,以便調(diào)用 SQLJ 文件中的業(yè)務邏輯。編輯 SQLJSessionBeanBean.java 文件,添加兩個方法:selectEmployee 和 selectEmployeeUsingDefaultDatasource,如以下清單所示。然后,別忘了使這兩個方法成為本地接口。最后,在進入下一步之前,確保生成了部署和 RMIC 代碼。

          清單 4. SQLJSessionBeanBean.java

          <![CDATA[
          package com.ibm.sqlj.ejb.session;
          import com.ibm.sqlj.SessionBeanSelect;
          import com.ibm.sqlj.SessionBeanSelectUsingDefaultDatasource;
          /**
          * Bean implementation class for Enterprise Bean: SQLJSessionBean
          */
          public class SQLJSessionBeanBean implements javax.ejb.SessionBean {
          private javax.ejb.SessionContext mySessionCtx;
          /**
          * getSessionContext
          */
          public javax.ejb.SessionContext getSessionContext() {
          return mySessionCtx;
          }
          /**
          * setSessionContext
          */
          public void setSessionContext(javax.ejb.SessionContext ctx) {
          mySessionCtx = ctx;
          }
          /**
          * ejbCreate
          */
          public void ejbCreate() throws javax.ejb.CreateException {
          }
          /**
          * ejbActivate
          */
          public void ejbActivate() {
          }
          /**
          * ejbPassivate
          */
          public void ejbPassivate() {
          }
          /**
          * ejbRemove
          */
          public void ejbRemove() {
          }
          /**
          * selectEmployee
          */
          public void selectEmployee(String empNo) {
          SessionBeanSelect sbs = new SessionBeanSelect();
          sbs.selectEmployee(empNo);
          }
          /**
          * selectEmployee
          */
          public void selectEmployeeUsingDefaultDatasource(String empNo) {
          SessionBeanSelectUsingDefaultDatasource sbs = new SessionBeanSelectUsingDefaultDatasource();
          sbs.selectEmployee(empNo);
          }
          }
          ]]>

          為最終測試我們的會話 Bean,必須創(chuàng)建一個 Server Configuration。切換到 Server Perspective,并在 Server Configuration 視圖中單擊右鍵。選擇 New -> Server and Server Configuration。輸入服務器名 TestServer ,然后單擊 Finish 創(chuàng)建該服務器。

          圖 20. 創(chuàng)建一個 Server Configuration

          創(chuàng)建好服務器后,在服務器上單擊右鍵(同樣也是在 "Server Configuration" 視圖中),然后選擇 Add and Remove Projects。 在 "Add and Remove Projects" 對話框中(這里沒有顯示出來),添加 DefaultEAR 項目并單擊 Finish

          最后要做的是創(chuàng)建我們的會話 Bean 將要使用的 DB2 數(shù)據(jù)源。在 Server Configuration 視圖中右擊 Test Server,這將彈出服務器配置編輯器。選擇 Security 標簽頁,然后選擇下面顯示的 JAAS Authentication Entries 對話框旁邊的 Add 按鈕。為該條目輸入一個名稱,然后輸入一個用于訪問數(shù)據(jù)庫的合法用戶名和密碼。最后單擊 OK

          圖 21. 添加 JAAS 認證條目

          現(xiàn)在,選擇 Data source 標簽頁。在 JDBC Provider 列表中選擇 Default DB2 JDBC Provider 條目。單擊在上面所選 JDBC 提供者中定義的數(shù)據(jù)源旁邊的 Add 按鈕。確保選中了 DB2 JDBC ProviderVersion 5.0 data source 單選按鈕。然后單擊 Next

          圖 22. 選擇要創(chuàng)建的數(shù)據(jù)源的類型

          輸入 sqljDS 作為數(shù)據(jù)源名稱,輸入 jdbc/sqljDS 作為 JNDI 名稱。對于 "Component-managed authentication alias" 和 "Container-managed authentication alias",都選擇前面創(chuàng)建的 JAAS Authentication Entry。然后單擊 Finish

          圖 23. 輸入 sqljDS 的數(shù)據(jù)源參數(shù)

          重復這些步驟,創(chuàng)建另一個名為 defaultDataSource 的數(shù)據(jù)源,數(shù)據(jù)源的 JNDI 名稱為 jdbc/defaultDataSource。最后,保存該服務器配置。

          圖 24. 輸入 defaultDataSource 的數(shù)據(jù)源參數(shù)

          現(xiàn)在,我們需要創(chuàng)建一個 Resource Reference,以便會話 bean 可以查找 sqljDS 數(shù)據(jù)源。因此,切換到 Application Developer 中的 J2EE Perspective。在 J2EE Hierarchy 視圖中,右擊 SQLJSession EJB 項目,以調(diào)用 EJB Deployment Descriptor 編輯器。選擇 References 標簽頁。選擇 SQLJSessionBean 并選擇 Add 按鈕。選擇 Resource Reference 單選按鈕,然后單擊 Next

          圖 25. 創(chuàng)建資源引用

          輸入 sqljDS 作為名稱。選擇 javax.sql.DataSource 作為類型。為 Authentication 選擇 Container 。 保留 Sharing Scope 為 Shareable。然后單擊 Finish

          圖 26. 輸入資源引用參數(shù)

          選中剛創(chuàng)建的資源引用,然后輸入 jdbc/sqljDS 作為 JNDI 名。保存該 EJB 部署描述文件。

          圖 27. 輸入資源引用的 JNDI 名

          至此,您應該可以測試會話 Bean 模塊了。首先,在 Server Perspective 中,通過在 Servers 視圖中右鍵單擊 TestServer 并選擇 Start 來啟動該服務器。接著,通過在 Servers 視圖中單擊右鍵并選擇 Run universal test client 調(diào)用 Universal Test Client。從這個 universal test client 中,選擇 JNDI Explorer 并展開 "jdbc" 菜單,以顯示出兩個數(shù)據(jù)源:sqljDS 和 defaultDataSource。接下來,完全展開 Local EJB beans 菜單,直到能夠選擇 SQLJSessionBeanLocalHome。在 EJB reference 菜單中完全展開菜單項,直到能夠選擇 SQLJSessionBeanLocal.create() 模塊,然后選擇 Invoke followed by the Work with Object 按鈕。

          圖 28. 調(diào)用 SQLJSessionBeanLocal.create() 方法

          現(xiàn)在,您將看到有兩個方法可供調(diào)用:selectEmployee 和 selectEmployeeUsingDefaultDatasource。選擇 selectEmployee 方法。輸入 000110 作為 empNo 值,并選擇 Invoke 按鈕。檢查控制臺窗口,以確信顯示了 "[11/28/04 16:56:05:176 PST] 6d2f338b SystemOut O SessionBeanSelect-Employee VINCENZO LUCCHESSI"。最后,您自己嘗試一下 selectEmployeeUsingDefaultDatasource 方法。

          圖 29. 調(diào)用 selectEmployee() 方法

          回頁首

          結束語

          總之,對于不需要動態(tài) SQL 的 Java 和 J2EE 應用程序,SQLJ 是提供持久性框架的一種非常有用的方式。雖然本文沒有提到,但使用 SQLJ 開發(fā)存儲過程也是可行的。

          回頁首

          下載

          描述 名字 大小 下載方法

          code samples

          SQLJArticle_sourcecode.zip

          3443 KB

           

          FTP

          |

          HTTP

          關于下載方法的信息

          Get Adobe® Reader®

          參考資料

          關于作者

          Owen Cline 是位于加州圣地亞哥市的 IBM Software Services for Websphere 小組的一名成員。他有 20 多年軟件開發(fā)領域的開發(fā)經(jīng)驗。他擁有 4 項軟件專利,編寫了大量 IBM 紅皮書,并曾多次出席各種技術會議。在過去的 5 年當中,Owen 專門從事 J2EE 架構、應用開發(fā)和部署,重點研究了 WebSphere 平臺。此外,這幾年來,他還參與了許多高知名度的 Web 站點的開發(fā)。

           

          源文檔 <http://www.ibm.com/developerworks/cn/db2/library/techarticles/dm-0412cline/index.html>

           

          posted on 2007-07-09 21:51 dyerac in java... 閱讀(1087) 評論(0)  編輯  收藏 所屬分類: 轉載學習區(qū)
           
          Copyright © dyerac in java... Powered by: 博客園 模板提供:滬江博客
          主站蜘蛛池模板: 金塔县| 广昌县| 皋兰县| 吴江市| 临潭县| 延寿县| 峨边| 进贤县| 正安县| 金川县| 梓潼县| 雅江县| 奉新县| 桦甸市| 庐江县| 阿拉善左旗| 察哈| 定日县| 沅陵县| 兰溪市| 多伦县| 宁强县| 南溪县| 鄂伦春自治旗| 嘉定区| 中西区| 平阴县| 务川| 来安县| 韩城市| 永州市| 景洪市| 兴化市| 巫溪县| 新平| 景宁| 武清区| 平乡县| 太仆寺旗| 新干县| 嘉荫县|