道复杂逻辑sql

时间:2015-09-05 16:16:49

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

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

这是我的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类,但如果我需要将所有客户端FROM日期xx提取到yy,我需要添加另一个find方法重载?如果我想找到所有有xx和yy年龄的客户我将另一个找到函数? 这似乎不是一个好的设计

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

PS:我将在没有任何ORM的情况下使用JDBC

1 个答案:

答案 0 :(得分:2)

当不使用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();