成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

EJB技術的數據庫應用

數據庫
對很多的初學者來說EJB技術可能是比較陌生的,對EJB技術的數據庫應用更是大腦一片空白,為了填補這塊空白,使您的大腦成為知識的海洋,下面就為您介紹EJB技術的數據庫應用。

本文介紹時EJB數據庫的入門知識,旨在介紹EJB數據庫應用及數據庫編程主要要求。讓大家對EJB技術的數據庫應用有一個初步的認識,為以后更好的學習EJB技術的數據庫應用知識打下堅實的基礎。

一、J2EE 技術簡介 

  J2EE是 SUN 公司提出的在分布式環境中的一種體系結構,它提供了一種基于組件的設計、開發、集成、部署企業應用系統的方法,J2EE平臺提供了多層分布式的應用系統模型、重用組件的能力、統一的安全模型和靈活的事務控制。基于組件的J2EE企業應用系統具有平臺獨立性,所以不受任何軟件產品和任何軟件廠家API的約束。 

  J2EE定義了下面的組件:

  1.   application client 和 applets 是客戶層組件; 
  2.   Java Servlet 和 JSP 組件是WEB 層組件;  
  3.   Enterprise JavaBean(EJB) 組件是業務處理層組件。 

  EJB 技術是J2EE 體系一部分,EJB 組件是用 Java 語言編寫的,是可以被客戶端程序存取的可重用的服務器端組件,它運行在J2EE 服務器上,在客戶/服務器系統中,EJB 提供類似于中間件的服務。

  J2EE 服務器提供應用系統系統級的服務,像事務管理、安全管理、數據庫存取等,開發人員不必自己開發系統級服務,所以可以集中精力開發應用系統中的業務邏輯處理;用EJB 組件處理業務邏輯。

二、EJB 組件簡介

  EJB 組件分為兩類:Sesson bean Entity bean

  Sesson bean 代表 J2EE 服務器的客戶端,客戶端通過調用 Sesson bean 的功能和J2EE 服務器通信,Sesson bean 和客戶會話,可以認為是客戶端的擴展,例如:網上帳務系統的客戶可以調用 Sesson bean 的"輸入存款單"的功能來存入現金等。每一個Sesson bean 只能有一個客戶,當客戶終止時,與之相應的Sesson bean 也終止。因此Sesson bean 是暫時的,不可持久的。

  Entity bean 代表業務處理對象,它存儲在持久的存貯機制如數據庫中,例如,一個Entity bean 代表一個帳戶存單,它是存儲在關系數據庫中存單表的一行。Entity bean 的信息不一定存儲在關系數據庫中,它也可以存儲在對象數據庫中、文件中或其他別的存儲機制中( 本例子中用關系數據庫)。

  Entity bean 可以被多個客戶端共享。由于多個客戶端可能改變相同的數據,所以Entity bean 在事務管理下工作是很重要的。通常情況下,EJB 容器提供事務管理。開發人員可以在組件的部署描述文件中指定事務的屬性。每一個Entity bean 都有一個唯一的對象標識符,也叫主鍵,這個主鍵可以讓客戶端定位一個Entity bean。

  Entity bean 的持久性可以被 Entity bean 自己管理,也可以讓 EJB 容器管理,Entity bean自己管理要求開發人員在Entity bean中提供數據存取代碼。例如客戶的Entity bean要調用 SQL 語句來通過 JDBC 存取關系數據庫。EJB 容器管理Entity bean持久性意味著 EJB容器自動處理數據存取的調用。

  兩種類型的EJB 組件(Session bean 和 Entity beans)都可以存取數據庫。選擇哪一類 EJB 組件來存取數據庫依賴于具體的應用系統。

下面的情況可以在 Session bean 組件中調用 SQL 語句來存取數據庫:

  1.    應用系統相對簡單。
  2.    SQL 語句返回的數據不能被多個客戶端共享使用。
  3.    數據不代表一個業務實體。

下面的情況要用Entity beans 組件:

  1.    超過一個客戶端使用數據庫調用返回的數據。
  2.    數據代表一個業務實體。
  3.    開發者想從 Sesson bean 中隱藏關系模型。

  EJB 結構的這種靈活性可以讓開發人員用不同的方法來開發應用系統。

#p#

三、建立數據庫連接

  EJB 容器維護數據庫的連接池,這個連接池對 EJB 組件來說是透明的。當EJB 組件申請一個連接時,EJB 容器從連接池中提取一個連接并分配給組件。由于EJB 容器只是分配一個連接給 EJB 組件,所以組件很快就獲得這個連接并連接數據庫。數據庫調用之后,組件就可以釋放連接,這樣它又可以快速申請到另一個連接。又因為一個組件只占用這個連接很短的時間,從而同一個連接可以被多個組件使用。

  組件不是通過數據庫的絕對名來連接數據庫,而是用邏輯名連接到數據庫, 即用 JNDI lookup 來獲得數據庫連接,例如:在下面例子中的AccountEJB 類中,連接數據庫有以下幾個步驟:

  1、指定數據庫的邏輯名:
  private String dbName = "java:comp/env/jdbc/AccountDB";

  2、獲得數據源:
  InitialContext ic = new InitialContext();
  DataSource ds = (DataSource) ic.lookup(dbName);

  3、從數據源得到數據庫連接:
  Connection con = ds.getConnection();

  這種間接的連接數據庫有以下幾個優點:

  1.    可以在具有不同的數據庫名的不同環境中部署相同的 EJB 組件。
  2.    可以在多個應用中重用EJB 組件。
  3.    可以集成 EJB 組件到運行在分布環境的應用系統中。

  另外,EJB 規范沒有要求 J2EE的實現支持某一個特別類型的數據庫系統,因此EJB 組件可以連接到不同的數據庫系統。四、EJB 數據庫應用的例子

  下面以一個簡單的例子 "銀行帳戶"應用系統來介紹 EJB 組件的Entity bean類型的組件存取數據庫。

  Entity bean 的狀態存儲在關系數據庫的 ACCOUNT 表中,表ACCOUNT 由下面的SQL 語句創建:

  CREATE TABLE ACCOUNT 
   (id VARCHAR(3) CONSTRAINT pk_account PRIMARY KEY,
    firstname VARCHAR(24),
    lastname VARCHAR(24),
    balance DECIMAL(10.2));

  和其他EJB 組件一樣,開發人員必須編寫 Entity bean 的 Entity Bean Class 代碼(AccountEJB.java)、Home Interface 代碼(AccountHome.java)及Remote Interface 代碼(Account.java)。

  Entity Bean Class 代碼( AccountEJB.java)

  EntityBean 接口方法

  EjbCreate 方法:當客戶端調用 create 方法時,EJB 容器調用相應的ejbCreate 方法。一個Entity組件的ejbCreate 方法要實現下列工作:

  1.    插入Entity Bean 的狀態到數據庫中
  2.    初始化實例變量
  3.    返回主鍵。

  AccountEJB的ejbCreate 方法調用insertRow 方法,而insertRow 方法發出一個 insert SQL 語句插入Entity Bean 的狀態到數據庫中,下面是 Account 類中ejbCreate 方法的源代碼:

  sublic String ejbCreate (String id,String firstName,String lastName,double balance)throw CreateException{ 
   if (balance < 0.00)
{
   throw new CreateException("A negative initial balance is not allowed.");    }    
try { 
     insertRow(id,firstName,lastName,balance); 
   } catch (Exception ex) {
      throw new EJBException("ejbCreate:"+ex.getMessage());    }     this.id = id; 
   this.firstName = firstName; 
   this.lastName = lastName; 
   this.balance = balance; 
   return id;  }

  throws 子句可以包含 javax.ejb.CreateException 和別的應用系統中指定的例外處理例程(exceptions)。Entity Bean的狀態也可以通過非 J2EE 應用系統直接插入到數據庫中,如SQL 語言腳本插入一行數據到 ACCOUNT表中,盡管這條數據不是通過 ejbCreate 方法插入到數據庫中的,但Entity Bean 同樣能通過客戶端程序定位這條數據。

