DAO层应该实现哪些方法?

时间:2015-11-13 14:17:13

标签: java database dao

我正在编写Web应用程序,并且在设计DAO层的阶段陷入困境。已经浏览了关于该主题的各种文章,但仍未达到清晰度。 我的问题是: 在DAO类中允许声明和实现哪种方法? 它们只是有限的CRUD操作集(创建,读取,更新,删除)吗?在开发业务逻辑层时,使用一些适合您具体需求的自定义方法来扩展此集合是否被认为是一种很好的做法? 例如: 我有一个名为User的实体类,该字段完全反映了相应的数据库表。我们假设我即将在授权时验证用户的登录名和密码。在那种情况下,哪种方法更合适?我应该调用通用CRUD方法List<User> findAll()来检索所有用户,并在业务逻辑方法中验证这些具体的登录名和密码(类似boolean validateUser(String login, String password, List<User> users))。或者我应该直接在DAO类中添加一些不是boolean checkUser(String login, String password)的CRUD方法吗?

2 个答案:

答案 0 :(得分:1)

简短回答是否定的:不要在dao层中添加任何业务逻辑。让每一层都有自己的责任,所以当别人(甚至你)需要改变时,他们就会知道在哪里看。

编辑: 其他答案:

问:在DAO类中允许声明和实现哪种方法?

答:允许您访问数据库对象或其属性的方法。即public User getOldUsers(),public boolean isUserExist(Long userId)etc ...

问:它们只是有限的CRUD操作集(创建,读取,更新,删除)吗?

答:是的,您可以控制持久性或交易属性

问:通用CRUDS?

答:我工作的几乎所有项目都使用通用的CRUDS(AbstractDao类)并添加其他方法

答案 1 :(得分:1)

  

我正在编写Web应用程序,并且在设计DAO层的阶段陷入困境。

您是使用普通的旧servlet手动编写它还是使用Web框架(例如Spring MVC)来缓解您的痛苦?

  
      
  1. 我的问题是:允许在DAO类中声明和实现哪种方法?它们只是有限的CRUD操作集(创建,读取,更新,删除)吗?**
  2.   

一般来说,是的 - 方法应限于CRUD操作。

  
      
  1. 使用一些适合您开发业务逻辑层的具体需求的自定义方法扩展此集合是否被视为一种好习惯?**
  2.   

在合理的范围内,是的。

  

例如:我有一个名为User的实体类,其中的字段完全反映了相应的数据库表。我们假设我即将在授权时验证用户的登录名和密码。在那种情况下,哪种方法更合适?我应该调用通用CRUD方法List findAll()来检索所有用户并在业务逻辑方法中验证这些具体的登录名和密码(类似于boolean validateUser(String login,String password,List users))。或者我应该直接在DAO类中添加一些不是像布尔检查器(String login,String password)这样的CRUD方法吗?

除了DAO类预期的标准CRUD方法之外,您还可以添加一个辅助方法,如: User findUser(String login),其作用是返回指定User参数的填充login对象;如果登录不存在,则返回null。

User findUser(String login)应该使用已存在的List<User> findAll()与DAO类中的其余CRUD方法。它可以实现如下:

public User findUser(String login) {
    User user = null;
    final SearchCriteria criteria = buildSearchCriteria(login); // construct a search criteria from the login parameter
    List<User> users = findAll(criteria);  
    if (null != users) {
       assert (users.size() == 1) : "More than one user was matched - login must be unique.";
       user = users.get(0);
    }
    return user;
}

总而言之,您只需要2种方法来实现授权逻辑:

    您的DAO图层中的
  1. User findUser(String login)

  2. boolean checkUser(String login, String password)将位于您的前端层。如果您没有使用任何Web框架,则此方法将在您的servlet中实现,否则此方法将进入您的控制器类(如果您使用的是MVC框架)。