gpt4 book ai didi

java - 建模数据库关系

转载 作者:行者123 更新时间:2023-12-04 05:51:57 24 4
gpt4 key购买 nike

我认为描述问题的最佳方法是使用示例。我将通过删除不需要的实现细节来使其尽可能简单。

假设有一家书店。商店使用后端数据库存储所有数据,并使用 Java 前端将它们呈现给商店经理,从而跟踪所有书籍、客户和订单。

数据库包含以下关系:

  1. Book ( id, title, author )
  2. Customer ( id, name, tel, address )
  3. Order ( id, date, custId, bookId )


另一方面,Java 接口(interface)使用 JDBC驱动程序连接到数据库并检索数据。该应用程序由以下类组成:

Book
BooksDataLoader
BooksTableModel
BooksView

Customer
CustomersDataLoader
CustomersTableModel
CustomersView

Order
OrdersDataLoader
OrdersTalbeModel
OrdersView



这些类使用各自的设计指南,您可以使用以下源代码作为引用:
public class Book {
private String id;
private String title;
private String author;

/*
* Builder pattern is used so constructor should be hidden. Book objects
* are built in the BooksDataLoader SwingWorker thread.
*/
private Book() {}
}

public class BooksDataLoader extends SwingWorker<List<Book>, Book> {
private final BooksTableModel booksModel;
private final List<Book> books = new ArrayList<Book>();
}

public class BooksTableModel extend AbstractTableModel {
private final String columnNames = { "Book ID", "Book Title", "Book Author" };
private final List<Book> books = new ArrayList<Book>();
}

public class BooksView extends JPanel {
private final JTable booksTable;
private final BooksTableModel booksModel;
}

我正在使用 Builder pattern实现类 Book、Customer 和 Order。这些类的实例是使用 SwingWorker 线程内的数据库检索的数据构建的,并使用 AbstractTableModel 发布到 View 。因此,实际上应用程序包含以下 View (JPanels):BooksView、CustomersView 和 OrdersView,每个 View 都包含一个 JTable,其列如下所示:

BooksView.booksTable: Book ID | Book Title | Book Author

CustomersView.customersTable: Customer ID | Customer Name

OrdersView.ordersTable: Order ID | Date | Customer Name | Book Title | Book Author



当我们尝试将表示数据库中外键的实例变量解析为它链接的数据时,就会出现问题。例如,OrdersTableModel 具有在数据库中找到的所有 Order 对象的 List 结构,但是 OrdersView 表的第 3、4 和 5 列不能直接从 Order 对象访问,因为它只包含书籍的 id 和客户,而不是实际数据。我尝试的一种解决方案是在每个 Book、Customer 和 Order 类中创建一个静态 HashMap,以跟踪所有检索到的对象,但这会导致数据重复,因为我们已经在表中拥有检索到的对象的 List 结构每个 View 的模型。

我正在寻找一种高效且可扩展(面向对象)的设计解决方案/建议。

先感谢您。

最佳答案

您绝对应该使用像 Hibernate 或 EclipseLink 这样的 ORM 或任何适合您的技术。目前,JPA2 是每个此类工具实现的通用标准。您可以使用注释或 xml 文件定义对象和数据库模型之间的映射。

这些工具还提供了根据您的对象模型生成数据库模式的方法(如果您有旧方案,甚至可以使用其他方法)。

我建议您不要使用 jpa 标准 api,因为它的设计存在很大缺陷。有许多框架可以帮助您构建查询。 QueryDSL 对我来说似乎非常好。我使用规范模式(我实际上是在后台使用标准 api 实现的)来抽象查询构造。见 http://martinfowler.com/apsupp/spec.pdfhttp://adrianhummel.wordpress.com/2010/07/02/composed-specifications-using-jpa-2-0/供第一次引用。

并对 DAO 模式和存储库(来自领域驱动设计的术语)进行一些搜索。

关于java - 建模数据库关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9952997/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com