一起学习
c. 要点
§ 既然这种模式不涉及到数据访问,就应该用Session Bean来实现。
§ 对于用简单接口来实现复杂EJB的子系统来说,是一个理想的选择。
§ 这个模式不适用于无流程处理的应用。
§ 这个模式可以减少客户端于EJB之间的通信和依赖。
§ 所有和EJB有关的交互,都有同一个Session Bean来控制,可以减少客户端对EJB的误用。
§ 这个模式可以使支持多类型客户端变得更容易。
§ 可以减少网络数据传递。
§ 所有的服务器端的实现细节都对客户端隐藏,在改变发生后,客户端不用重新发布。
§ 这个模式可以同样看成一个集中处理器来处理所有的安全或日志纪录。
4. Data Access Object
a. 问题
目前为止,你看到的模型都是用来构建可伸缩的,易于维护的J2EE应用。这些模式尽可能的把应用在多个层上来实现。但是,还有一点必须强调:EJB的数据表现。它们包括象EJB这样的数据库语言。如果数据库有改变的话,相应的SQL也必须改变,而EJB也必须随之更新。
这些常见问题就是:访问数据源的代码与EJB结合在一起,这样致使代码很难维护。看以下的代码。
An EJB that has SQL code embedded in it
// all imports required
// exceptions not handled in the sample code
public class UserAccountEJB implements EntityBean {
// All EJB methods like ejbCreate, ejbRemove go here
// Business methods start here
public UserDetails getUserDetails(String userId) {
// A simple query for this example
String query = "SELECT id, name, phone FROM userdetails WHERE name = " userId;
InitialContext ic = new InitialContext();
datasource = (DataSource)ic.lookup("java:comp/env/jdbc/DataSource");
Connection dbConnection = datasource.getConnection();
Statement stmt = dbConnection.createStatement();
ResultSet result = stmt.executeQuery(queryStr);
// other processing like creation of UserDetails object
result.close();
stmt.close();
dbConnection.close();
return(details);
}
}
b. 建议的解决方法
为了解决这个问题,从而让你能很方便的修改你的数据访问。建议使用DAO模式。这个模式把数据访问逻辑从EJB中拿出来放入独立的接口中。结果是EJB保留自己的业务逻辑方法,在需要数据的时候,通过DAO来访问数据库。这样的模式,在要求修改数据访问的时候,只要更新DAO的对象就可以了。看以下的代码。
A Data Access Object that encapsulates all data resource access code
// All required imports
// Exception handling code not listed below for simplicity
public class UserAccountDAO {
private transient Connection dbConnection = null;
public UserAccountDAO() {}
public UserDetails getUserDetails(String userId) {
// A simple query for this example
String query = "SELECT id, name, phone FROM userdetails WHERE name = " userId;
InitialContext ic = new InitialContext();
datasource = (DataSource)ic.lookup("java:comp/env/jdbc/DataSource");
Connection dbConnection = datasource.getConnection();
Statement stmt = dbConnection.createStatement();
ResultSet result = stmt.executeQuery(queryStr);
// other processing like creation of UserDetails object
result.close();
stmt.close();
dbConnection.close();
return(details);
}
// Other data access / modification methods pertaining to the UserAccountEJB
}
现在你有了一个DAO对象,利用这个对象你可以访问数据。再看以下的代码。
An EJB that uses a DAO
// all imports required
// exceptions not handled in the sample code
public class UserAccountEJB implements EntityBean {
// All EJB methods like ejbCreate, ejbRemove go here
// Business methods start here
public UserDetails getUserDetails(String userId) {
// other processing as required
UserAccountDAO dao = new UserAccountDAO();
UserDetails details = dao.getUserDetails(userId);
// other processing as required
return(details);
}
}
任何数据源的修改只要更新DAO就可以解决了。另外,为了支持应用能够支持多个不同的数据源类型,你可以开发多个DAO来实现,并在EJB的发布环境中指定这些数据源类型。在一般情况下,EJB可以通过一个Factory对象来得到DAO。用这种方法实现的应用,可以很容易的改变它的数据源类型。
c. 要点
§ 这个模式分离了业务逻辑和数据访问逻辑。
§ 这种模式特别适用于BMP。过一段时间,这种方式同样可以移植到CMP中。
§ DAOs可以在发布的时候选择数据源类型。
§ DAOs增强了应用的可伸缩性,因为数据源改变变得很容易。
§ DAOs对数据访问没有任何限制,甚至可以访问XML数据。
§ 使用这个模式将导致增加一些额外的对象,并在一定程度上增加应用的复杂性。
J2EE中的设计模式之一
J2EE中的设计模式之二
J2EE中的设计模式之三
J2EE中的设计模式之四
J2EE中的设计模式之五
下载本文示例代码
J2EE中的设计模式之五J2EE中的设计模式之五J2EE中的设计模式之五J2EE中的设计模式之五J2EE中的设计模式之五J2EE中的设计模式之五J2EE中的设计模式之五J2EE中的设计模式之五J2EE中的设计模式之五J2EE中的设计模式之五J2EE中的设计模式之五J2EE中的设计模式之五