当前位置:主页 >哪些网站提供电竞竞猜活动

哪些网站提供电竞竞猜活动:J2EE之DAO设计模式

发布时间:02月07日 阅读:676



近来介入WEB编程项目,采纳STRUTS框架,在处置惩罚到数据持久化的时刻抉择采纳DAO设计模式,是以读了SUN的J2EE 核心设计模式中DAO设计模式,现翻译为中文于大年夜家共享,不够与差错指出望大年夜家指出,也愿该文对大年夜家有所赞助.

在JAVA编程的时刻, 无意偶尔候看起来异常直接的实现却非要用设计模式转多少个弯去实现他, 这彷佛显的很多余,然则采纳一些成熟的设计模式,会使法度榜样加倍的壮实,松耦合以及好掩护和扩展.

DAO 设计模式

背景:

根据数据源的不合,造访数据的措施也会有所不合,造访持久化的数据源,比如数据库,也会因为其存储类型的不合(关系数据库,面向工具的数据库,简单文件储存,其他要领)和供给商自定义数据类型的不合而有很大年夜的差别。

呈现的问题:

许多投入应用的,J2EE WEB 利用法度榜样在一些时刻必要进行数据的持久化. 对付很多的WEB利用,数据的持久化存储可以经由过程不合的机制来实现,文档中清楚的标出了这些用于造访不合数据持久机制的API的不合之处. 还有一些其他的利用或许会造访一些位于特有系统上的数据资本.比如,在大年夜型机的系统之上,也可能在轻量级的目录造访协议LDAP仓库中,或者是其他什么系统. 还有便是,数据也可能是由诸如B2B这样的外部集成系统办事,信用卡局办事,或者其他办事来供给的.一样平常来说,法度榜样应用一些共享的散播式组件来表示持久化数据.比如实体BEAN. 当一个法度榜样中实体BEAN以对照直接的要领造访持久化数据时大年夜多会斟酌采纳BEAN治理持久化要领(BMP)阐明白点,便是法度榜样中的实体BEAN包孕有直接造访持久化数据的代码.别的一种环境,法度榜样可以采纳容器治理持久化,你不必要写任何代码,而是让容器自己来处置惩罚数据持久化的详细细节.

法度榜样可以应用JDBC API 来造访位于关系数据库中的数据. 他使得在诸如关系型数据库这样的持久化载体中,对数据进行标准的造访和处置惩罚成为可能. 也使J2EE利用法度榜样可以应用SQL语句作为标准的造访关系型数据库语句. 然而,即就是都是关系型数据库的情况下,因为不合的数据库产品,也会导致SQL在应用上,语法和款式也各不相同.

对付不合类型的数据持久化仓库,差异以致会更大年夜. 造访机制,API,以及一些其他特点,会由于他们是关系型数据库,面向工具型数据库照样一样平常的文件而大年夜相径庭.必要造访曩昔遗留下来的系统或者诸如大年夜型主机,B2B这样的专业系统中数据库的利用法度榜样,会常常应用到一些自己特有的API. 这些特有的数据源对利用法度榜样的编写提出了很大年夜的寻衅,而且很有可能在编写的历程中造成法度榜样代码和数据造访代码间孕育发生互相依附性.当商业组件诸如:实体BEAN,会话BEAN,以及servlets和JSP赞助工具这样的表示组件必要造访数据资本的时刻,可以用标准的API来实现其数据库的连接和数据的详细操作.然则,假如把连接数据库和数据的操作代码和这些组件写在一路的话,会导致这些组件和数据库操作之间的耦合,这种耦合的存在,使得在利用法度榜样中从当前数据源类型迁移到另一种数据源类型变的好不轻易和乏味. 假如数据源改变了,那么你的组件也不得不改变来适应新的数据源.

需要性:

1 像 bean治理实体bean, 会话 bean, servlets, 以及其他一些像jsp副手工具这样的组件,平日必要从持久化的数据库或者本来遗留下来的系统以及 B2B, LDAP这样的系统中提取或存储数据。

