【问题标题】:Where should logic go for deciding which SQL query to execute逻辑应该去哪里来决定执行哪个 SQL 查询
【发布时间】:2011-01-26 01:20:20
【问题描述】:

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

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

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

我是否执行在 DAO 中搜索哪个字段的逻辑 - 比如说下拉的传入参数(从不请求对象)并将方法重命名为 getListByBadge(String whichField, String badge) 或者我的 CommitmentListForm 类是否应该有这个逻辑然后适当地调用getListByOwnerBadgegetListByTaskeToBadge

【问题讨论】:

  • 所有答案似乎都表明相同 - 使用多个 DAO 方法并让控制器处理逻辑。谢谢!当我的 IT 部门在服务器上升级 java 时,我可以使用 BalusC 在其 UserDAO balusc.blogspot.com/2008/07/… 中使用可变参数的方法

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


【解决方案1】:

我会在其上使用 DAO,并使用两种不同的方法来清楚地区分调用的作用。

DAO 的意义在于隐藏 SQL 实现细节。您应该始终从以下角度考虑这样的问题:“如果我切换到不同的持久性机制,比如 HBase,会怎样?” HBase 实现可能不会以仅通过字段名称区分的方式存储它。 DAO 应该可以隐藏该细节,从而隐藏不同的方法。

当然,这只是我的看法。 :)

【讨论】:

    【解决方案2】:

    我将确定您的控制器中的逻辑并将两个 SQL 查询分成getListByOwnerBadgegetListByTaskeToBadge。这样,您就可以避免使用一种“无所不能”并且可能很快失控的方法。此外,选择使用“does it all”方法的其他开发人员将不得不检查该方法的内部结构,以查看可以传入哪些有效字符串,而显式方法调用可以清楚地表明该方法正在完成什么。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        总结一下:

        来自@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 时才这样做。

        【讨论】:

        • 我通常最终会拥有很多不同的过滤器,并且不确定是否应该在 SQL 标准中传递过多的方法。现在,我采用了单独的方法。一旦我们的 IT 升级了 java,我就可以将常量用于 SQL 字符串和可变参数
        猜你喜欢
        • 2017-03-27
        • 2011-06-28
        • 1970-01-01
        • 1970-01-01
        • 2011-04-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多