Javaのデータアクセスオブジェクト(DAO)


347

ドキュメントを調べていたところ、という用語に出くわしましたDAO。データアクセスオブジェクトであることがわかりました。誰かがこれが実際に何であるかを私に説明してもらえますか?

これは、さまざまな種類のソースからデータにアクセスするための一種のインターフェースであることを知っています。私の私のこの小さな研究の最中に、データソースまたはデータソースオブジェクトと呼ばれる概念にぶつかりました。

DAOそれがどこで使用されているかという点で、プログラムでa が何であるかを本当に知りたいです。使い方は?非常に基本的なものからこの概念を説明するページへのリンクも高く評価されます。

回答:


447

データアクセスオブジェクトは、基本的には、基になるデータベースまたはその他の永続ストレージへのアクセスを提供するオブジェクトまたはインターフェイスです。

その定義:http : //en.wikipedia.org/wiki/Data_access_object

こちらのシーケンス図も確認してください。http//www.oracle.com/technetwork/java/dataaccessobject-138824.html

多分簡単な例はあなたが概念を理解するのを助けるかもしれません:

従業員を表すエンティティがあるとします。

public class Employee {

    private int id;
    private String name;


    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }

}

従業員エンティティはEmployee、データベース内の対応するテーブルに永続化されます。従業員エンティティを操作するために必要なデータベース操作を処理する単純なDAOインターフェースは次のようになります。

interface EmployeeDAO {

    List<Employee> findAll();
    List<Employee> findById();
    List<Employee> findByName();
    boolean insertEmployee(Employee employee);
    boolean updateEmployee(Employee employee);
    boolean deleteEmployee(Employee employee);

}

次に、SQLサーバーを処理するためのそのインターフェイスの具体的な実装と、フラットファイルを処理するための別の実装などを提供する必要があります。


4
こんにちはラミ、私はあなたが非常に単純な例で私を説明してくれて本当に良かったと思っています。「具体的な実装」とは何を意味するのかを説明してもらえますか?次に、クラスへのインターフェイスを実装することにより、メソッドの定義を記述する必要があるということですか?
Vasanth Nag KV 2013

はい、そうです。SQL Serverに関連する方法でメソッドの完全な実装を提供することによってEmployeeDAOインターフェイスを実装するEmployeeSQLServerDAOというクラスのように
Rami

4
DAOはそれだけですか?これは、データベースにアクセスするためにWEが作成しているクラスにすぎません。データベースからのサービスが必要なときはいつでも、DAOのオブジェクトを作成してデータベース操作に使用し、データベースから必要なものを取得したらDAOを削除します。私は正しいですか?そして、このDAOコンセプトramiのスコープを知っていてもいいですか?
Vasanth Nag KV 2013

5
はい、DAOは、その名前が示すように、特定のエンティティ/クラスに関する基礎となるストレージにアクセス/更新するためのものです。したがって、上記の例では、SQLサーバーのDBテーブルを使用して永続化する従業員クラス/エンティティがあります。従業員DAOには、従業員を挿入/削除/更新/選択するメソッドが含まれます
Rami

2
@PhilipRegoでは、MSSQLサーバーの実装などの複数の実装と、単体テストで使用するCSVファイルを使用する別の実装を使用できます。
Rami

86

データアクセスオブジェクト(DAO)とは -

これは、データストレージのデータベースからデータアクセスするために使用されるオブジェクト/インターフェイスです。

DAOを使用する理由:

データベースなどのデータリソースからのデータの取得を抽象化します。概念は、「データアクセスメカニズムからデータリソースのクライアントインターフェースを分離する」ことです。

データに直接アクセスする場合の問題は、データのソースが変更される可能性があることです。たとえば、アプリケーションがOracleデータベースにアクセスする環境にデプロイされているとします。その後、Microsoft SQL Serverを使用する環境に展開されます。アプリケーションでストアドプロシージャとデータベース固有のコード(数値シーケンスの生成など)を使用している場合、アプリケーションでそれをどのように処理しますか?次の2つのオプションがあります。

  • Oracleの代わりにSQL Serverを使用するようにアプリケーションを書き直す(または、違いを処理するための条件付きコードを追加する)、または
  • アプリケーションロジックとデータアクセスの間にレイヤーを作成する


