簡體   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