ejbPostCreate 方法

  對于每一個ejbCreate 方法,開發人員必須在Entity Bean中寫一個ejbPostCreate 方法,EJB 容器在調用完ejbCreate 以后,就立即調用ejbPostCreate,和 ejbCreate 方法不一樣,ejbPostCreate 方法可以調用 getPrimaryKey 等方法,通常ejbPostCreate 方法是空的。

ejbRemove 方法

  當客戶端通過調用 remove 方法來刪除一個 Entity Bean 的狀態數據時,EJB 容器調用 ejbRemove 方法,ejbRemove 方法從數據庫中刪除一個Entity Bean 狀態數據。代碼如下:

  public void ejbRemove() {
    try {
      deleteRow(id);
    } catch (Exception ex){
      throw new EJBException ex("ejbRemove:"+exgetmessage());
    }
  }

  如果ejbRemove 方法遇到系統級錯誤,將執行javax.ejb.EJBException. 如果遇到應用級錯誤,將執行javax.ejb.RemoveException。

  entity bean 的狀態數據也可以通過數據庫的 delete 語句直接刪除數據。

EjbLoad 方法和 ejbStore 方法

  EJB 容器需要維持 Entity Bean 的實例變量與數據庫中相應值的同步,這需要調用 ejbLaod 方法和ejbStore 方法。ejbLoad 方法用數據庫中的數據刷新變量的值,ejbStore 方法把變量的值寫入到數據庫中。客戶端不能調用 ejbLoad 方法和ejbStore 方法。

  如果業務處理的方法關系到事物處理,EJB 容器要在業務處理方法調用之前調用 ejbLoad 方法刷新數據,業務處理方法執行之后,EJB 容器又立即調用 ejbStore 方法把數據存儲到數據庫中。因為 EJB 容器調用ejbLoad方法和ejbStore 方法,開發人員在業務處理方法中不必刷新和存儲實例變量的值。

  如果ejbLoad 方法和ejbStore 方法不能在低層數據庫中定位 Entity Bean,將執行 javax.ejb.NoSuchEntityException。

  在 AccountEJB 類中,ejbLoad 方法調用 loadRow 方法,loadRow 則發出一個 select 語句從數據庫提取數據分配給實例變量;ejbStore 方法調用 storeRow 方法,storeRow 方法則用 update 語句把實例變量的值存儲到數據庫。代碼如下:

  public void ejbLoad(){
    try{
      loadRow();
    }catch (Exception ex){
      throw new EJBException ("ejbLoad:"+ex.getMessage());
    }
  }
  public void ejbStore(){
    try{
      storeRow();
    }catch (Exception ex){
      throw new EJBException ("ejbStore:"+ex.getMessage());
    }  }

  Finder 方法 :

  Finder 方法允許客戶端查找 entity bean ,AccountClient 中有三種方法查找entity bean:

    Account jones = home.findByPrimaryKey("836");
    Collection c home.findByLastName("Smith");
    Collection c home.findInRange(20.00,99.00);

  Entity bean 類必須實現相應的方法,并且文件名以ejbFind 前綴開始,如:AccountEJB 類實現 ejbFindByLastName 的方法如下:

  public Collection ejbFinfBylastName(String lastName)
    throw FinderException {
    Collection result;
    Try {
      Result = selectByLastName(lastName);
    } catch (Exception ex) {
      throw new EJBException("ejbFindByLastName" + ex.getMessage());    }
    if (result.isEmpty()){
      throw new ObjectNotFoundException("No row found.");
    }    else {
      return result}  }

  應用系統中特定的 finder,如 ejbFindByLastName 和ejbFindInRange,是可選的,但是必須含有 ejbFindByPrimaryKey 方法,ejbFindByPrimaryKey 方法用主鍵作參數,用來定位一個 entity bean 的狀態數據,下面是 ejbFindByPrimaryKey 方法的代碼:

  public String ejbFindByPrimaryKey(String primaryKey)
    throws FinderException {
    boolean result;
    try {
      result = selectByPrimaryKey(primaryKey);
    } catch (Exception ex) {
      throw new EJBException("ejbFindByPrimaryKey: " + ex.getMessage());    }
    if (result) {
      return primaryKey;
    }
    else {
      throw new ObjectNotFoundException ("Row for id " + primaryKey + " not found.");
    }
  }

  ejbFindByPrimaryKey 方法以 primaryKey 作為參數并返回它的值。

