2013-03-21 9 views
6

私はJavaを初めて使い、サーブレットを使ってWebプロジェクトを作ろうとしています。 データベースを照会したいのですが、JPAとDAOのすべてを理解していないと思います。Java初心者 - JPAとDAOとは何ですか?

私は物事をこの方法を行うには教えられてきた

  • インタフェースcom.package.dao.UserDao
  • を作成します(私のデータベースから生成された)クラスcom.package.entity.User
  • を作成します。
  • UserDao
  • を実装するクラスを作成しますcom.package.dao.jpa.JpaUserDao
  • public List<User> findAll()
のような方法でEJB com.package.service.UserServiceを作成します。

私はJPAとのDAOインターフェイスを作成する必要はないと聞いてきましたが、私は完全に失われています。私は何をすべきかEJBが何であるか全く分かりません。私は単に、データベース内のすべてのユーザーを見つけて、Javaの優れた方法に従って名前を表示するだけです。

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

お勧めですか?

+1

は、この同様の質問を参照してください:http://programmers.stackexchange.com/questions/97423/are-there-any-real-benifits-to-a-dao-layerを – Dave

+0

問題は次のとおりです。これは私にとって中国語です!私はDAOのインターフェイスを作成するだけなので、DAOが何をしているのか分かりません。 PHP用のPDOのような抽象レイヤーですか?あるいは、DoctrineのようなORMのようなもの? – mimipc

答えて

7

DAOは、 "データアクセスオブジェクト"の略です。 「データストアから何かを得る」という概念を抽象化しています。 DAOオブジェクトは、JDBC呼び出し、JPA呼び出しなどで実装できます。たぶんリモートWebサービスを呼び出すかもしれない。 JPAでDAOを使用することは冗長で、レイヤーを追加することになりますが、それはその価値があると思います。

たとえば、「緑色の目を持つユーザーを表示する」というユースケースがあります。ストレートJPAと

:あなたが持っていると思いますDAOと

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

:ここ

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

DAOは利点のカップルを持っている:

  1. 読みやすくなり。
  2. データベース構造をアプリケーションの他の部分に公開しません
  3. ユニットテストの方がはるかに簡単です。緑色の目でユーザーを獲得しているクラスは、 "モック"ダオを作成する必要があります。 JPAを嘲笑するよりも簡単です。

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

+1

あなたの質問は、あなたが最初に意図したように、青い目ではなく、緑の目のユーザーを返します。 :) – artaxerxe

+0

ありがとうartaxerxe – Dave

6

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のために:MySQLのJDBC用

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; 
    } 

} 

あなたが他のプロセスを実行する必要があります。

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を実装する必要はないと思います。

敬具

+0

これは、JDBC *または*経由でJPA2経由でデータを取得する通常のユースケースでは完全にオーバーエンジニアリングされていますが、アクセス方法を変更することはありません。ファクトリを忘れて、DAOをインスタンス化してください。 –

+0

@Marcelo、なぜJPAを使用しているときにJDBCが必要なのか分かりますか?現在、私はそのようなことをやっていますが、JPAとJDBCを混在させるべきかどうかはかなり混乱しています。お返事待ってます。 Tks。 –

+1

こんにちは@KarenGoh。 JPAなどの永続性フレームワークを使用することに決めた場合は、JDBCを混在させる理由がわかりません。この特定の例では、以前の仕事で使っていたアプリケーションに基づいて、さまざまなタイプの永続性「マネージャ」をどのように処理できるかを示したところです。このパターン(DAO)は2004年にJDBCを使用して開始され、その後2009年にPure Hibernateに移行され、その後2013年にJPA(+ Eclipselink)に移行されました。この例は、永続モードこのパターンで簡単に1つのタイプから別のタイプに変更できます。 –

関連する問題