JavaのDAOとは?データベース処理を別クラスに分ける考え方

最終更新日

Schoo Java入門 中級 第2回 データベース処理とオブジェクト設計

本記事は、Schooの「Java入門 中級【2026年版】」第2回「データベース処理とオブジェクト設計の基礎」を学ぶ前後に、DAOの考え方を整理したい方向けの記事です。

DAOは、データベース処理を担当するクラスです。SQLの実行や ResultSet からオブジェクトを作る処理をDAOにまとめると、呼び出し側のコードが読みやすくなります。

Schoo コースページ:Java入門 中級【2026年版】

DAOはDB担当のクラス

DAOは、Data Access Objectの略です。名前だけ見ると難しく感じますが、まずは「DBからデータを探す、登録する、更新する、削除する処理を担当するクラス」と考えると理解しやすいです。

たとえば曲データを扱う場合、SongDao というクラスに、曲を検索する処理をまとめます。

mainメソッドがSongDaoに依頼し、SongDaoがDBから取得した1行をSongオブジェクトに詰めて返すイラスト
main はDAOに依頼し、DAOはDBから取得した値を Song オブジェクトに詰めて返します。
図解:DAOはDB処理を担当するクラス
呼び出し側
Song song = dao.findById(1);
「idが1の曲を探して」とDAOに依頼する
SongDao
SQLを作る
DBに接続する
ResultSetを読む
Songを作って返す
呼び出し側に戻る
System.out.println(song.getTitle());
受け取ったSongを使って表示や処理をする
DAOを使うと、呼び出し側はSQLの細かい処理を知らなくても、メソッドを呼び出してデータを受け取れます。

呼び出し側はDAOのメソッドを使う

DAOを使うと、呼び出し側はSQLの細かい書き方を直接意識せずに、メソッドを呼び出してデータを受け取れます。

SongDao dao = new SongDao();

Song song = dao.findById(1);

if (song != null) {
    System.out.println(song.getTitle());
} else {
    System.out.println("該当する曲は見つかりませんでした。");
}

このコードだけを見ると、findById(1) は「IDが1の曲を探す処理」だと読めます。DB接続やSQL実行の詳細は、SongDao の中にあります。

DAOの中にはSQLとResultSetの処理を書く

SongDao の中では、SQLを用意し、DBに問い合わせ、検索結果があれば Song オブジェクトを作って返します。

public Song findById(int id) {
    String sql = "SELECT id, title, artist FROM songs WHERE id = " + id;

    rs = stmt.executeQuery(sql);

    if (rs.next()) {
        Song song = new Song();
        song.setId(rs.getInt("id"));
        song.setTitle(rs.getString("title"));
        song.setArtist(rs.getString("artist"));
        return song;
    }

    return null;
}

呼び出し側は Song を受け取ります。DAOの中では、ResultSet の現在行から値を取り出して、Song のフィールドにセットしています。

なぜDAOに分けるのか

小さなサンプルでは、1つのメソッドの中にSQL、DB接続、検索結果の表示を全部書いても動きます。ただ、処理が増えると、どこがDB処理で、どこが表示や計算の処理なのかが見えにくくなります。

DAOに分けると、DBに関する処理を1つの場所に集められます。呼び出し側は、DAOから返ってきた Song を使って、表示や次の処理に集中できます。

図解:SQLを書く場所をDAOに寄せる
分けない場合
表示する処理の中に、SQL、接続、ResultSet、表示が混ざる
SELECT … FROM songs WHERE id = 1
DAOに分ける場合
DB処理はDAOへ。呼び出し側は結果の使い方に集中する
Song song = dao.findById(1);
DAOは、SQLを隠すためだけではなく、処理の役割を分けて読みやすくするために使います。

DAOのメソッド名は目的で考える

DAOでは、1つのメソッドに1つのDB操作を持たせると読みやすくなります。メソッド名は、SQLの細かい書き方ではなく「何をしたいか」で考えます。

図解:DAOのメソッド名はDB操作の目的を表す
メソッド
目的
呼び出し側の読み方
findById(id)
IDで1件探す
このIDの曲を探す
findAll()
すべて探す
曲一覧を取得する
insert(song)
1件登録する
この曲を登録する
delete(id)
IDで削除する
このIDの曲を削除する
DAOのメソッド名を見ると、呼び出し側から「何をDBに依頼しているか」が読みやすくなります。

たとえば findById なら「IDで探す」、findAll なら「一覧を取得する」、insert なら「登録する」と読めます。呼び出し側のコードから目的が伝わることが大切です。

DAOは次の設計への入口になる

DAOを使うと、DB処理とそれ以外の処理を分けて考えられるようになります。最初は少し大げさに見えるかもしれませんが、扱うテーブルや処理が増えるほど、どのクラスが何を担当しているかを分ける意味が出てきます。

中級の段階では、まず「DB処理はDAOに集める」「呼び出し側はDAOのメソッドを使う」という分担を押さえておくと十分です。

確認問題

次のコードを見て、SongDao と呼び出し側の役割を考えてください。

SongDao dao = new SongDao();
Song song = dao.findById(1);
  1. findById(1) は、何をするメソッドだと考えられますか。
  2. SQLや ResultSet を扱う処理は、どちらのクラスに書くとよいですか。
  3. 呼び出し側は、DAOから何を受け取ると扱いやすくなりますか。

確認問題の回答例を見る

まとめ

  • DAOは、データベース処理を担当するクラス
  • 呼び出し側は dao.findById(1) のようにメソッドを呼び出して使う
  • SQL、DB接続、ResultSet の処理はDAOの中にまとめる
  • DAOから Song のようなオブジェクトを返すと、呼び出し側で扱いやすい

関連する記事

シェアする