我知道这个问题的标题不是很具描述性,但我不知道如何更好地解释这个问题......
我想知道您对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
答案 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;
}
}