3

我知道这个问题的标题不是很有描述性,但我不知道如何更好地解释这个问题......

我想知道您对在 DAO 类的实现过程中出现的疑问的看法。

我正在实现一个CustomerDAO必须提供对我的应用程序数据库中相关数据的访问的类。我已经像往常一样实现了经典的 CRUD 方法,但是现在我需要实现一些方法来提供检索到的使用“特定”查询的数据。

我的意思是:

SELECT [...] FROM CUSTOMERS WHERE <CUSTOMER_PROPERTY_1> = 'X' AND <CUSTOMER_SOME_DATE> > ? AND <CUSTOMER_SOME_DATE> < ?

所以我的问题是,要遵循的正确方法或“最佳实践”是什么?实现许多特定方法,例如getCustomersByXPropertyBetweenDates()或尝试泛化查询并实现更“通用”(不是 Java 意义上的)方法?

注意我使用的是纯 JDBC,JdbcTemplate由 Spring Framework v 3.1 提供

4

3 回答 3

1

您将如何进行您列出的“通用”查询?另外,选词不好。

我只会有单独的查询,分开。不要尝试做任何聪明的事情,你有一个特定的查询保持简单不要尝试适应另一个查询。

如果您想要适当的通用性,我建议您使用 ORM

于 2012-06-11T10:04:08.237 回答
0

我认为这是更多的业务驱动的决定。如果您有与不同方法相关的单独业务操作,则可以创建特定方法。如果您有业务操作“高级搜索表单”,其中包含搜索条件的字段包,则使用表单数据创建一个特殊的“查询”实体类更有意义,然后通过DAO实现将其转换为sql查询。

另外,请查看查询 dsl,它可能会简化很多 DAO 层。

于 2012-06-11T09:38:13.767 回答
0

实现一个抽象 DAO 类,该类定义/实现所有 DAO 的通用方法(CRUD)。在特定的 DAO 接口中定义业务方法并在 DAO 类中实现。

public interface IDAO< T extends Serializable>{

   T save( final T entity );
   T update( final T entity);
   void delete( final long id );
   void deleteAll();
   T findOne( final long id );
   List< T > findAll();

}

public abstract class AbstractDAO< T extends Serializable > implements IDAO< T >{




protected abstract JdbcTemplate getTemplate();


protected abstract T save(T entity);

    ...

}

客户 DAO 接口将定义业务特定方法

public interface ICustomerDAO extends IDAO<Customer>
{
   public List<Customer> findDormantCustomers();

}

客户 DAO 实现将如下所示。

public class CustomerDAO extends AbstractDAO<Customer> implements ICustomerDAO{

public Customer save(Customer customer){
   getTemplate().insert(...);
   return customer;
}

    public List<Customer> findDormantCustomers(){
       ...
       return;
    }
}
于 2012-06-11T10:58:19.787 回答