EJB 技术的数据库应用(2)
三、建立数据库连接
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();
这种间接的连接数据库有以下几个优点:
· 可以在具有不同的数据库名的不同环境中部署相同的 EJB 组件。
· 可以在多个应用中重用EJB 组件。
· 可以集成 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 方法要实现下列工作:
· 插入Entity Bean 的状态到数据库中
· 初始化实例变量
· 返回主键。
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;}