全体としてDAOパターンと呼ばれ、以下で構成されています。

  • データアクセスオブジェクトインターフェイス -このインターフェイスは、モデルオブジェクトで実行される標準操作定義します。
  • データアクセスオブジェクトの具象クラス -このクラスは上記のインターフェースを実装します。このクラスはデータベース/ xmlまたはその他のストレージメカニズムであるデータソースからデータを取得する責任があります。
  • モデルオブジェクトまたは値オブジェクト -このオブジェクトは、DAOクラスを使用して取得したデータを格納するget / setメソッド含む単純なPOJOです。

この例を確認してください。これにより、より明確にクリアされます。


このことは、DAOの理解をある程度まで明確にしているに違いないと思います。


13

DAO(データアクセスオブジェクト)は、エンタープライズアプリケーションで非常に使用されるデザインパターンです。基本的に、すべてのソース(DBMS、XMLなど)からのデータにアクセスするために使用されるモジュールです。このようないくつかの例を読むことをお勧めします:

DAOの例

元のDAOパターンを実装するにはさまざまな方法があり、作業を簡略化できるフレームワークが多数あることに注意してください。たとえば、iBatisやHibernateなどのORM(オブジェクトリレーショナルマッピング)フレームワークは、SQLクエリの結果をJavaオブジェクトにマップするために使用されます。

お役に立てば幸いです。


8

データアクセスオブジェクトパターンまたはDAOパターンは、低レベルのデータアクセスAPIまたは操作を高レベルのビジネスサービスから分離するために使用されます。以下は、データアクセスオブジェクトパターンの参加者です。

データアクセスオブジェクトインターフェイス-このインターフェイスは、モデルオブジェクトで実行される標準操作を定義します。

データアクセスオブジェクトの具象クラス-このクラスは上記のインターフェースを実装します。このクラスは、データベース/ xmlまたはその他のストレージメカニズムであるデータソースからデータを取得する責任があります。

モデルオブジェクトまたは値オブジェクト-このオブジェクトは、DAOクラスを使用して取得したデータを格納するget / setメソッドを含む単純なPOJOです。

ここにサンプルコード..


7

DAOとORMはすべての言語で使用されているので、Javaに固有のものではなく、一般的なものにします。

DAOを理解するには、まずORM(Object Rational Mapping)を理解する必要があります。これは、「人」というテーブルに「名前」と「年齢」の列がある場合、そのテーブルのオブジェクトテンプレートを作成することを意味します。

type Person {
name
age
}

特定のクエリを作成する代わりにDAOの助けを借りて、すべての人をフェッチするには、使用しているデータベースの種類(エラーが発生しやすい)を代わりに実行します。

list persons = DAO.getPersons();
...
person = DAO.getPersonWithName("John");
age = person.age;

DAOの抽象化は自分で作成するのではなく、使用している言語とフレームワークに応じて、通常はいくつかのオープンソースプロジェクトの一部です。

ここで主な質問です。「それが使用されるところ..」通常、複雑なビジネスおよびドメイン固有のコードを作成している場合、DAOなしでは人生は非常に困難になります。もちろん、提供されているORMとDAOを使用する必要はありません。代わりに、独自の抽象化とネイティブクエリを作成できます。私は過去にそれをしたことがあり、ほとんどの場合後でそれを後悔しました。


6

オラクルのウェブサイトで見つけることができる最良の例(および説明)は、ここにあります。別の良いtuturialがここにあります


2
それは私だけですか、それともほとんどのJavaチュートリアルと情報サイトは古くなっていますか?そのチュートリアルは2008年のものです!さまざまなJavaトピックに関する上位の検索結果の多くはさらに古いものです。
bergie3000 2016年

2
@ bergie3000:このパターンは新しいものではありません。
BANG力丸

5

あまりにも多くの説明と混同しないでください。DAO:名前自体から、オブジェクトを使用してデータにアクセスすることを意味します。DAOは他のビジネスロジックから分離されています。


4

データアクセスオブジェクトは、データソースとの接続を管理してデータを取得および格納します。ビジネスオブジェクトの基礎となるデータアクセス実装を抽象化して、データソースへの透過的なアクセスを可能にします。データソースは、RDBMS、XMLリポジトリ、フラットファイルシステムなどのデータベースです。


4

春JPA DAO

たとえば、エンティティグループがあります。

このエンティティに対して、リポジトリGroupRepositoryを作成します。

public interface GroupRepository extends JpaRepository<Group, Long> {   
}

次に、このリポジトリを使用するサービスレイヤーを作成する必要があります。

public interface Service<T, ID> {

    T save(T entity);

    void deleteById(ID id);

