【问题标题】:Dao complex logic sqldao 复杂逻辑sql
【发布时间】:2015-09-05 16:16:48
【问题描述】:

我正在开发一个小型商务应用程序,我需要知道如何传递复杂的逻辑来指示要从数据库中获取哪些客户端

这是我的 ClientDAO 类:

public class ClientDAO {

    public void save(Client clt) {

    }

    public Client find(int id) {

        return null;
    }

    public void update(Client clt) {

    }

    public void delete(Client clt) {

    }
}

这是一个普通的 CRUD 类,但是如果我需要从日期 xx 到 yy 获取所有客户端,我需要添加另一个重载的 find 方法??如果我想找到所有年龄在 xx 和 yy 之间的客户,我会再找一个功能吗? 这似乎不是一个好的设计

我知道我做错了什么,我想知道正确的做法。

PS:我将使用没有任何 ORM 的 JDBC

【问题讨论】:

  • 你打算使用像 Hibernate 这样的 ORM 吗?
  • 不,我以前只使用 jdbc
  • 是的,您必须为每个案例添加一个查找器方法。请记住,这个 DAO 类只是一个接口,它的存在是为了让用户知道通过什么可以找到对象。这并不意味着它的实现会有重复的代码——客户不在乎,对客户来说也没关系。如果有重复,那就好好写代码去掉(可能内部复用一些find方法),但是对外接口一定要清晰。
  • 好吧,您可以创建一个采用Client 对象的方法。然后,在该方法中,您可以检查该字段是否为空。如果不为空,则为该字段创建 where 查询...
  • @kucing_terbang 当然假设您不需要WHERE column IS NULL 查询。

标签: java sql model-view-controller javafx dao


【解决方案1】:

当不使用 ORM 时,创建多个查询数据的方法是正确的方法。 DAO 的目的是将应用程序的其余部分与数据库访问逻辑完全隔离,这意味着 DAO 是唯一知道表名和列名的类。

现在,对于高级主题:如果应用程序需要使用各种条件来查询表,那么为每个组合创建一个新方法会很麻烦,并且在单个方法上设置太多参数也不合适要么。

对于此类问题,builder pattern 是一个很好的解决方案。您的 DAO 可以实现一个 filter() 方法,该方法返回一个构建器对象,具有良好的标准方法和最终的 execute() 方法:

public class ClientDAO {

    public static final class Filter {
        Filter() {
            // code not shown for brevity
        }
        public Filter withNameLike(String name) {
            // code not shown for brevity
        }
        public Filter createdAfter(Date fromDate) {
            // code not shown for brevity
        }
        public Filter createdBefore(Date fromDate) {
            // code not shown for brevity
        }
        public List<Client> query() {
            // code not shown for brevity
        }
    }

    public static Filter filter() {
        return new Filter();
    }

}

然后可以这样使用:

List<Client> clients = ClientDAO.filter()
                                .withNameLike("%John%")
                                .createdAfter(fromDate)
                                .query();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-12
    • 2017-05-13
    • 2010-10-22
    • 1970-01-01
    • 2011-03-24
    • 2020-02-04
    • 2013-09-15
    相关资源
    最近更新 更多