2 用于持久化储存的API因他们的供给商的不合而各自不合。还有一些的数据源也可能有自己的一些特有的API或者是一些非标准的API。浩繁类型的数据持久化系统和载体,比如: 关系型数据库,面向工具数据库治理系统,XML文档,简单文件等等,使得API各不相同和机能各别。我们短缺一种统一的API来对以上的不合的系统或者文件载体进行操作。

3 组件平日应用特有的API从内部系统或者是遗留下来的系统来造访或是提取数据。

4 当某些特定的造访机制和API包孕在这些组件中的时刻,将直接影响他们的兼容性。

5 组件必要对现有的持久化储存系统或者数据源的实现足够透明,以便在向不合的产品,不合类型的储存系统,和不合类型数据源中进行迁移的时刻,变的简单。

办理规划

应用数据造访工具来抽象和封装对数据源的所有造访。数据造访工具认真治理与数据源的连接,来获取和储存此中的数据。

数据造访工具实现与数据源相关的造访机制。 数据源可所以关系型数据库治理系统,可所以像B2B EXCHANGE这样的内部办事,可所以LDAP库,或者也可所以经由过程CORBA IIOP 或者是低层sockets来造访的商业办事. 依附于DAO的商业组件只对他的客户端裸露一些异常简单的DAO外部接口. DAO将数据源的实现细节对客户端完全的暗藏了起来. 由于,裸露给客户真个DAO接口在低层数据源的实现发生改变时并不会跟着改变,以是这种设计模式使得DAO可以适应不合的数据储存要领类型而不影响客户端和商业组件.最主要的, DAO还在组件和数据源之间扮演着和谐者的角色.

以下是DAO设计模式中各个模块的解释:

1 BusinessObject指的是数据客户端,他平日必要去造访数据源以得到数据或储存数据.一个BusinessObject除了造访数据源的servlet或者helper bean之外也可所以会话BEAN,实体BEAN以及一些其他的JAVA工具.

2 DataAccessObject 是这个设计模式的核心部分, DataAccessObject为BusinessObject抽象了底层的数据造访实现的细节,使得造访数据变得透明. BusinessObject还将数据的装载和储存交给了DataAccessObject进行代理.

3 DataSource他表示的是数据源的实现. 一个数据源可以四像关系型数据库治理体统这样的数据库,可所以面向工具型的数据库治理哪些网站提供电竞竞猜活动系统,可所以XML文档,也可所以简单文件等等. 当然他也可所以其他的系统,(遗留系统,大年夜型主机),可所以办事(B2B办事,信用卡局办事)或者是像LDAP这样的数据库等.

4 TransferObject他代表的是通报工具,一样平常用于数据的载体. DataAccessObject应用通报工具来将数据返回给客户端. DataAccessObject也可以应用通报工具来从客户端吸收数据来将本来数据库中的数据进行更新.

策略:

因为每一个BusinessObject都有着响应的DAO,以是在BusinessObject,DAO,和底层实现之间是可以建立起确定的关系的(比如在关系型数据库中的表格)。一旦他们之间的关系建立了,我们就可以为这个利用应用专门定制出代码天生器天生涉及到该利用所有的DAO的代码。孕育发生DAO的元数据还可以经由过程开拓职员定制的描述符文件来得到.代码天生器也可以经由过程自动的对数据库进行反省,然后按照实际环境来供给一些需要的DAO来造访数据库. 假如对付DAO的要求过于繁杂,则斟酌应用第三方对象来为关系型数据库供给工具到关系的映射.这些对象一样平常都包孕图形化的用户界面可以方便的将商业工具暗射到持久化工具上,于是就可以定义DAO了。这些对象可以自动在暗射一停止就自动的孕育发生代码,不只如斯,他门可以供给一些附加的好处,比如结果缓存,查询缓存,与利用办事器的整合,于第三方产品的整和(散播试缓存)等等.

1 工厂模式策略:

