gpt4 book ai didi

java - 设计用于插入和删除域对象的数据库接口(interface) API

转载 作者:太空宇宙 更新时间:2023-11-04 06:35:45 27 4
gpt4 key购买 nike

我正在尝试创建一个良好的 OOP 设计,特别是符合 SRP 的接口(interface),用于与数据库交互以插入和删除 Customer。我的重点是设计,而不是被 SQL 和 JDBC 或数据源的细节所困扰。所以我留下了使用打印行的简单实现。但我想知道这是否是 springs jdbctemplate 的设计方式..

这项工作是在我学习 SRP OOP 设计原理时做出的。设计不当的 Customer 类违反了 SRP,因为它包含数据库插入/删除责任。我从 Customer 类中提取代码,并将其放入一个继承自 RdbmsManager 基类的类中,该基类的职责是建立连接并与数据库交互。我不确定这是否是一个好的设计,而且我也不确定是否需要向子类提供一些类似于 jdbcTemplate 的数据库 API 对象或某些东西来与数据库交互。

客户

public class Customer {

private int id;
private String fullName;
private boolean active;

public Customer(int id, String name, boolean active){
this.id = id;
this.fullName = name;
this.active = active;
}

@Override
public String toString() {
return "Customer [id=" + id + ", name=" + name + ", active=" + active
+ "]";
}
}

父数据库访问类:

public class RdbmsManager{

public RdbmsManager(){
connectToDatabase();
}

private void connectToDatabase(){
// read from properties files to get DB URL, PORT number etc.
// Create Datasource object and establish connection to database
System.out.println("Established Database Connection...");
}

// Below method returns the database object children can use to issue commands
protected DatabaseAPI getDatabaseObject(){
DatabaseAPI databaseObject = new DatabaseAPI ();
return databaseObject;
}

}

CustomerDataManager 子类:

public class CustomerDataManager extends RdbmsManager{

public CustomerDataManager() {
super(); // call to super will establish database connection from parent class
}

public void saveCustomerToDatabase(Customer Customer) {
getDatabaseAPI().insert(Customer);
}

public void deleteCustomerFromDatabase(Customer Customer) {
getDatabaseAPI().delete(Customer);
}
}

数据库交互对象的简单实现,重点设计:

public class DatabaseAPI{

protected void insert(Object object){
System.out.println("inserted the into the database: "+ object.toString());
}

protected void delete(Object object){
System.out.println("Deleted object from database" + object.toString());
}
}

最佳答案

嗯,您已经非常接近使用数据库的标准设计之一了。
主要区别在于类的名称(例如 DAO 而不是 Manager),并且您正在扩展数据库连接池管理器以创建 DAO。

让我详细说明一下:

  1. 数据库应该通过抽象与应用程序分开。为了实现这一目标,您通常在数据库之上创建所谓的数据抽象层。这与您的 RdbmsManager 类有点相似,其要点是抽象出实际使用的数据库。为了实现这一点,您通常有某种数据库访问接口(interface),该接口(interface)将由控制所有数据库连接的某个类来实现(尽量避免名称包含“Manager”,因为它并不能真正帮助阐明这些类的作用)。如果稍后您决定更改正在使用的数据库,您所需要做的就是为支持新数据库的接口(interface)创建一个新的实现,这样您就大功告成了!

  2. 对数据库中实际数据的访问也应该由另一层抽象,通常称为数据访问层。该层包含封装对特定类型数据(通常是每个表)的所有访问的接口(interface),并允许对它们执行 CRUD 操作。这些接口(interface)通常命名为 SomethingDAO,其中“Something”代表正在访问的对象类型(“DAO”部分代表:“数据访问对象”)。同样,这些接口(interface)的实现应该是特定于数据库的,并且当您用另一个数据库替换您使用的数据库时,这些接口(interface)的实现应该被更改。

  3. 数据应该使用其他方法传输到客户端代码(通常是业务/应用程序层),通常是DTO(代表“数据传输对象”)。这些(同样)接口(interface)公开了数据库中表示的对象所需的一些功能,这些功能应该由数据库特定(或通用,这取决于)类来实现。

这就是简单的理论。网上有许多数据源(更不用说书籍),可以让您阅读更多相关内容。

另一方面,这只是实现数据库连接的一种方法。还有许多其他设计模式,因为有很多设计模式通常涉及企业应用程序,特别是层间通信。让我向您推荐我认为这些设计模式的最佳来源:Patterns of Enterprise Application Architecture

编辑 1:这是一个非常简单的代码示例(当然未经测试 - 视为伪代码):

public interface Customer { ... }

public interface CustomerDTO implements Iterable<Customer> { ... }

public class CustomerDTOSQLImpl {
public CustomerDTOSQLImpl(ResultSet resultSet) { ... }

@Override
public Iterator<Customer> iterator() { ... }

...
}

public interface CustomerDAO {
public CustomerDTO findById(int id);

...
}


public class CustomerDAOSQLImpl {
@Inject
private Connection connection;

@Override
public CustomerDTO findById(int id) {
PreparedStatement statement = connection.prepareStatement("SELECT * FROM CUSTOMER WHERE ID = ?");
statement.setInt(1, id);
return new CustomerDTOSQLImpl(statement.executeQuery());
}

...
}

关于java - 设计用于插入和删除域对象的数据库接口(interface) API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25417053/

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