web-dev-qa-db-ja.com

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

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

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

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

298
Vasanth Nag K V

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

その定義は次のとおりです。 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サーバを扱うためのそのインタフェースのための具体的な実装と、フラットファイルなどを扱うための別の実装を提供しなければなりません。

385
Rami

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

これは object/interface であり、これは データストレージのデータベースからdata にアクセスするために使用されます。

WHY WE DAOを使用:

データベースなどのデータリソースからのデータの検索を抽象化します。その概念は "データリソースのクライアントインタフェースをそのデータアクセスメカニズムから切り離すこと"です。

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

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


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

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

この例を確認してください。これにより、内容がより明確になります。


私はこのことがDAOに対するあなたの理解をある程度までクリアしたに違いないと思います。

72
VdeX

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

DAOの例

オリジナルの DAOパターン を実装するにはさまざまな方法があり、作業を簡素化できるフレームワークがたくさんあります。たとえば、iBatisやHibernateなどのORM(Object Relational Mapping)フレームワークは、SQLクエリの結果をJavaオブジェクトにマッピングするために使用されます。

それが役立つことを願って、さようなら!

13
umanganiello

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

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

データアクセスオブジェクト具象クラス - このクラスは上記のインタフェースを実装しています。このクラスは、database/xmlまたはその他の格納メカニズムになり得るデータソースからデータを取得します。

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

サンプルコード ここ ..

4
babu

説明を混同しすぎないでください。 DAO:名前そのものから、オブジェクトを使ってデータにアクセスするということです。 DAOは他のビジネスロジックから切り離されています。

4
ArunValaven

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

DAOを理解するには、まずORM(Object Rational Mapping)を理解する必要があります。つまり、列が "name"と "age"の "person"というテーブルがある場合は、そのテーブル用のobject-templateを作成します。

type Person {
name
age
}

今、DAOの助けを借りて、特定のクエリを書くのではなく、すべての人を取得するために、今まで使っていたdbのタイプ(エラーが発生しやすい)に対して代わりに、

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

あなたは自分でDAOの抽象化を書くのではなく、代わりにそれはあなたが使っている言語とフレームワークに応じて、通常はオープンソースプロジェクトの一部です。

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

3
Orhan

私はあなたがオラクルのウェブサイトで見つけることができる(説明と共に)最良の例だと思います: ここ 。もう1つの良い教材が見つかるでしょう ここ

3
Ioan

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

1
Rohit Goyal

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

春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();
    }    
}
1
Andriy

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

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

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

0
Amrit Baghel

Pojoは、私たちがprivateで定義された特定の変数のためのgetterとsetterを作成できるJavaのModelクラスとしても考えます。すべての変数はここでprivate修飾子で宣言されていることを忘れないでください

0
Amrit Baghel