簡體   English   中英

構建數據庫管理 Java 應用程序的正確方法是什么?

[英]What is the correct way to structure a Database Management Java application?

首先,如果我聽起來不連貫,請原諒我,因為我仍然是初學者並且不太確定如何用這些詞來表達。

我正在使用 SQLite 作為數據庫在 JavaFX 中創建一個圖書館管理系統。 我已經熟悉如何在 Java 中處理 SQL 查詢並且我的應用程序可以正常運行。 但是,我現在正在重構應用程序以使其遵循 OOP 原則。 我的問題是關於涉及查詢數據庫的方法我應該采取什么方法。

在一個普通的應用程序中,我想我會在相關的類中編寫這些方法 - 例如,一個查看書籍信息的方法將包含在“Book”類中。 但在這里,這將涉及創建一個新的數據庫連接或傳遞當前的連接,我的直覺告訴我這不是正確的方法。 我應該有一個單獨的類來存儲連接並處理所有數據庫操作嗎? 解決這個問題的正確方法是什么?

問題是,關系表不能很好地映射到對象。 如何:

SELECT author.name, book.title,
book.lang = author.native_tongue AS nativeWritten
FROM book LEFT JOIN author ON author.id = book.author;

轉化為對象?

它沒有。

如果你想在任何地方,或者至少在大多數地方放棄 SQL 的力量,並且基本上做SELECT * FROM book WHERE unid = 1; 不用再進一步了,您可以過分簡化,即有一個 Book 類型的類,它與 book 表相匹配,並且可以合理地封裝您可能想要對涉及書籍的 DB 執行的所有操作,好吧,好吧,您可以重新發明輪子並重寫所有 JPA/Hibernate,或者您只是使用它。

或者,您應該查看 JDBI 或 JOOQ,它們放棄了“db 中的表 == java 中的類”的想法,並且更面向 SQL。 這些有各種各樣的教程和指南,可以向您展示如何使用它們。

如果你真的堅持要重新發明這個輪子:傳遞一個連接對象並不瘋狂。 這是執行規定任務所需要的。 就像是:

public static Book getById(Connection db, int unid) throws SQLException { ... }

是一種方式。 一種使測試更輕松的稍微復雜的方法是:

public class DbBridge {
    public Book getById(int unid) throws SQLException { ... }
}

讓您抽象出如何完成這項工作的概念,但是.. 那么這意味着您將 DbBridge 對象傳遞給所有內容。

“我在很多地方都需要這個有點復雜、有狀態的概念,它幾乎就像一個配置”的一般原則是一個常見問題。 這就是諸如 dagger 之類的“依賴注入”框架試圖解決的問題。 你也可以重新發明那個輪子,或者只是其中一個。 如果您想重新發明,那么請查看這些項目的工作原理,以便了解可用的解決方案。

注意:如果您選擇 SQLite 是因為它是“精簡版”,那么它不是。 不是從 java 的角度來看:您需要一個本機可執行文件才能使用它。 一種更簡單、更輕便的方法是使用基於 Java 原生文件的數據庫引擎,例如 H2 或 JavaDB。 如果您需要可以從非 Java 應用程序訪問該數據庫,或者您或多或少被迫使用它,例如因為您正在編寫 android 應用程序,請僅使用 java 中的 SQLite。 在復雜性方面,從 Java 的角度來看,SQLite 與完整的 postgres 或諸如此類的東西一樣復雜。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM