gpt4 book ai didi

java - 泛型和字段如何在 Standalone Java 应用程序中辅助 DAO 模式

转载 作者:行者123 更新时间:2023-11-30 09:23:56 25 4
gpt4 key购买 nike

//Interface DAO

public abstract class BaseDAO<T extends BaseDTO> {


public void update(T t) throws DBException {
Field[] fieldsToInsert = t.getClass().getDeclaredFields();
//code to update database object academic or event
}

public Integer create(T t) throws DBException {
Field[] fieldsToInsert = t.getClass().getDeclaredFields();
//code to create academic or event in database
}

}



//Concrete DAOs
public class AcademicDAO extends BaseDAO<AcademicDTO> {
//provide implementation
}

public class EventDAO extends BaseDAO<EventDTO> {
//provide implementation
}



//Transfer object
public class AcademicDTO extends BaseDTO {
String title;
String surname;
//getters and setters
}


public class BaseDTO {

protected Integer ID;

public Integer getID() {
return ID;
}

public void setID(Integer ID) {
this.ID = ID;
}
}

大家好,我有一个示例代码遵循上述结构来创建一个小型 Java 应用程序来管理学术和 Activity 。很宽容地遵循这个pattern

1-你们专家比我更熟悉这种模式。我想了解为什么在这种情况下使用泛型,以便 DAO 可以扩展和实现泛型基类。如果可以使用一个示例来说明这里的泛型有何优势,那就太好了。

2 - 我也亲眼目睹了java Fields的使用。泛型和字段之间有联系吗?

我想在学术报告中记录 DAO 模式,但我发现很难理解GenericsReflect Field 如何在这里发挥作用。它们是否支持灵 active 和松散耦合?

最佳答案

您提供的代码是一组可重用的逻辑,用于加载和保留实体。很多时候,在一个非常大的应用程序中,您最终会持久化许多不同类型的对象。在此示例中,您可以根据需要定义尽可能多的对象,但只定义实际保存和加载一次的逻辑。通过询问 DTO 那里有哪些 Field 对象,它可以获取数据以帮助构建用于加载和保存的查询。

泛型允许您在使用此模式的同时保持类型安全。 AcademicDAO 只能处理AcadmeicDTO。您不能使用 AcademicDAO 来存储 EventDTO。泛型允许类的实例在处理 Field 对象时依赖于更具体的类型。如果您没有泛型,BaseDAO 将采用 Object,您将无法访问除 Object 提供的方法之外的任何方法,因为 JVM 不会知道提供了什么类,因此它必须将其知识限制为 Object。使用 getClass().getDeclaredFields() 绕过了该限制,因为 getClass() 返回了 Object 参数的实际类。

Field 只是一种使用反射来访问每个 DTO 中的属性值的方法。如果您必须使用 getTitle() 直接访问这些字段,则无法重用通用基类来进行持久化。当您需要访问 EventDTO 时会发生什么?您必须为此提供逻辑。 Field 允许您跳过该逻辑。

编辑:

为了解释访问 getID 的意思,您可以在 BaseDAO 中执行以下操作,因为已知 T 是一个 BaseDTO 定义了一个 getID() 方法:

public abstract class BaseDAO<T extends BaseDTO> {

public boolean update(T t) throws DBException {
Integer id = t.getID();
Field[] fields = t.getClass().getDeclaredFields();
// Assuming you have a db object to execute queries using bind variables:
boolean success = db.execute("UPDATE table SET ... WHERE id = ?", id.intValue());
return success;
}
}

如果你有这个(在非通用类中):

public boolean update(Object o) throws DBException {
// This line doesn't work, since Object doesn't have a getID() method.
Integer id = t.getID();
Field[] fields = o.getClass().getDeclaredFields();

boolean success = db.execute("UPDATE table SET ... WHERE id = ?", id.intValue());
return success;
}

您必须查看那些 Field 对象,或者询问 ID 字段并假设它存在。

关于java - 泛型和字段如何在 Standalone Java 应用程序中辅助 DAO 模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15845509/

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