将哪些方法实现为“正确”的DAO类?

时间:2012-06-11 09:24:05

标签: java spring design-patterns jdbc

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

我想知道您对DAO课程实施期间出现的疑问的看法。

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

我的意思是:

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

所以我的问题是,接下来的正确方法或“最佳实践”是什么?实现许多特定方法,如getCustomersByXPropertyBetweenDates()或尝试概括查询并实现更“通用”(不是Java语义)方法?

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

3 个答案:

答案 0 :(得分:1)

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

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

如果您想要正确的通用I'd suggest using an ORM

答案 1 :(得分:0)

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

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

答案 2 :(得分: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;
    }
}