    List<T> findAll();

    T getOne(ID id);

    T editEntity(T entity);

    Optional<T> findById(ID id);
}

public abstract class AbstractService<T, ID, R extends JpaRepository<T, ID>> implements Service<T, ID> {

    private final R repository;

    protected AbstractService(R repository) {
        this.repository = repository;
    }

    @Override
    public T save(T entity) {
        return repository.save(entity);
    }

    @Override
    public void deleteById(ID id) {
        repository.deleteById(id);
    }

    @Override
    public List<T> findAll() {
        return repository.findAll();
    }

    @Override
    public T getOne(ID id) {
        return repository.getOne(id);
    }

    @Override
    public Optional<T> findById(ID id) {
        return repository.findById(id);
    }

    @Override
    public T editEntity(T entity) {
        return repository.saveAndFlush(entity);
    }
}

@org.springframework.stereotype.Service
public class GroupServiceImpl extends AbstractService<Group, Long, GroupRepository> {

    private final GroupRepository groupRepository;

    @Autowired
    protected GroupServiceImpl(GroupRepository repository) {
        super(repository);
        this.groupRepository = repository;
    }
}

そしてコントローラーでは、このサービスを使用します。

@RestController
@RequestMapping("/api")
class GroupController {

    private final Logger log = LoggerFactory.getLogger(GroupController.class);

    private final GroupServiceImpl groupService;

    @Autowired
    public GroupController(GroupServiceImpl groupService) {
        this.groupService = groupService;
    }

    @GetMapping("/groups")
    Collection<Group> groups() {
        return groupService.findAll();
    }

    @GetMapping("/group/{id}")
    ResponseEntity<?> getGroup(@PathVariable Long id) {
        Optional<Group> group = groupService.findById(id);
        return group.map(response -> ResponseEntity.ok().body(response))
                .orElse(new ResponseEntity<>(HttpStatus.NOT_FOUND));
    }

    @PostMapping("/group")
    ResponseEntity<Group> createGroup(@Valid @RequestBody Group group) throws URISyntaxException {
        log.info("Request to create group: {}", group);
        Group result = groupService.save(group);
        return ResponseEntity.created(new URI("/api/group/" + result.getId()))
                .body(result);
    }

    @PutMapping("/group")
    ResponseEntity<Group> updateGroup(@Valid @RequestBody Group group) {
        log.info("Request to update group: {}", group);
        Group result = groupService.save(group);
        return ResponseEntity.ok().body(result);
    }

    @DeleteMapping("/group/{id}")
    public ResponseEntity<?> deleteGroup(@PathVariable Long id) {
        log.info("Request to delete group: {}", id);
        groupService.deleteById(id);
        return ResponseEntity.ok().build();
    }    
}

これはリポジトリパターンを説明しているようであり、元の著者の要求によるDAOパターンではないようです。さらに、インターフェイスはコレクションのようなアプローチに従う必要があるため、操作の一部が適さないため、あなたの例は誤解を招く可能性があると思います。
Jan Haesen

2

DAOは、「Gang of Four」の本を参考にできるように、3層アーキテクチャの「Persistence Manager」のような行為であり、DAOもデザインパターンです。アプリケーションサービスレイヤーは、DAOのメソッドの隠された内部の詳細を知らなくても、DAOクラスのメソッドを呼び出すだけです。


2

Daoクラスはjdbcロジックの再利用に使用され、Dao(データアクセスオブジェクト)は設計パターンです。daoは、JDBCロジックを含む単純なJavaクラスです。

データアクセスレイヤーは、個別のビジネスロジックレイヤーと永続レイヤーで優れていることが証明されています。DAO設計パターンは、データアクセスの実装をクライアントから完全に隠します

Javaデータアクセスオブジェクト(Java DAO)は、ビジネスアプリケーションの重要なコンポーネントです。ビジネスアプリケーションはほとんどの場合、リレーショナルデータベースまたはオブジェクトデータベースのデータにアクセスする必要があり、Javaプラットフォームはこのデータにアクセスするための多くの手法を提供します。最も古く、最も成熟した手法は、Java Database Connectivity(JDBC)APIを使用することです。これは、データベースに対してSQLクエリを実行し、結果を一度に1列ずつフェッチする機能を提供します。


1

Pojoは、privateで定義された特定の変数のゲッターとセッターを作成できるJavaのモデルクラスとも見なします。ここではすべての変数がプライベート修飾子で宣言されていることに注意してください

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.