Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将哪些方法实施到;“正确”;刀类?_Java_Spring_Design Patterns_Jdbc - Fatal编程技术网

Java 将哪些方法实施到;“正确”;刀类?

Java 将哪些方法实施到;“正确”;刀类?,java,spring,design-patterns,jdbc,Java,Spring,Design Patterns,Jdbc,我知道这个问题的标题不是很具有描述性,但我不知道如何更好地解释这个问题 我想知道您对DAO类实现过程中出现的一个疑问的看法 我正在实现一个CustomerDAO类,该类必须提供对应用程序数据库中相关数据的访问。我已经像往常一样实现了经典的CRUD方法,但是现在我需要实现一些方法来提供使用“特定”查询检索的数据 我的意思是: SELECT [...] FROM CUSTOMERS WHERE <CUSTOMER_PROPERTY_1> = 'X' AND <CUSTOMER_SO

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

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

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

我的意思是:

SELECT [...] FROM CUSTOMERS WHERE <CUSTOMER_PROPERTY_1> = 'X' AND <CUSTOMER_SOME_DATE> > ? AND <CUSTOMER_SOME_DATE> < ?
从客户中选择[…],其中='X'和>?和<?
所以我的问题是,应该遵循什么样的正确方法或“最佳实践”?实现许多特定的方法,比如
getCustomersByXPropertyBetweentDates()
,或者尝试泛化查询并实现一个更“通用”(不是Java意义上的)的方法


注意,我使用的是SpringFrameworkV3.1提供的普通JDBC和
JdbcTemplate
,我认为这是一种更为业务驱动的决策。如果您有与不同方法相关的单独业务操作,则可以创建特定方法。如果您的业务操作“advanced search form”(高级搜索表单)包含一组用于搜索条件的字段,那么使用表单数据创建一个特殊的“query”(查询)实体类就更有意义,然后通过DAO实现将其转换为sql查询


另外,请看一下,它可能会简化许多DAO层。

您如何将列出的查询设置为“通用”查询?还有,用词不当

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


如果您想要正确的泛型。

实现一个抽象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);

    ...

}
公共接口IDAO{
T保存(最终T实体);
T更新(最终T实体);
作废删除(最终长id);
void deleteAll();
T findOne(最终长id);
列表findAll();
}
公共抽象类AbstractDAO实现了IDAO{
受保护的抽象JdbcTemplate getTemplate();
保护摘要T保存(T实体);
...
}
客户DAO接口将定义特定于业务的方法

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

}
公共接口ICCustomerDAO扩展IDAO
{
公共列表findDormantCustomers();
}
客户DAO实现如下所示

public class CustomerDAO extends AbstractDAO<Customer> implements ICustomerDAO{

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

    public List<Customer> findDormantCustomers(){
       ...
       return;
    }
}
public类CustomerDAO扩展抽象dao实现iccustomerdao{
公共客户保存(客户){
getTemplate()。插入(…);
退货客户;
}
公共列表findDormantCustomers(){
...
返回;
}
}

<>代码>你考虑命名查询吗?@ RP -使用命名查询的实际优势是什么?我可以在JDBC中也使用它们吗?@davioooh不可以,它不适用于这个问题(spring和jdbcTemplate),它们用于jpa和hibernate等,允许在域对象上定义查询。有点高估了imho。我要说的是,首先要有一个DAO层,它指定了如何有意义地访问(包括查找或查询)数据。您想用一个更简单的API而不是另一个复杂的(-ish)通用API来代替SQL,从而隐藏编写SQL的复杂性。@是的,我完全同意您的看法,因此我将实现“特定”方法。非常感谢你有趣的评论!由于这个问题中解释的原因,我不能使用ORM。当我说“generic”时,我指的是一个更一般的查询(可能仍然是一个糟糕的单词选择)。。。因此,所实现的方法具有更好的可重用性。。。希望这是清楚的,恩…@davioooh天哪,那个链接让我脊梁骨发抖,真糟糕。很清楚您想要什么,但是如何编写代码使您列出的查询适合更通用的形式呢?我想说的是,没有很多工作你是不会成功的。为了什么?只需将查询分开,除非使它们“适合”非常简单。因此,我想我将介绍几种具体的方法。试图实现广义的方法,也许我会把事情复杂化,只获得某种“内部平台效应”,你同意吗?是的。我最近不得不回到这种dao层(与ORM相反),它实际上非常好用。简单,一切都在您期望的位置,没有其他依赖项,简单sql-没有用于创建sql where子句的长if语句。好的,非常感谢您的帮助!