Java 如何为DAO中的复杂查询设计接口(我们是否应该始终为DAO设计通用接口)?

Java 如何为DAO中的复杂查询设计接口(我们是否应该始终为DAO设计通用接口)?,java,dao,mybatis,Java,Dao,Mybatis,当我第一次学习编码时,我被告知要为DAO编写通用接口。不建议设计“findByName”之类的接口,因为findByName与业务逻辑(名称)相关。我使用hibernate的标准来编写通用接口,它工作得很好。虽然我最近使用了mybatis,但很难保持接口的通用性,因为我必须自己编写sql。我写了很多这样的方法: T find(QueryTuple queryTuple); public class QueryTuple { private String key; private

当我第一次学习编码时,我被告知要为DAO编写通用接口。不建议设计“findByName”之类的接口,因为findByName与业务逻辑(名称)相关。我使用hibernate的标准来编写通用接口,它工作得很好。虽然我最近使用了mybatis,但很难保持接口的通用性,因为我必须自己编写sql。我写了很多这样的方法:

T find(QueryTuple queryTuple);

public class QueryTuple {
    private String key;
    private Object value;
    //This is an enum
    private CompareOperqator operator;
    // setter and getter
}
find(new QueryTuple("name", "tom", CompareOperqator.EQUAL));
find(new QueryTuple("gender", "m", CompareOperqator.EQUAL));
dao.query("person").with("name", "tom").with("gender", "m").find();
我调用了find方法,如下所示:

T find(QueryTuple queryTuple);

public class QueryTuple {
    private String key;
    private Object value;
    //This is an enum
    private CompareOperqator operator;
    // setter and getter
}
find(new QueryTuple("name", "tom", CompareOperqator.EQUAL));
find(new QueryTuple("gender", "m", CompareOperqator.EQUAL));
dao.query("person").with("name", "tom").with("gender", "m").find();
然而,如果我想编写一些复杂的查询,我不能让接口保持如此“通用”,我必须编写findByXXAndXX等接口

保留所谓的“通用”真的好吗?我发现Spring数据也支持findByXX这样的接口

我被告知要为DAO编写通用接口

依我看,你不应该重新发明轮子,像这样的事情都已经实现了

但如果你愿意,可以使用。它可以是这样的:

T find(QueryTuple queryTuple);

public class QueryTuple {
    private String key;
    private Object value;
    //This is an enum
    private CompareOperqator operator;
    // setter and getter
}
find(new QueryTuple("name", "tom", CompareOperqator.EQUAL));
find(new QueryTuple("gender", "m", CompareOperqator.EQUAL));
dao.query("person").with("name", "tom").with("gender", "m").find();
请注意,我不传递QueryTuple的实例,只传递构造这些实例的参数。而且它不是类型安全的,只是最简单的实现

with()
方法可以假定
CompareOperator.EQUAL
默认情况下忽略大小写,并且应该有一个包含第三个和第四个参数的版本:

public QueryBuilder with(String property, String value) {
    return with(property, value, CompareOperator.EQUAL, true);
}

public QueryBuilder with(String property, String value, 
                         CompareOperator compareOperator, 
                         boolean ignoreCase) {
    ...
}

它是MBG(mybatis发生器)。我重新发明了一个轮子,就像@scriptin所说的那样。使用xxxByExample非常方便,并且在必要时易于扩展

MybatisAPI已经是一个通用DAO:它允许您定义并执行任何类型的查询。DAO的要点是非泛型的,并将查询创建逻辑封装到功能性的可重用方法中。感谢您的回答,构建模式是一种更好的方法!你也认为界面应该是通用的,但是你怎么认为呢?SpringDataJPA支持“findByEmailAddressAndLastname”这样的接口,“EmailAddressAndLastname”是否通用?所以我想知道哪一个更好。