DAO パターン

作成: 2026.03.24更新: 2026.03.24

DAO パターンとは

DAO(Data Access Object)パターンは、データベースへのアクセス処理をビジネスロジックから分離し、専用のオブジェクトに集約するデザインパターンである。Java EE(現 Jakarta EE)の設計パターンカタログにも含まれており、エンタープライズアプリケーション開発で広く使われている。

DAO パターンの目的は、データの取得・保存の方法(How)ビジネスロジック(What) を分離することにある。これにより、データベースの種類や SQL の実装詳細をビジネスロジック側が意識する必要がなくなる。

なぜ SIer で重要か

SIer の業務システムでは、ほぼすべてのシステムがデータベースを使用する。DAO パターンを採用することで、以下のメリットが得られる。

  1. データベース変更への対応 --- 開発環境では PostgreSQL、本番環境では Oracle を使うような場合でも、DAO の実装を切り替えるだけで対応できる。
  2. テストのしやすさ --- DAO をインターフェース化しておけば、モック(疑似実装)に差し替えてビジネスロジックのテストを行える。
  3. SQL の管理が容易 --- SQL がビジネスロジックのコードに散在するのではなく、DAO に集約されるため、SQL の確認・修正が容易になる。

SIer のプロジェクトでは設計書にも「DAO 一覧」や「SQL 一覧」が成果物として含まれることが多く、DAO パターンは設計レベルで組み込まれている。

基本概念

DAO の構造

DAO パターンの基本的な構成要素は以下の 3 つである。

DAO インターフェース

データアクセスの操作(CRUD)を定義する。ビジネスロジック層はこのインターフェースに対してプログラミングする。

DAO 実装クラス

DAO インターフェースを実装し、実際の SQL 発行やデータベース接続を行うクラス。

Entity(エンティティ)

データベースのテーブル 1 行分のデータを表現するクラス。DTO(Data Transfer Object)として使われることもある。

処理の流れ

Service(ビジネスロジック)
    ↓ メソッド呼び出し
DAO インターフェース
    ↓ 実装クラスが処理
DAO 実装クラス
    ↓ SQL 発行
データベース

CRUD 操作の例

DAO では一般的に以下の CRUD 操作を定義する。

操作メソッド名の例SQL
Create(作成)insert(entity)INSERT
Read(取得)findById(id), findAll()SELECT
Update(更新)update(entity)UPDATE
Delete(削除)delete(id)DELETE

SIer での使われ方

MyBatis の Mapper が DAO に相当する

SIer の Java 開発で広く使われている MyBatis フレームワークでは、Mapper インターフェース が DAO の役割を果たす。Mapper インターフェースを定義し、対応する XML ファイル(または アノテーション)に SQL を記述するという構成になっている。

UserMapper.java        ← DAO インターフェースに相当
UserMapper.xml         ← SQL を定義した XML ファイル
UserEntity.java        ← Entity クラス

MyBatis を使う場合、DAO 実装クラスを自分で書く必要はない。MyBatis がランタイムに Mapper インターフェースの実装を自動生成してくれるため、開発者はインターフェースと SQL だけを定義すればよい。

Spring Framework との組み合わせ

Spring Framework と組み合わせる場合、DAO(Repository)は @Repository アノテーションでマークされ、DI(依存性注入)コンテナによって管理される。Service クラスからは以下のように利用する。

@Service
public class UserService {
    private final UserRepository userRepository;

    // コンストラクタインジェクション
    public UserService(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    public User getUser(Long id) {
        return userRepository.findById(id);
    }
}

DAO と Repository の違い

SIer のプロジェクトでは「DAO」と「Repository」という用語が混在することがある。厳密には異なる概念だが、実務上はほぼ同じ意味で使われることが多い。

用語出自ニュアンス
DAOJava EE パターンデータソース(DB)へのアクセスを抽象化
Repositoryドメイン駆動設計(DDD)ドメインオブジェクトのコレクションを抽象化

Spring Data JPA では Repository インターフェースが使われ、MyBatis では Mapper インターフェースが使われるが、いずれもデータアクセスを抽象化するという本質的な役割は同じである。

まとめ

  • DAO パターンはデータベースアクセスをビジネスロジックから分離するパターンである
  • CRUD 操作を DAO インターフェースとして定義し、実装詳細を隠蔽する
  • SIer の Java 開発では MyBatis の Mapper が DAO の役割を果たしている
  • Spring Framework の @Repository と組み合わせて DI コンテナで管理される
  • DAO と Repository は厳密には異なる概念だが、実務上はほぼ同義で使われる