熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

利用 Java 存儲過程簡化數據庫操作

2013-11-23 18:53:35  來源: Java核心技術 

  利用Java存儲過程溝通SQLXMLJavaJEE和Web服務
  
  存儲過程(stored procedure)允許將運行於數據庫層中的持久性邏輯與運行於中間層中的商務邏輯有效地分離開來這種分離可以降低整個應用程序的復雜性並提供其重用性安全性性能和可伸縮性
  
  但是妨礙存儲過程廣泛采用的一個主要障礙是不同數據庫廠商使用各種專有的且依賴於數據庫的實現語言使用基於Java的存儲過程可以解決這一問題Oracle已經實現了ANSI標准這些標准規定了從SQL中將靜態Java方法作為過程或函數進行調用的能力這種實現被簡單地稱作Java存儲過程
  
  在本文中你將了解基於Java的存儲過程如何幫助簡化商務邏輯提高其性能並擴展數據庫的功能本文將介紹Oracle如何在數據庫內啟用基於Java的存儲過程還會介紹Java存儲過程如何訪問數據以及如何創建基本Java存儲過程
  
  選擇PL/SQL還是Java
  在考慮Oracle存儲過程時你可能會想到PL/SQL不過從Oraclei開始Oracle已經在數據庫中支持Java從而為存儲過程提供了不同於PL/SQL的開放式和可移植的方法我可以聽到$ 問題我如何在PL/SQL和Java之間做出選擇?我是否應當忘記已經學習的所有PL/SQL相關知識而變為一個Java天地的新手?
  
  兩種語言都適用於數據庫編程都有自己的優點和弱點在決定選擇哪一種語言時可以參考下面根據經驗得出的通用規則
  
  對於要求與SQL進行無縫集成的數據庫中心來說則邏輯使用PL/SQL從而完成對數據庫對象類型和特性的訪問
  
  出於與數據庫的無關性考慮時可以選擇Java作為開放式的語言來取代PL/SQL同時也為了集成和溝通SQLXMLJEE和Web服務等各個領域
  
  OralceJVM使得Java可以運行在數據庫中
  從Oraclei版本(Oralce)開始Oracle便提供緊密集成的Java虛擬機(JVM)JVM支持Oralce的數據庫會話期結構任何數據庫對話期都可以在第一Java代碼調用時啟動一個虛擬上專用的JVM後續的用戶可以使用這一已經存在的支持Java的會話期事實上所有會話共享同一JVM代碼並保持僅靜態的私有狀態而垃圾則收集在單個對話期空間內從而為各個Java對話期提供了和SQL操作相同的對話期隔離和數據完整性能力這裡不需要為了數據完整性而進行單獨的Java支持的過程這一基於對話期的結構提供了較小的內存占用率並使OracleJVM具有與Oracle數據庫一樣的線性SMP可伸縮性
  
  創建Java存儲過程
  要將Java方法轉換為Java存儲過程需要幾個步驟包括用loadjava實用程序將Java類加載到數據庫中利用調用規范(Call Spec)發布Java方法將Java方法參數類型和返回類型映射到其SQL的對應部分下面部分說明如何完成這些步驟
  
  我將使用一個簡單的Hello類它有一個方法Helloworld()返回字符串Hello world
  
  
  public class Hello
  {
    public static String world ()
    {
     return Hello world;
    }
  }
  
  Loadjava 實用程序
  Loadjava是加載Java源文件Java類文件和Java資源文件的實用程序它可以用來驗證字節碼並將Java類和JAR文件布置到數據庫中它既可以通過命令行調用也可以通過包含於DBMS_JAVA類中的loadjava()方法調用為了加載我們的Helloclass示例輸入
  
  loadjava user scott/tiger Helloclass
  
  從Oraclei版本開始loadjava允許通過為包含在被處理的類中的方法創建相應的Call Specs來自動將Java類發布為存儲過程Oracle為開發測試調試和布置Java存儲過程提供了Oraclei JDeveloper
  
  The Resolver Spec
  
  基於JDK的JVM在列於CLASSPATH中的目錄中查找類引用並對其進行解析因為Oracle數據庫類存在於數據庫模式中所以OracleJVM利用數據庫解析器(resolver)通過列於Resolver Spec中的模式查找並解析類引用與CLASSPATH不同(CLASSPATH可以應用於所有的類)Resover Spec根據每類的情況進行應用缺省解析器首先在加載類的模式中搜尋類然後在公共同義詞(public synonyms)中搜索
  
  loadjava resolve <myclass>
  
  你可能需要指定不同的解析器也可以在使用loadjava時強制進行解析從而在布置時確定可能在以後運行時發生的任何問題
  
  loadjava resolve resolver ((* SCOTT) (foo/bar/* OTHERS)
  (* PUBLIC))
  
  Call Spec和存儲過程調用
  為了從SQL中調用Java方法(以及從PL/SQl和JDBC中調用)必須首先通過Call Spec發布公共靜態方法它為SQL定義方法采用的參數以及返回的SQL類型
  
  在我們的例子中我們將利用SQL*Plus連接到數據庫並為Helloworld()定義一個頂級Call Spec
  
  SQL> connect scott/tiger
  SQL> create or replace function helloworld return
  VARCHAR as language java name Helloworld () return
  javalangString;
   /
  Function created
  
  可以像下面這樣調用Java存儲過程
  
  
  SQL> variable myString varchar[];
  SQL> call helloworld() into :myString;
  Call completed
  SQL> print myString;
  
  MYSTRING
  
  Hello world
  
  Java存儲過程可以通過其Call Spec從以下各項中進行調用SQL DML語句(INSERT UPDATEDELETESELECTCALLEXPLAIN PLANLOCK TABLE和MERGE)PL/SQL塊子程序程序包以及數據庫觸發器Call Spec的美妙之處在於存儲過程實現可以從PL/SQL轉換為Java反之亦可這一點對於請求者是透明的
  
  Call Spec從實現語言中(PL/SQL或Java)中抽象出調用界面因而使之能夠在原有應用程序和新的基於Java/JEE的應用程序之間共享商務邏輯但是在從Java客戶程序調用在數據庫駐留的Java類時你可能不希望通過PL/SQL包裝器(wrapper)在以後的版本中Oracle計劃提供一種機制它可以使開發人員略過Call Spec
  
  高級數據訪問控制
  Java存儲過程可用於控制和限制對Oracle數據的訪問其方法是只允許用戶通過存儲過程管理數據而存儲過程在其調用者的權限內執行而不能對表本身進行訪問例如你可以在特定時間內禁止更新數據或者使管理者只具有查詢工資數據的權利而不能進行更新或者記錄所有的訪問並通知某一安全機構
  
  原有應用程序與JEE應用程序之間的數據邏輯共享
  因為原有應用程序與JEE應用程序都通過Call Spec調用存儲過程所以JEE和非JEE應用程序可以共享相同的數據邏輯由於有了Call Spec所以不用考慮所用的是何種實現語言(無論是PL/SQL還是Java)該數據邏輯都可以共享
  
  為BMP實體Bean自動生成主關鍵字
  在對EJB實體bean應用BMP時一個bean實例可以由自動生成的與新插入的數據相關聯的主關鍵字惟一確定它是ejbCreate()的返回值可以利用一個插入相應數據的存儲過程在一個數據庫操作中檢索ejbCeater()中的該值並檢索或計算主關鍵字作為另一種方法也可以利用JDBC的RETURN_GENERATED_KEYS特性以一個SQL語句插入該數據並檢索相應的關鍵字(或ROWID)但是存儲過程方法在各個JDBC驅動器版本和數據庫之間更具可移植性
  
  可以用以下三個步驟實現這一模式
  
  創建一個Java存儲過程在公共GenPk類中定義一個公共靜態Java方法insertAccount()此方法將插入數據計算惟一的關鍵字(通過發出一個序列號)並返回計算出的關鍵字作為主關鍵字
  
  定義Call Spec
  
  CREATE OR REPLACE PROCEDURE insertAccount(owner IN
  varchar bal IN number newid OUT number)
  AS LANGUAGE JAVA NAME GenPKinsertAccount(
  javalangString []);
  /
  
  在ejbCreate()內調用存儲過程
  
  Public AccountPK ejbCreate(String ownerName int balance) throws CreateException
  {
    try {
     CallableStatement call = connprepareCall{
     {call insertAccount(? ? ?)}};
        return new AccountPK(accountID);
    }
  }
  
  為CMP實體Bean定制主關鍵字查找器
  查找器方法(Finder methods)用於檢索已存在的EJB實體bean實例主關鍵字查找器使你能夠檢索惟一標識的EJB實例對於CMP實體beanEJB容器根據聲明描述自動生成主關鍵字查找器findByPrimaryKey()方法但是在某些情況下可能需要更多的控制例如可能需要專門的查找器如findByStoredProcKey()在這些情況下你可以結合使用Java存儲過程和對象關系框架(如Oraclei應用服務器[OracleiAS] TopLink)來實現定制的主關鍵字查找器方法在將EJB查找器定義為REDIRECT或NAMED查找器後TopLink將生成一個SQL查詢用於檢索bean實例
  
  數據驅動的EJB調用
  在數據驅動體系結構中商務邏輯調用可以作為數據庫操作(如插入更新或刪除)的結果來觸發實現該數據邏輯的Java存儲過程可以被聲明為數據庫觸發器用以調用運行於中間層JEE應用服務器的EJBEJB的調用既可以采用JEE兼容的服務器通過Interoperable InterORB Protocol(IIOP)標准遠程方法調用(remote method invocationRMI)
From:http://tw.wingwit.com/Article/program/Java/hx/201311/25942.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.