3

この質問のタイトルがあまり説明的ではないことは知っていますが、質問をより適切に説明する方法がわかりませんでした...

DAOクラスの実装中に生じた疑問についてのご意見をお聞かせください。

CustomerDAOアプリケーションDB内の関連データへのアクセスを提供する必要があるクラスを実装しています。いつものように従来のCRUDメソッドを実装しましたが、使用した「特定の」クエリを使用して取得したデータを提供するメソッドを実装する必要があります。

私は次のような意味です:

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

だから私の質問は、従うべき正しいアプローチまたは「ベストプラクティス」は何ですか?クエリのような多くの特定のメソッドgetCustomersByXPropertyBetweenDates()を実装するか、クエリを一般化して、より「一般的な」(Javaの意味ではない)メソッドを実装しようとしますか?

プレーンJDBCを使用しておりJdbcTemplate、Spring Frameworkv3.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に共通のメソッドcommon(CRUD)を定義/実装する抽象DAOクラスを実装します。特定の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 に答える