我正在开发一个小型的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
答案 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();