【Jsp精品源码栏目提醒】:网学会员,鉴于大家对Jsp精品源码十分关注,论文会员在此为大家搜集整理了“EJB数据库应用 - 其它资料”一文,供大家参考学习!
EJB 技术的数据库应用EJB 技术的数据库应用一、J2EE 技术简介 J2EE 是 SUN 公司提出的在分布式环境中的一种体系结构, 它提供了一种基于组件的设计、开发、集成、部署企业应用系统的方法,J2EE 平台提供了多层分布式的应用系统模型、重用组件的能力、 统一的安全模型和灵活的事务控制。
基于组件的 J2EE 企业应用系统具有平台独立性,所以不受任何软件产品和任何软件厂家 API 的约束。
J2EE 定义了下面的组件: application client 和 applets 是客户层组件; Java Servlet 和
JSP 组件是 WEB 层组件; Enterprise JavaBeanEJB 组件是业务处理层组件。
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 可以被多个客户端共享。
由于多个客户端可能改变相同的数据, 所以 Entitybean 在事务管理下工作是很重要的。
通常情况下,EJB 容器提供事务管理。
开发人员可以在组件的部署描述文件中指定事务的属性。
每一个 Entity bean 都有一个唯一的对象标识符,也叫主键,这个主键可以让客户端定位一个 Entity bean。
Entity bean 的持久性可以被 Entity bean 自己管理, 也可以让 EJB 容器管理, Entitybean 自己管理要求开发人员在 Entity bean 中提供数据存取代码。
例如客户的 Entity bean要调用 SQL 语句来通过 JDBC 存取关系数据库。
EJB 容器管理 Entity bean 持久性意味着EJB 容器自动处理数据存取的调用。
两种类型的 EJB 组件(Session bean 和 Entity beans)都可以存取数据库。
选择哪一类 EJB 组件来存取数据库依赖于具体的应用系统。
下面的情况可以在 Session bean 组件中调用 SQL 语句来存取数据库: 应用系统相对简单。
SQL 语句返回的数据不能被多个客户端共享使用。
数据不代表一个业务实体。
下面的情况要用 Entity beans 组件: 超过一个客户端使用数据库调用返回的数据。
数据代表一个业务实体。
开发者想从 Sesson bean 中隐藏关系模型。
EJB 结构的这种灵活性可以让开发人员用不同的方法来开发应用系统。
三、建立数据库连接 EJB 容器维护数据库的连接池,这个连接池对 EJB 组件来说是透明的。
当 EJB 组件申请一个连接时,EJB 容器从连接池中提取一个连接并分配给组件。
由于 EJB 容器只是分配一个连接给 EJB 组件,所以组件很快就获得这个连接并连接数据库。
数据库调用之后,组件就可以释放连接,这样它又可以快速申请到另一个连接。
又因为一个组件只占用这个连接很短的时间,从而同一个连接可以被多个组件使用。
组件不是通过数据库的绝对名来连接数据库,而是用逻辑名连接到数据库, 即用 JNDIlookup 来获得数据库连接,例如:在下面例子中的 AccountEJB 类中,连接数据库有以下几个步骤: 1、指定数据库的逻辑名: private String dbName java:comp/env/jdbc/AccountDB 2、获得数据源: InitialContext ic new InitialContext DataSource ds DataSource ic.lookupdbName 3、从数据源得到数据库连接: Connection con ds.getConnection 这种间接的连接数据库有以下几个优点: 可以在具有不同的数据库名的不同环境中部署相同的 EJB 组件。
可以在多个应用中重用 EJB 组件。
可以集成 EJB 组件到运行在分布环境的应用系统中。
另外,EJB 规范没有要求 J2EE 的实现支持某一个特别类型的数据库系统,因此 EJB 组件可以连接到不同的数据库系统。
四、EJB 数据库应用的例子 下面以一个简单的例子 银行帐户应用系统来介绍 EJB 组件的 Entity bean 类型的组件存取数据库。
Entitybean 的状态存储在关系数据库的 ACCOUNT 表中,表 ACCOUNT 由下面的 SQL 语句创建: CREATE TABLE ACCOUNT (id VARCHAR3 CONSTRAINT pk_account PRIMARY KEY, firstname VARCHAR24, lastname VARCHAR24, balance DECIMAL10.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 方法要实现下列工作: 插入 Entity Bean 的状态到数据库中 初始化实例变量 返回主键。
AccountEJB 的 ejbCreate 方法调用 insertRow 方法,而 insertRow 方法发出一个insert SQL 语句插入 Entity Bean 的状态到数据库中,下面是 Account 类中 ejbCreate 方法的源代码: sublic String ejbCreate String id,String firstName,String lastName,doublebalancethrow CreateException if balance 0.00 throw new CreateExceptionA negative initial balance is notallowed. try insertRowid,firstName,lastName,balance catch Exception ex throw new EJBExceptionejbCreate : 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 方法从数据库中删除一个 EntityBean 状态数据。
代码如下: public void ejbRemove try deleteRowid catch Exception ex throw new EJBException exejbRemove: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 中有三种方法查找 entitybean: Account jones home.findByPrimaryKey836 Collection c home.findByLastNameSmith Collection c home.findInRange20.00,99.00 Entity bean 类必须实现相应的方法, 如: 并且文件名以 ejbFind 前缀开始, AccountEJB类实现 ejbFindByLastName 的方法如下: public Collection ejbFinfBylastNameString lastName throw FinderException Collection result Try Result selectByLastNamelastName catch Exception ex throw new EJBExceptionejbFindByLastName ex.getMessage if result.isEmpty throw new ObjectNotFoundExceptionNo row found. else return result 应用系统中特定的 finder ,如 ejbFindByLastName 和 ejbFindInRange,是可选的,但是必须含有 ejbFindByPrimaryKey 方法, ejbFindByPrimaryKey 方法用主键作参数, 用来定位一个 entity bean 的状态数据, 下面是 ejbFindByPrimaryKey 方法的代码: publicString ejbFindByPrimaryKeyString primaryKey throws FinderException boolean result try result selectByPrimaryKeyprimaryKey catch Exception ex throw new EJBExceptionejbFindByPrimaryKey : ex.getMessage if result return primaryKey else throw new ObjectNotFoundException Row for id primaryKey notfound. 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 debitdouble amount throw InsufficientBalanceException if balance - amount