DAO设计模式可以经由过程采纳抽象工厂和工厂措施模式来边的异常的机动.

当底层数据储存实现不必要发生改变时,该策略可以应用工厂措施设计模式实现,来孕育发生利用中所需的DAO.

当底层数据储存实现不得不发生变更的时刻, 我们可以用抽象工厂模式来实现这个策略. 就象在设计模式:可重用面向工具软件的元素这本书中建议的那样,抽象工厂先创建然后再应用工厂措施的实现. 在当前环境,该策略可以供给一个抽象的DAO工厂工具(抽象工厂),用他来创建不合类型的详细DAO工厂.,每一个工厂都各自支持一种不合的数据持久化储存的实现. 一旦你为某个特定的实现得到了详细的DAO工厂,你则可以用这个工厂来孕育发生那个特定实现所支持和实现的DAO工具.

优点与毛病:

DAO设计模式带来的好处.

1 透明化:

商业工具可以在完全不知道数据源若何详细实现的环境下来应用数据源. 造访数据源是透明的,由于实现细节已经被暗藏进了DAO.

2 迁移简单化:

DAO层的呈现,使得利用法度榜样向不合的数据库实现进行迁移变的轻易.商业工具可以对底层数据实现一无所知.这样,迁移只涉及到了对DAO层的改动. 别的,假如应用工厂策略,则使为每一种底层数据实现供给一个详细的工厂实现成为可能.在这种环境下,迁移到一种不合的数据实现,着实就相称于为这个利用法度榜样再供给一个新的工厂实现.

3 削减在商业工具中的编程难度.

因为DAO治理着所有的数据造访细节,因而大年夜大年哪些网站提供电竞竞猜活动夜简化了在商业工具和其他应用DAO的数据客户端里的代码.所有的实现细节相关的代码比如(SQL 语句)都包孕在DAO而不在商业工具中. 这样使得代码变的加倍壮实而且大年夜大年夜前进了开拓效率.

4 将所有的数据造访都零丁集中到一层中去.

由于所有的数据造访操作现在都已经被DAO所代理,以是这个零丁的数据造访层可以被看作可所以将数据造访实现和另外利用法度榜样互相隔离的一层. 这样的集中,使得利用法度榜样可以加倍轻易的来掩护和治理.

毛病:

5 对容器治理持久化无用

因为EJB容器应用CMP(容器治理持久化)来治理实体BEAN. 容器会自动的为持久化储存造访供给办事.利用法度榜样应用容器治理的实体BEAN则不必要DAO层的介入.由于利用法度榜样办事器本身就可以透明的供给这些功能.然而,DAO在组合式CMP和BMP必要的场合下照样有用的.

6 增添了多余的层.

因为DAO在数据客户端和数据源之外多创建了一层工具,因而,必要对他进行设计和实现,来均衡这个设计模式的利弊. 然则,一样平常来说,采纳此设计模式照样利大年夜于弊的.

7 必要对类的互相承袭关系进行设计.

当应用工厂策略的时刻,详细工厂类的承袭关系和由这些工厂类天生的产品必要进行设计和实现. 我们必要仔细斟酌这些多付出的事情是否真的可以孕育发生出来更高的机动性. 应用这个策略会使设计变的加倍繁杂,然而,你可以先从工厂措施模式开始来实现这个策略,然后在必要的环境下再转向抽象工厂

典型阐明:

为DAO实现工厂类的策略

1 采纳工厂措施设计模式

假如一个DAO 工厂只为一个数据库的实现,(比如ORACLE)而创建很多的DAO的时刻,实现该策略时,我们斟酌采纳工厂措施设计模式. 假设该工厂类创建了CustomerDAO, AccountDAO, OrderDAO 等哪些网站提供电竞竞猜活动一些工具。

2 应用抽象工厂设计模式:

假如斟酌为三种不合类型的数据库来实现这个策略,我们可以斟酌采纳抽象工厂设计模式. 假设. 这个工厂创建了CustomerDAO, AccountDAO, OrderDAO的一系列的DAO, 该策略运用了在抽象工厂中孕育发生的工厂类中的工厂措施的实现.

