当我第一次学习编码时,我被告知要为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等接口。
答案 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非常方便,如果需要可以轻松扩展!