注意:

  1.只有 EJB 容器可以調用ejbFindByPrimaryKey,而客戶端不能直接調用 ejbFindByPrimaryKey 方法,客戶端只能調用在 home 接口中定義的 findByPrimaryKey。

  2.在 entity bean 類中開發人員必須實現ejbFindByPrimaryKey 方法。

  3.一個 finder 方法的名字必須以 ejbFind 作為前綴。

  4.返回值必須是主鍵或者是一個主鍵的集合。

  throw 子句可以包含 javax.ejb.FinderException,和其他別的例外處理例程。如果一個finder 方法只要求返回唯一一個主鍵,如果主鍵不存在,則應該執行 javax.ejb.ObjectNotFoundException,ObjectNotFoundException 是FoundException的一個子類;如果 finder 方法要求返回的是一個主鍵的集合,則應該執行 FinderException 來處理。

業務處理方法

  業務處理方法包含想在 Entity Bean 中實現的業務處理邏輯。通常業務處理方法不存取數據庫,這允許開發人員可以把業務處理邏輯從數據庫存取中獨立出來。

  在 AccountEJB entity bean 中包含下面的業務處理方法:

  public void debit(double amount)
    throw InsufficientBalanceException {
    if (balance - amount <0){
      throw new InsufficientBalanceException();
    }
    balance -= amount;
  }
  public void credit (double amount) {
    balance += amount;
  }
  public String getFirstName() {
    return firstName;
  }
  public String getLastName() {
    return lastName;
  }
  public double getBalance() {
    return balance;
  }

AccountClient 程序中調用業務處理方法:

    Account duke = home.create("123","Duke","Earl",0.00);
    Duke.credit(88.50);
    Duke.debit(20.25);
    Double balance = duke.getBalance();

注意:

  1、業務處理方法的名稱不能和 EJB 體系中定義的方法的名稱沖突,其他的要求和 entity bean 和 sesson bean 中其它方法的要求相同。

  2、可以在throw 子句中包含應用程序定義的例外處理例程,如 debit 方法執行InsufficientBalanceException。為了識別系統級錯誤,業務處理邏輯應該調用 javax.ejb.EJBException。

#p#

下面是對 AccountEJB 類中存取數據庫的總結:

  因為業務處理方法中不需要存取數據庫,所以在 AccountEJB 類中的業務處理方法沒有存取數據庫。但業務處理方法可以通過 EJB 容器調用 ejbStore 來修改實例變量。當然開發人員也可以在 AccountEJB 類的業務處理方法中存取數據庫,這依賴于應用程序的具體要求,在存取數據庫之前必須連接數據庫。