代码阐明:

以下代码举例阐清楚明了DAO设计模式的详细实现:

我们以应用抽象工厂的设计模式来对于多种类型数据库为例,在以下的例子中只详细列出CLOUDSCAPE 数据库类型的DAO设计模式的详细实现,其他类型数据库DAO设计模式的实现大年夜同小异.

1 // Abstract class DAO Factory

public abstract class DAOFactory {

// List of DAO types supported by the factory

public static final int CLOUDSCAPE = 1;

public static final int ORACLE = 2;

public static final int SYBASE = 3;

...

// There will be a method for each DAO that can be

// created. The concrete factories will have to

// implement these methods.

// 所有实现该抽象工厂的工厂类中必须有的措施,用这些措施来创建详细的DAO类.

public abstract CustomerDAO getCustomerDAO();

public abstract AccountDAO getAccountDAO();

public abstract OrderDAO getOrderDAO();

//该抽象类的静态措施,用他来创建其他详细的DAO工厂类

public static DAOFactory getDAOFactory(

int whichFactory) {

switch (whichFactory) {

case CLOUDSCAPE:

return new CloudscapeDAOFactory();

case ORACLE:

return new OracleDAOFactory();

case SYBASE:

return new SybaseDAOFactory();

...

default:

return null;

}

}

}

2 以下是Cloudscape DAO FACTORY 类的实现,在他里面实现了该类型数据库的连接,以及实现了他所承袭的抽象工厂类中所必须实现的那些措施,在这些措施中创建详细的DAO工具.

// Cloudscape concrete DAO Factory implementation

import java.sql.*;

public class CloudscapeDAOFactory extends DAOFactory {

public static final String DRIVER=

"COM.cloudscape.core.RmiJdbcDriver";

public static final String DBURL=

"jdbc:cloudscape:rmi://localhost:1099/CoreJ2EEDB";

// method to create Cloudscape connections

//建立Cloudscape 连接

public static Connection createConnection() {

// Use DRIVER and DBURL to create a connection

// Recommend connection pool implementation/usage

}

//创建 CustomerDAO 工具 当然返回的是一个该类实现的接口,他的好处便是实现了实现细节的隐蔽.

public CustomerDAO getCustomerDAO() {

// CloudscapeCustomerDAO implements CustomerDAO

return new CloudscapeCustomerDAO();

}

//创建 AccountDAO 工具 当然返回的是一个该类实现的接口,他的好处便是实现了实现细节的隐蔽.

public AccountDAO getAccountDAO() {

// CloudscapeAccountDAO implements AccountDAO

return new CloudscapeAccountDAO();

}

//创建 OrderDAO 工具 当然返回的是一个该类实现的接口,他的好处便是实现了实现细节的隐蔽.

public OrderDAO getOrderDAO() {

// CloudscapeOrderDAO implements OrderDAO

return new CloudscapeOrderDAO();

}

...

}

3 以下代码便是详细DAO类实现的接口也便是CloudscapeCustomerDAO()实现的接口: CustomerDAO .哪些网站提供电竞竞猜活动在该接口中定义了所有的营业措施.

// Interface that all CustomerDAOs must support

public interface CustomerDAO {

public int insertCustomer(...);

public boolean deleteCustomer(...);

public Customer findCustomer(...);

public boolean updateCustomer(...);

public RowSet selectCustomersRS(...);

public Collection selectCustomersTO(...);

...

}

4 以下CloudscapeCustomerDAO类实现的详细营业细节和数据操作细节, 他是要向客户数据端隐蔽的.

import java.sql.*;

public class CloudscapeCustomerDAO implements

