DAO架构的必要性是什么?

3
  1. 在Java编程中,是否总是需要根据DAO架构进行编码?如果需要,使用它的优势是什么?

  2. 我正在做一个项目,其类图如下所示。这样做的缺点是什么?

alt text

实体类:

private void fillSONumber() {
    try {
        ZnAlSalesOrder o = new ZnAlSalesOrder();
        ArrayList a = o.getPendingSalesOrderIDs();
        for (int i = 0; i < a.size(); i++) {
            cmbSoNo.addItem(a.get(i));
        }
        o.close();
    } catch (Terminated ex) {

    }
}

EntityTable 类示例:

public ResultSet select(String fields, String selection) {
    db = new Database();
    db.select("SELECT " + fields + " FROM " + name + " WHERE " + selection);
    return rs = db.rs;
}

数据库类负责连接的建立和销毁。


你是指Java,还是指ASP.NET? - Matt Ball
6
在公共方法中传递java.sql.ResultSet是一种不好的做法。 - BalusC
1
@Matt Ball,问题很好,但我认为这是Java:请参阅他之前的问题:http://stackoverflow.com/questions/4106606/sqlexception-operation-not-allowed-after-resultset-closed - Buhake Sindi
4个回答

4
在Java编程中,是否总是需要按照DAO架构进行编码?如果是的话,使用它有什么优点?
DAO是一种常见的最佳实践,过去一直很干净。优点是当新开发人员开始项目时,他很可能已经熟悉了这个设计。任何模式的最重要的事情是保持解耦。这非常重要,因为在稍后的某个时间点,您应该能够替换DAO与其他实现而不影响您的其余代码。
我正在做一个类图如下的项目。这样做有什么缺点?
对我来说这是有道理的。我的问题是,你是唯一使用它的人吗?如果是这样,那么你需要所有这些接口吗?如果您将您的实现传递给其他人,则接口非常重要。就像API一样。以后可能会更改为另一个子类。但是,如果您完全控制您的设计,我认为您不应该为无意义的膨胀接口创建接口。
最后,您的代码看起来很好,除了o.close();为什么客户端需要调用close?每个DAO函数都应该足够聪明,可以打开连接并关闭它。数据库应该对您的bean透明。在我看来,不需要进行关闭。

我想迁移到DAO可能更好。 - Nipuna

2

Data Access Objects (DAOs) 意味着 CRUD(Create,Read,Update和Delete)方法。你的 EntityTable 类示例更适合于 Gateway 对象,它封装了针对表中多行数据的操作。因此,这种方法对于两种类型的对象都有一些优缺点:

DAOs 提供了一种方便的方式来抽象保存特定数据,因此您不需要区分插入和更新。

Gateways 允许您构建专门的查询。例如,假设您有一个搜索结果,需要对数据进行分页。网关方法可能会将开始和结束行作为参数,除了任何条件之外,并返回仅该窗口的记录集。


2
DAO模式的目的是将您要访问的数据与存储方式分离。
例如,您可以创建一个DAO,指定一些方法,然后针对MySQL实现这些方法。如果您决定需要转移到MSSQL或Oracle,您只需要更改实现,而不是在代码中使用的接口。
这并非必需,但可以使未来更改更容易,并保持代码解耦。
至于您的设计,基本布局很好,但我建议不要像您所拥有的那样使用通用选择方法。您实际上只是创建了另一层抽象,其中可能出现问题,但没有任何额外的好处。
它适用于简单查询,但是如果您需要进行任何连接操作,您将很快得到不同连接类型的大量方法的混乱。
最好为您需要访问的每种类型的数据编写SQL,并创建返回所需数据类型的方法。这减少了耦合并允许您根据需要更改实现。

1
哈,我认为你和我基本上说了同样的话。 - Amir Raminfar
基本上,我知道我应该点击“加载新答案”按钮。 - Alan Geleynse
你的两个答案都很好。它们解释得非常清楚。 - Nipuna

1

DAO就像一个协议或规则,用于按照某种方式存储数据。在DAO中,我们有四个Java类,例如Connection、Normal Bean、Interface和Service Classes。这些类各自有自己的工作。例如,在Connection类中,您可以建立数据库连接;在Normal Bean中,您具有所需的所有属性;在Interface中,您只有方法声明,而所有业务逻辑都驻留在Service Class中。 因此,预定义了哪里将完成哪项工作。 因此,任何新项目成员都可以轻松理解项目的流程。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接