DAO 中应该包含哪些方法?

What methods should be contained in the DAO?

问题是关于模式理解本身,而不是关于具体的实现。

我已经阅读了有关 DAO 模式的内容,出现的问题是 DAO 中应该包含哪些方法?例如,

public interface UserDAO{

    public User getUserById(Integer id);

    public void deleteUser(Integer id);

    public void updateUser(Integer id, User user);

    public void createUser(User user);
}

我们可以说接口满足DAO-模式吗?如果不是,我应该add/remove从中得到什么方法呢?

如果我们讨论的是更通用的方法,那么您可以使用:

public interface GenericDao<D>{

    public D get(Long id);// as Id use Long instead of Integer, Ids can be very large numbers, Int can be not enough

    public Collection<D> getList(SearchCriteria crit); //for retrieving more than one element 

    public void remove(Long id);

    public void update(D entity); // remember that updated record should have already id inside, you can add assert inside

    public void create(D entity); // assert that id is null
}

最后一步可以将 update/add 替换为保存方法(可选)。

你可以使用泛型,并让 D 实现一些具有 getId() 方法的接口,这将有助于为所有 DAO 编写一个 class,作为父代,将减少你的代码:)

public interface Model implement Serializable{

   Long getId();

}

在你的 DAO 内部,你会这样写:

public interface UserDAO <D extends Model>{
...

从这一点开始,您可以在 GenericDaoImpl 内部实现所有 crud 操作。而你所有的 dao,比如 UserDao 将简单地扩展 GenericDaoImpl,而像 UserDao 这样的 Dao 接口将扩展 GenericDao 接口。

因此,您将在 Generic classes 中隐藏通用逻辑,并仅向某些 Dao 添加特定方法,例如通过电子邮件、用户名或年龄获取用户:) 您的代码将更清晰、更具可读性。

基本上DAO层包含CRUD(Create, Read, Update, Delete)操作相关的函数。由于你的界面大多只包含这些功能,所以你的界面是可以接受的。如果您想要通用的,那么其他答案也不错。您还可以根据需要添加更多 CRUD 功能,例如:

getUserByEmail(String email){}

您也可以添加这些类型的函数..