1

我正在开发一个具有数据库访问权限的项目。这是我实施的课程的大纲

public class Foo {

    private String id;
    private String name;
    private int x;
    private String y;
    private String z;
    ...

    public Foo(String id) throws SQLException {
       this.id=id;
       try (Statement stmt = MyConnectionManager().getConnection().createStatement()) {
          ResultSet rs = stmt.executeQuery("SELECT * FROM " + TABLE_NAME
                + " WHERE(id='" + this.id + "')");
          if (!rs.next()) {
             throw new NoExistException();
          }
          this.name = rs.getString("Name");
          this.x = ...
          ...
       } catch (SQLException ex) {
          throw ex;
       }
    }
    public int getId() {
       return this.id;
    }

    public String getName() {
    .
    .
    .

但是当我查看大多数 oop 示例时,我发现大多数人使用额外的类来访问数据库。我不知道我要说的是一个错误。这些代码访问数据库以初始化每个成员变量。但是在我的代码中,数据库只被访问一次来初始化我的对象。我应该改变这种方法吗?如果我改变它会影响我的应用程序的速度,当它想要一起初始化更多对象时(可能是数百个)。我认为这可能是一个重复的问题。但我没有为我的特定问题找到任何令人满意的答案。

4

2 回答 2

3

这是一种设计选择,有些人喜欢将他们的程序模块化,这被认为是一种很好的做法,因为修改和维护不会影响其他类。

如果您为数据库访问(重构)创建一个新类,它允许其他类访问该类,如果它们需要数据库访问。

于 2013-05-01T14:57:19.520 回答
2

您的方法违反了单一职责原则关注点分离- 基本上一个类不应该既是域类又可以访问数据库。

每个成员变量都独立初始化并且初始化涉及数据库调用的方法更糟糕,并且也不会工作 - 以及违反前面提到的单一责任原则关注点分离,它根本不会执行。

最常见的处理方式是通过数据访问层,您可以在其中拥有执行数据库访问并将结果集映射到域类的新实例的类。

在您的情况下,这意味着您最终会得到可能看起来像这样的DAO界面:

public interface FooDao
{
  public Collection<Foo> getAll() throws DaoException;

  public Foo getByIdentity(String id) throws DaoException;

  public Collection<Foo> getByName(String name) throws DaoException;

  public void save(Collection<Foo> foos) throws DaoException;
}

该接口可能有一系列 get 方法或公开某种基于标准的机制,以允许您构建更复杂的查询(我不久前写了一些代码在这里执行此操作)但重要的是它就是这个接口您的代码使用。然后,您可以随意实现此接口(如果您的对象模型很简单,则使用直接 JDBC;如果您需要更高级的东西,则使用 Hibernate)或在您的单元测试中模拟它。

当您引入一个Bar类时,您将重复定义 aBarDao并根据需要再次实现的模式。

于 2013-05-01T14:59:52.447 回答