数据库信息 - >对象:应该怎么做?

时间:2012-09-03 20:21:02

标签: java oop design-patterns

我的应用程序将根据请求从数据库中检索信息并根据该信息生成对象。我目前正在考虑两种不同的技术(但我也向其他人开放!)来完成这项任务:

方法一:

class Book {

    private int id;
    private String author;
    private String title;

    public Book(int id) {

        ResultSet book = getBookFromDatabaseById(id);

        this.id = book.id;
        this.author = book.author;
        // ...

    }

}

方法二:

public class Book {

    private HashMap<String, Object> propertyContainer;

    public Book(int id) {

        this.propertyContainer = getBookFromDatabaseById(id);

    }

    public Object getProperty(String propertyKey) {

        return this.propertyContainer.get(propertyKey);

    }

}

使用方法一,我相信它更容易控制,限制和可能访问属性,添加新属性,但是,方法二变得更加平滑。

这样做的正确方法是什么?

3 个答案:

答案 0 :(得分:3)

我认为这个问题已经在很多方面得到了解决:ORM,DAO,行和表映射器,还有很多其他的。没有必要再次重做它。

您必须仔细考虑的一个问题是包之间的耦合和循环依赖关系。您可能认为通过告诉模型对象如何保持自己来做一些聪明的事情,但这种设计选择的一个结果是模型对象和持久层之间的耦合。如果执行此操作,则无法在没有持久性的情况下使用模型对象。它们真的变成了一个庞大而笨重的包裹。没有分层。

另一个选择是让模型对象不知道它们是否持久存在。这是一种单向依赖方式:持久性知道模型对象,但不是相反。

Google提供其他解决方案。没有必要再次击败那匹死马了。

答案 1 :(得分:1)

第一种方法将为您提供相关访问者的类型安全性,这样您就可以知道要获取的对象类型,并且不必将其转换为您期望的那种类型(这在提供其他任何内容时变得更加重要)比原始人)。

由于这个原因(加上它会使得到的代码更简单,更容易阅读)我会选择第一个。在任何大型应用程序中,您还可以快速,轻松,整齐地将参数值返回到对象本身的调试代码中。

如果其他人也打算使用这个代码(或者你忘记了它之后再计划工作),第一个也会帮助你知道参数等。第二个只会给你这个广泛的javadoc。

答案 2 :(得分:0)

第一个是经典方式。第二个是非常棘手的。