10

Java は初めてで、サーブレットを使用して Web プロジェクトを作成しようとしています。データベースにクエリを実行したいのですが、JPA と DAO についてすべてを理解しているわけではありません。

私はこのように物事を行うように教えられてきました:

  • クラス com.package.entity.User を作成します (データベースから生成)
  • インターフェイス com.package.dao.UserDao を作成します
  • クラス com.package.dao.jpa.JpaUserDao を作成して UserDao を実装する
  • 次のようなメソッドを使用して EJB com.package.service.UserService を作成します。public List<User> findAll()

JPA で DAO インターフェースを作成する必要はないと聞いたことがありますが、完全に道に迷っており、何をすべきか、EJB とは何かをまったく理解していません。データベース内のすべてのユーザーを検索し、Java の優れたプラクティスに従ってその名前を表示したいだけです。

私のサーブレットと JSP では、これで問題ありません。

あなたは何をお勧めします ?

4

2 に答える 2

13

DAOは「データアクセスオブジェクト」の略です。これは、「データストアから何かを取得する」という概念を抽象化したものです。DAOオブジェクトは、JDBC呼び出し、JPA呼び出しなどで実装できます。多分それはいくつかのリモートWebサービスを呼び出します。JPA上にDAOを設定することは冗長であるように思われ、レイヤーが追加されますが、それだけの価値があると思います。

たとえば、「緑色の目をしているユーザーを表示する」というユースケースがあるとします。

ストレートJPAの場合:

List<User> users = entityManager.createQuery("select u  from User u where u.EyeColor = 'green'"");

DAOを使用すると、次のようになります。

List<User> users = dao.UsersWithEyeColor("green");

ここでのDAOにはいくつかの利点があります。

  1. 読みやすいです。
  2. データベース構造をアプリケーションの残りの部分に公開しません
  3. ユニットテストの方がはるかに簡単です。緑色の目でユーザーを獲得しているクラスは、「モック」ダオを作成するだけで済みます。これは、JPAをモックするよりも簡単です。

これらは、DAOを使用するためのいくつかの議論にすぎません。非常に単純で小さなアプリケーションの場合、オーバーヘッドが大きすぎる可能性があります。しかし、大きくなり、何年も維持する必要があるものについては、それだけの価値があると思います。

于 2013-03-21T18:45:56.943 に答える
7

DAO (データ アクセス オブジェクト) は、基本的にプログラミングのパターンです。これを使用するには、ある種の永続化ユニット (db、ファイル システム、xml など) への抽象インターフェイスを提供するオブジェクトを作成するクラスを作成する必要があります。それは役に立ちますか?データベースの詳細を公開することなく、いくつかの特定のデータ操作を提供するためです。

DAO の基本的な例:

import java.util.List;


public abstract class DAOFactory {

    public static final int MYSQL_JDBC = 1;
    public static final int MYSQL_JPA = 2;
    public static final int MYSQL_HIBERNATE = 3;

    public abstract List<UserDTO> listAllUsers();

    public static DAOFactory getDAOFactory(int whichFactory) {
        switch (whichFactory) {
        case MYSQL_JDBC : return new MySqlJDBCDaoFactory();
        case MYSQL_JPA: return new MySqlJpaDaoFactory();
        case MYSQL_HIBERNATE: return new MySqlHibernateDaoFactory();
        default: return null;
        }
    }

}

次に、アプリケーションで管理する永続性の種類ごとに特定のファクトリを作成する必要があります。その特定のファクトリは、永続化に使用するメソッドを実装する必要があります。たとえば、listAllUsers();

たとえば、MySQL JPA の場合:

public class MySqlJpaDaoFactory extends DAOFactory {

    @Override
    public List<UserDTO> listAllUsers() {
      // Here I implement specific functionality to retrieve data using JPA Framework
        //EntityManagerFactory emf = ...
        //EntityManager em = ...
        //List<UserDTO> list = em.get...();
        //return list;
        return null;
    }

}

MySQL JDBC の場合、他のプロセスを実行する必要があります。

public class MySqlJDBCDaoFactory extends DAOFactory {

    @Override
    public List<UserDTO> listAllUsers() {
        //Connection = DriverManager ...
        //PreparedStatement ps = connection.prepareStatement("select * from ...");
        //ResultSet = ps.executeQuery()
        // and so on...
        return null;
    }

}

次に、次の方法でファクトリを呼び出します。

DAOFactory myfactory = DAOFactory.getDAOFactory(DAOFactory.MYSQL_JDBC);
List<UserDTO> list = myfactory.listAllUsers();

また、データベース フレームワークや永続化モードを変更しても、車輪を再発明する必要はなく、パラメーターを変更するだけで、パラメーターに基づいて、必要な永続化の実装を取得できます。

パターンを理解するのに役立つことを願っています。私は EJB を使用していません。DAO を使用している場合でも、EJB を実装する必要はないと思います。

よろしくお願いします

于 2013-03-21T18:57:40.273 に答える