我想为我的应用程序创建一个 DAO 层。经过一番谷歌搜索,我发现很多人使用通用 DAO 方法(不要重复 DAO!)。
但我不喜欢这种方法。
如果我需要不同 DAO 实现的 DAO 之间的接口略有不同怎么办?(即通用接口中的方法与我想在我的 DAO 实现中创建的方法不完全相同)
如果我的实体的主键包含多个属性怎么办?
我想为我的应用程序创建一个 DAO 层。经过一番谷歌搜索,我发现很多人使用通用 DAO 方法(不要重复 DAO!)。
但我不喜欢这种方法。
如果我需要不同 DAO 实现的 DAO 之间的接口略有不同怎么办?(即通用接口中的方法与我想在我的 DAO 实现中创建的方法不完全相同)
如果我的实体的主键包含多个属性怎么办?
如果您需要为特定实体稍微不同的 DAO,您总是可以扩展一个通用的(MySpecificDAO <....> extends GenericDAO<....>)
。主键本身可以是复合的,但不可能有 2 个主键。
直接来自您链接到的文章:
扩展 GenericDAO
当然,每个 DAO 的接口都基于 GenericDao 接口。我只需要将接口调整为特定的域类并将其扩展为包含我的查找器方法。在清单 6 中,您可以看到为特定目的扩展的 GenericDao 接口示例
关于你的最后一个问题:根据定义,一个实体只有一个主键。
缺点:你仍然需要实现 DAO。停止遵循 6 年前的建议,改用Spring Data 存储库。然后您根本不必编写任何实现。
如果我需要不同 DAO 实现的 DAO 之间的接口略有不同怎么办?
你可以覆盖你的GenericDaoImpl
类中的方法。或创建一个新方法。
如果我的实体有 2 个或更多主键怎么办?
我猜你的意思是复合键场景。请注意,通常 findOne/readOne/getOne 方法GenericDao
需要一个参数,(T key)
这里的 T 是类型,它可以是复合主键。
例如:
class PersonPK{
private String name;
private Date birthday;
.....
}
你可以在这里找到一个通用 DAO,它是那篇文章的工作和改进实现。只需检查页面底部的Example.java 。在此示例中,您可以看到如何定义“针对不同 DAO 实现的 DAO 之间略有不同的接口”。