DAOはData Access Objectの略です。DAOデザインパターンはデータ永続性ロジックを別レイヤーに分離するために使用されます。これにより、サービスはデータベースへの低レベルなアクセス操作がどのように行われているかについて完全に暗いままです。これはロジックの分離の原則として知られています。
DAOデザインパターン
DAOデザインパターンでは、次のようなコンポーネントがあります。
- 1. 1つのレイヤーから他のレイヤーに転送されるモデル。
- 2. 柔軟な設計を提供するインターフェース。
- 3. パーシステンスロジックの具体的な実装であるインターフェース実装。
DAOパターンの実装
上記のコンポーネントを使用して、DAOパターンを実装してみましょう。ここでは3つのコンポーネントを使用します。
- 1. 1つのレイヤーから他のレイヤーに転送される
Book
モデル。 - 2. 柔軟な設計とAPIを提供する
BookDao
インターフェース。 BookDaoImpl
は、BookDao
インターフェースの実装である具象クラスです。
このロジックを図にまとめてみましょう:
DAOパターンモデルクラス
さて、モデルオブジェクトを設定しましょう。
package com.journaldev.model;
public class Books {
private int isbn;
private String bookName;
public Books() {
}
public Books(int isbn, String bookName) {
this.isbn = isbn;
this.bookName = bookName;
}
// getterおよびsetterメソッド
}
これはシンプルなオブジェクトで、シンプルに保つための2つのプロパティだけがあります。
DAOパターンインターフェース
次に、この永続化レベルでデータにアクセスするためのインターフェースを定義します。
package com.journaldev.dao;
import com.journaldev.model.Books;
import java.util.List;
public interface BookDao {
List<Books> getAllBooks();
Books getBookByIsbn(int isbn);
void saveBook(Books book);
void deleteBook(Books book);
}
DAOパターンの実装
次に、上記のインターフェースを実装する具体的なクラスを作成します。
package com.journaldev.daoimpl;
import com.journaldev.dao.BookDao;
import com.journaldev.model.Books;
import java.util.ArrayList;
import java.util.List;
public class BookDaoImpl implements BookDao {
//リストはデータベースとして機能します
private List books;
public BookDaoImpl() {
books = new ArrayList<>();
books.add(new Books(1, "Java"));
books.add(new Books(2, "Python"));
books.add(new Books(3, "Android"));
}
@Override
public List getAllBooks() {
return books;
}
@Override
public Books getBookByIsbn(int isbn) {
return books.get(isbn);
}
@Override
public void saveBook(Books book) {
books.add(book);
}
@Override
public void deleteBook(Books book) {
books.remove(book);
}
}
DAOパターンの使用
最後に、この実装を main() メソッドで使用しました:
package com.journaldev;
import com.journaldev.dao.BookDao;
import com.journaldev.daoimpl.BookDaoImpl;
import com.journaldev.model.Books;
public class AccessBook {
public static void main(String[] args) {
BookDao bookDao = new BookDaoImpl();
for (Books book : bookDao.getAllBooks()) {
System.out.println("Book ISBN : " + book.getIsbn());
}
// 学生の更新
Books book = bookDao.getAllBooks().get(1);
book.setBookName("Algorithms");
bookDao.saveBook(book);
}
}
DAO パターンの利点
DAO パターンを使用すると、多くの利点があります。ここでいくつかを述べましょう:
- 永続性メカニズムを変更する場合、サービスレイヤーはデータの取得元を知る必要さえありません。たとえば、MySQL から MongoDB に移行しようとしている場合、すべての変更は DAO レイヤーでのみ行う必要があります。
- DAO パターンは、アプリケーションの異なるコンポーネント間の低結合を重視しています。そのため、ビューレイヤーは DAO レイヤーに依存せず、サービスレイヤーのみが依存します。それもインタフェースからであり、具象実装ではありません。
- 永続性ロジックが完全に分離されているため、個々のコンポーネントに対して単体テストを書くのがはるかに簡単です。たとえば、JUnit と Mockito を使用している場合、アプリケーションの個々のコンポーネントをモックするのは簡単です。
- DAO パターンではインタフェースを使用するため、「実装ではなくインタフェースで作業する」というスタイルが強調されています。これは優れた OOP スタイルのプログラミングです。
DAO パターンのまとめ
この記事では、DAOデザインパターンを使用して、永続性ロジックを分離し、コンポーネントを緩く結合する方法に焦点を当てました。デザインパターンは単なるプログラミングの方法に基づいており、したがって、言語やフレームワークには依存していません。以下のリンクからDAOのサンプルプロジェクトをダウンロードしてください。
参考文献: Oracleドキュメンテーション, Wikipedia。
Source:
https://www.digitalocean.com/community/tutorials/dao-design-pattern