如何在DAO中设计复杂查询的接口(我们应该总是为DAO设计通用接口)吗?

时间:2014-10-11 09:59:07

标签: java dao mybatis

当我第一次学习编码时,我被告知要为DAO编写通用接口。不建议设计接口“findByName”之类的东西,因为findBy Name 与业务逻辑(名称)相关。我使用了Criteria of 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方法:

find(new QueryTuple("name", "tom", CompareOperqator.EQUAL));
find(new QueryTuple("gender", "m", CompareOperqator.EQUAL));

但是如果我想写一些复杂的查询,我不能保持接口这么“通用”,我必须编写findByXXAndXX等接口。

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

2 个答案:

答案 0 :(得分:0)

  

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

IMO,你不应该重新发明轮子,这样的事情都已经实现了。

但如果您愿意,请使用Builder pattern。它看起来像这样:

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) {
    ...
}

答案 1 :(得分:0)

这是MBG(mybatis生成器)。我像@scriptin说的那样重新发明了一个轮子。使用xxxByExample非常方便,如果需要可以轻松扩展!