繁体   English   中英

具有数据库访问权限的OOP编程

[英]OOP Programming with database access

我正在一个具有数据库访问权限的项目。 这是我已经实现的类的概述

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示例时,我发现大多数人都使用其他类来访问数据库。 我不知道我要说的是什么错误。 这些代码访问数据库以初始化每个成员变量。 但是在我的代码数据库中可以访问一次以初始化我的对象。 我应该改变这种方法。 如果我更改, 它将在希望一起初始化更多对象(可能是数百个)时影响我的应用程序的速度 我认为这可能是一个重复的问题。 但是对于我的特定问题,我没有找到满意的答案。

这是一种设计选择,某些人喜欢将其程序模块化,因此,由于修改和维护不会影响其他类,因此这是一个好习惯。

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

您的方法违反了“ 单一职责原则”“关注点分离” -基本上,一个类不应同时是域类和访问数据库。

每个成员变量都被独立初始化并且涉及数据库调用的初始化的方法更加糟糕,而且也行不通-并违反了之前提到的“ 单一职责原则”和“根本不会执行的关注点分离”

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

在您的情况下,这意味着您将最终获得可能类似于以下内容的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类时,您将重复定义BarDao的模式,并根据需要再次实现。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM