为每层表结构获取 DAO
Posted
技术标签:
【中文标题】为每层表结构获取 DAO【英文标题】:Getting DAOs for Table-per-Hierarchy structure 【发布时间】:2011-10-01 12:22:47 【问题描述】:假设我有一个User
类和两个子类Employee
和Customer
。我将此层次结构实现为 DB 中的每个层次结构的表,其中有一列用于指定用户的类型。查询此表时,我需要返回正确类型的对象。
我是否需要为每种类型的对象(如 CustomerDAO
或 EmployeeDAO
)提供单独的 DAO,因此每个对象都返回各自的 Customer
和 Employee
对象。如果是这样,如何在不使用的情况下从DAOFactory
获取它们:
if(type.equlas('customer'))
return customerDao;
else
retrun employeeDao;
因为实现User
的类型可能会改变,我不想每次都改变条件。
或者还有其他方法吗?任何想法将不胜感激。
注意:我没有使用任何 ORM 框架,也不打算使用。
【问题讨论】:
你能多谈谈你的类层次结构吗? Employee 是 User 的子类,还是两个实体之间存在某种联系?另外,您希望从您的 DAO 中返回什么引用类型? @jtoberon 是的 Employee 和 Customer 是 User 类型。我只有用户 ID。根据这些 ID,我必须查询同一个表,如果用户类型为客户,则获取Customer
,如果类型为员工,则获取 Employee
。
【参考方案1】:
如果每种类型的持久性代码相同,则可以有 1 个通用 DAO。
所以你的用户 dao,可能是这样的:
interface DAO<T, ID>
T create(T t);
T read(ID id);
T update(T t);
void delete(T t);
class UserDAO<T extends User> implements DAO<T>
// Your methods for crud operations will be limited to types of User.
然后你的工厂类可以简单地通过指定正确的类型来实例化正确的 DAO。
class DAOFactory
public UserDAO<Employee> getEmployeeDAO()
return new UserDAO<Employee> ();
问候 优素福
【讨论】:
不,每个DAO的代码都不一样。每个对象都需要填写各自的数据。我认为这样我仍然需要检查if ... else
中的对象类型以获得所需的 DAO。
我认为没有必要检查您的工厂是否有针对每种类型的方法...?您的 if 语句暗示您返回的 DAO 是通用的。是这样吗?
也许我在这里遗漏了一些东西,但我不需要知道我想要什么类型的 DAO,在 DAO 工厂上调用正确的方法。无论如何感谢您的回复。我试图以另一种方式解决问题,以消除对多个 DAO 的需求。下次我遇到类似的问题时,我想我会尝试反射。
只有当你知道你正在使用什么数据时,从工厂返回正确的 DAO 才有意义。因此,当您想在不知道任何类型的情况下(这正是您想要的)查询表时,您必须使用基类的 DAO,它将返回用户引用。
这就是我想知道的。用户对象对我不起作用。我需要具体的子类,例如 Customer 和 Employee。以上是关于为每层表结构获取 DAO的主要内容,如果未能解决你的问题,请参考以下文章
mybatis根据数据库表结构自动生成实体类,dao,mapper