Home 接口(Interface)

  在home 接口中定義讓客戶端創建和查找 entity bean 的方法。Account Home 接口如下:

  import java.util.Collection;
  import java.rmi.RemoteException;
  import javax.ejb.*;
  public interface AccountHome extends EJBHome {
    public Account create(String id, String firstName, String lastName, double balance)
      throws RemoteException, CreateException;
     public Account findByPrimaryKey(String id)
      throws FinderException, RemoteException;
      public Collection findByLastName(String lastName) 
     throws FinderException, RemoteException;
    public Collection findInRange(double low, double high)
      throws FinderException, RemoteException;
  }

  在Home 接口中,每一種finder 方法必須和 entity bean 類中的 finder 方法對應;finder 方法的名稱必須以 find 開始,就象 entity bean 類中的 finder 方法必須以 ejbFind 一樣,例如:AccountHome 類中定義的findByLastName 方法和AccountEJB 類中實現的 ejbFindByLastName 方法。

Remote 接口

  Remote 接口定義客戶端可以調用的業務處理方法,Account remote 接口的代碼如下:

  import javax.ejb.EJBObject;
  import java.rmi.RemoteException;
  public interface Account extends EJBObject {
    public void debit(double amount)
      throws InsufficientBalanceException, RemoteException;
    public void credit(double amount)
      throws RemoteException;
    public String getFirstName()
      throws RemoteException;
    public String getLastName()
      throws RemoteException;
    public double getBalance()
      throws RemoteException;  }
 

以上就是我為大家介紹的EJB技術的數據庫應用的基本知識,希望這篇文章對大家有用,能夠有助于大家在EJB技術的數據庫應用方面的提高。

【編輯推薦】

  1. 8.1.3 EJB的優勢和使用場景
  2. 17.6 編寫具有本地接口的EJB
  3. EJB 3.1五大模式改進令Java EE 6更好用

 

責任編輯:迎迎 來源: 天極網
相關推薦

2009-06-26 16:01:39

EJB組織開發EJB容器EJB

2009-06-25 16:35:12

EJB技術

2009-06-11 16:53:09

什么是EJBEJB

2011-05-13 13:54:02

數據庫文檔數據庫

2018-05-17 23:07:12

2014-06-10 15:07:19

Oracle數據庫優化

2011-05-19 10:29:40

數據庫查詢

2009-06-12 11:06:35

EJB技術

2019-01-16 14:20:42

2014-03-28 17:30:03

大數據應用

2009-03-19 08:56:58

pureXMLDB2數據結構

2009-07-22 11:45:43

2024-07-17 11:40:58

2017-06-12 18:24:25

數據庫壓縮技術

2011-08-02 13:37:17

2009-06-25 16:47:30

EJB技術

2009-06-11 16:25:44

EJB2.0EJB

2010-05-13 13:49:09

MySQL數據庫

2009-02-03 08:58:13

SQL*Net配置網絡應用

2018-07-03 15:05:34

數據庫Oracle數據提取
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 九九综合 | 在线精品观看 | 99久久精品国产一区二区三区 | 国产精品污www在线观看 | 国产精品精品久久久 | 7777精品伊人久久精品影视 | 欧美成人激情视频 | www.国产一区 | 日韩av啪啪网站大全免费观看 | 91在线免费视频 | 国产福利网站 | 亚洲第一女人av | 成人精品在线观看 | 亚洲精品久久久 | 免费观看成人av | 国产成人精品一区二区三区 | 国产精品爱久久久久久久 | 亚洲成人一区二区 | 亚洲精品一区二区三区在线 | 91热在线 | 国产精品高清一区二区三区 | 欧美成人影院在线 | 亚洲精品观看 | 久久国产精品一区二区 | 欧美一级二级在线观看 | 亚洲国产精品99久久久久久久久 | 欧美色a v | 久优草 | 日韩国产一区 | 狠狠插狠狠操 | 欧美日韩国产一区二区三区 | 成人精品一区二区三区中文字幕 | 日韩福利视频 | 中文字幕亚洲欧美日韩在线不卡 | 日本特黄a级高清免费大片 国产精品久久性 | 亚洲精品日韩视频 | 欧美激情综合色综合啪啪五月 | 亚洲iv一区二区三区 | 日韩乱码av | 99国产精品99久久久久久粉嫩 | 亚洲午夜精品一区二区三区 |