CustomerDAO {

public CloudscapeCustomerDAO() {

// initialization

}

// The following methods can use

// CloudscapeDAOFactory.createConnec哪些网站提供电竞竞猜活动tion()

// to get a connection as required

public int insertCustomer(...) {

// Implement insert customer here.

// Return newly created customer number

// or a -1 on error

}

public boolean deleteCustomer(...) {

// Implement delete customer here

// Return true on success, false on failure

}

public Customer findCustomer(...) {

// Implement find a customer here using supplied

// argument values as search criteria

// Return a Transfer Object if found,

// return null on error or if not found

}

public boolean updateCustomer(...) {

// implement update record here using data

// from the customerData Transfer Object

// Return true on success, false on failure or

// error

}

public RowSet selectCustomersRS(...) {

// implement search customers here using the

// supplied criteria.

// Return a RowSet.

}

public Collection selectCustomersTO(...) {

// implement search customers here using the

// supplied criteria.

// Alternatively, implement to return a Collection

// of Transfer Objects.

}

...

}

5 下面的代码是数据客户端向DAO中传输数据的, 他着实便是一个JAVABEAN;

public class Customer implements java.io.Serializable {

// member variables

int CustomerNumber;

String name;

String streetAddress;

String city;

...

// getter and setter methods...

...

}

6着末便是客户数据端对这个设计的利用:

...

// create the required DAO Factory

DAOFactory cloudscapeFactory =

DAOFactory.getDAOFactory(DAOFactory.DAOCLOUDSCAPE);

// Create a DAO

CustomerDAO custDAO =

cloudscapeFactory.getCustomerDAO();

// create a new customer

int newCustNo = custDAO.insertCustomer(...);

// Find a customer object. Get the Transfer Object.

Customer cust = custDAO.findCustomer(...);

// modify the values in the Transfer Object.

cust.setAddress(...);

cust.setEmail(...);

// update the customer object using the DAO

custDAO.updateCustomer(cust);

// delete a customer object

custDAO.deleteCustomer(...);

// select all customers in the same city

Customer criteria=new Customer();

criteria.setCity("New York");

Collection customersList =

custDAO.selectCustomersTO(criteria);

// returns customersList - collection of Customer

// Transfer Objects. iterate through this collection to

// get values.

1 创建一个抽象工厂类,他包孕两个紧张的部分: 第一部分是 一些抽象措施,这些措施是所有实现该抽象工厂的详细工厂类所必须实现的. 第二部分 便是一个静态措施,该措施来创建一个详细类型数据源的工厂工具,比如文中的CloudscapeDAOFactory().

2 然后,分手创建各个类型数据源的工厂类,(本文以CloudscapeDAOFactory为例).在这个工厂类中里面也有两个紧张组成部分: 第一部分便是实现在他承袭的那个抽象工厂类中的阁下抽象措施,在该措施中创建详细的DAO工具(这些工具的类在第4不详细定义实现),本文中三个措施分手创建了3个详细的DAO工具,当然为了实现细节的隐蔽,这些措施返回的是这些详细DAO类门实现的接口(这些接口在第3步实现).

3 定义详细DAO类的接口,并在接口中定义所有的营业措施,和数据操作措施.

4 定义详细的DAO类,在这个类中才是实际的营业措施,和数据的操作的实现.

5 定义数据传输工具,他是用来在客户端和DAO之间通报数据的,他着实便是一个JAVABEAN.

6 完成以上5步之后我们就可以在数据客户端应用以上由DAO设计模式定义好的各个类了(见着末一个代码例子块).

以上6步大年夜家在编程的时需详细体会,一样平常来说,数据库中的一个表就可以对应一个数据通报类也便是在第4步中定义的那个类,类中的属性便是表中的字段,然后加上响应的GET,SET 措施. 然后再按模式和以上步骤来定义详细的类.

本文译自:http://java.sun.com/blueprints/corej2eepatterns/Patterns/DataAccessObject.html

jegg

JAVA-J2EE-DESIGH PATTERN

共享便是气力!

20060126



上一篇:雷竞技下载官方版:一棵小草的坚守新闻频道中国青年网
下一篇:电竞下载app送彩金:《环球时报》社评:向李文亮医生致以敬意