逻辑应该在哪里决定执行哪个SQL查询

时间:2011-01-25 16:01:34

标签: java model-view-controller web-applications

我有一个方法CommitmentListDAO.getListByOwnerBadge的DAO,它针对主管徽章(数据库字段OWNED_BY)返回承诺项的arraylist

    String SQL_VIEW_LIST_BY_SUPERVISOR = SELECT_QUERY + 
    " WHERE c.OWNED_BY = ? " +
    " ORDER BY p.PROGRAM_NAME";

现在,我想在我的网络表单上添加一个下拉菜单,以便用户在Owned ByTasked To之间进行选择 我需要在DAO中添加WHERE c.TASKED_TO = ?子句。

我是否在DAO中执行要搜索的字段的逻辑 - 例如下拉的传入参数(从不是请求对象)并将方法重命名为getListByBadge(String whichField, String badge)或我的CommitmentListForm class具有此逻辑,然后对getListByOwnerBadgegetListByTaskeToBadge

进行适当的调用

4 个答案:

答案 0 :(得分:3)

我会使用两种不同的方法使用DAO来清楚地区分呼叫的作用。

DAO的目的是隐藏SQL实现细节。你应该总是从这个问题的角度考虑这样的问题,"如果我切换到不同的持久性机制,如HBase怎么办?" HBase实现可能不会以简单区分字段名称的方式存储它。 DAO应该可以隐藏这些细节,从而隐藏不同的方法。

当然,只是我的意见。 :)

答案 1 :(得分:2)

我将确定控制器中的逻辑,并将两个SQL查询分成getListByOwnerBadgegetListByTaskeToBadge。这样你就可以避免使用“完成所有操作”的方法,并且很快就会失控。此外,选择使用“全部运行”方法的其他开发人员必须检查方法的内部,以查看可以传入哪些有效的字符串,而显式方法调用使得方法实现的内容变得明显。

答案 2 :(得分:1)

我认为第二种解决方案更好。让DAO尽可能简单。没有逻辑,没有标志。创建2个简单的方法,并以形式决定哪个方法调用。或者甚至在表单和DAO之间创建另一个层来决定调用哪个DAO方法。

答案 3 :(得分:0)

总结:

来自@McStretch - 要调用的逻辑进入控制器。

来自@rfreak - 查询方法本身就在DAO中

以下是一个例子:

//Controller
CommitmentListAction {

updateForm(...){ 
  List<CommitmentItem> commitmentItems;
  if (formUsesOwnedBy){
    commitmentItems = CommitmentItemDAO.getListByOwnerBadge(...);
  } else {
    commitmentItems = CommitmentItemDAO.getListByTaskeToBadge(...);
  }
  // Do stuff with commitmentItems.
}
// DAO

getListByOwnerBadge(...){
 String SQL_VIEW_LIST_BY_SUPERVISOR = SELECT_QUERY + 
    " WHERE c.OWNED_BY = ? " +
    " ORDER BY p.PROGRAM_NAME"
  return doQuery(SQL_VIEW_LIST_BY_SUPERVISOR); // Performs the actual query
}

getListByTaskeToBadge(...){
String SQL_VIEW_LIST_BY_TASKED_TO = SELECT_QUERY + 
    " WHERE c.TASKED_TO = ? " +
    " ORDER BY p.PROGRAM_NAME"
  return doQuery(SQL_VIEW_LIST_BY_TASKED_TO); // Performs the actual query
}

如果您要获得CommitmetItems的许多不同视图或许多不同的标准,请考虑将标准传递给DAO。但只有当看起来有过多的getListBy [blah]方法污染DAO时才这样做。