Java 复杂逻辑sql

Java 复杂逻辑sql,java,sql,model-view-controller,javafx,dao,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) { }

我正在开发一个小型的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类,但是如果我需要获取从xx到yy的所有客户机,我需要添加另一个重载的find方法??如果我想找到所有年龄在xx和yy之间的客户机,我将找到另一个函数?? 那似乎不是一个好的设计

我知道我做错了,我想知道正确的方法


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

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

对于这类问题,该方法是一个很好的解决方案。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();
    }

}
公共类ClientDAO{
公共静态最终类过滤器{
过滤器(){
//为简洁起见,未显示代码
}
使用NameLike(字符串名称)的公共筛选器{
//为简洁起见,未显示代码
}
公共筛选器createdAfter(日期fromDate){
//为简洁起见,未显示代码
}
在之前创建的公共筛选器(日期fromDate){
//为简洁起见,未显示代码
}
公共列表查询(){
//为简洁起见,未显示代码
}
}
公共静态筛选器(){
返回新过滤器();
}
}
然后,它可以像这样使用:

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

你打算使用像Hibernate这样的ORM吗?不,我只使用JDBC。是的,你必须为每种情况添加一个finder方法。请记住,这个DAO类只是一个接口,它的存在是为了让用户知道如何找到对象。这并不意味着它的实现会有重复的代码——客户机不在乎,这对客户机来说无关紧要。如果存在重复,那么请编写代码将其删除(可能在内部重用某些find方法),但外部接口必须清晰。您可以创建一个采用
客户端
对象的方法。然后,在方法中,可以检查字段是否为null。如果不为null,则为该字段创建
where
查询…@kucing\u terbang,当然,它假定您不需要
where列为null
查询。