我有一个方法CommitmentListDAO.getListByOwnerBadge
的DAO,它针对主管徽章(数据库字段OWNED_BY
)返回承诺项的arraylist
String SQL_VIEW_LIST_BY_SUPERVISOR = SELECT_QUERY +
" WHERE c.OWNED_BY = ? " +
" ORDER BY p.PROGRAM_NAME";
现在,我想在我的网络表单上添加一个下拉菜单,以便用户在Owned By
或Tasked To
之间进行选择
我需要在DAO中添加WHERE c.TASKED_TO = ?
子句。
我是否在DAO中执行要搜索的字段的逻辑 - 例如下拉的传入参数(从不是请求对象)并将方法重命名为getListByBadge(String whichField, String badge)
或我的CommitmentListForm
class具有此逻辑,然后对getListByOwnerBadge
或getListByTaskeToBadge
答案 0 :(得分:3)
我会使用两种不同的方法使用DAO来清楚地区分呼叫的作用。
DAO的目的是隐藏SQL实现细节。你应该总是从这个问题的角度考虑这样的问题,"如果我切换到不同的持久性机制,如HBase怎么办?" HBase实现可能不会以简单区分字段名称的方式存储它。 DAO应该可以隐藏这些细节,从而隐藏不同的方法。
当然,只是我的意见。 :)
答案 1 :(得分:2)
我将确定控制器中的逻辑,并将两个SQL查询分成getListByOwnerBadge
或getListByTaskeToBadge
。这样你就可以避免使用“完成所有操作”的方法,并且很快就会失控。此外,选择使用“全部运行”方法的其他开发人员必须检查方法的内部,以查看可以传入哪些有效的字符串,而显式方法调用使得方法实现的内容变得明显。
答案 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时才这样做。