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

本記事は、Schooの「Java入門 中級【2026年版】」第2回「データベース処理とオブジェクト設計の基礎」を学ぶ前後に、DAOの考え方を整理したい方向けの記事です。
DAOは、データベース処理を担当するクラスです。SQLの実行や ResultSet からオブジェクトを作る処理をDAOにまとめると、呼び出し側のコードが読みやすくなります。
Schoo コースページ:Java入門 中級【2026年版】
DAOはDB担当のクラス
DAOは、Data Access Objectの略です。名前だけ見ると難しく感じますが、まずは「DBからデータを探す、登録する、更新する、削除する処理を担当するクラス」と考えると理解しやすいです。
たとえば曲データを扱う場合、SongDao というクラスに、曲を検索する処理をまとめます。
main はDAOに依頼し、DAOはDBから取得した値を Song オブジェクトに詰めて返します。呼び出し側は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 を使って、表示や次の処理に集中できます。
DAOのメソッド名は目的で考える
DAOでは、1つのメソッドに1つのDB操作を持たせると読みやすくなります。メソッド名は、SQLの細かい書き方ではなく「何をしたいか」で考えます。
たとえば findById なら「IDで探す」、findAll なら「一覧を取得する」、insert なら「登録する」と読めます。呼び出し側のコードから目的が伝わることが大切です。
DAOは次の設計への入口になる
DAOを使うと、DB処理とそれ以外の処理を分けて考えられるようになります。最初は少し大げさに見えるかもしれませんが、扱うテーブルや処理が増えるほど、どのクラスが何を担当しているかを分ける意味が出てきます。
中級の段階では、まず「DB処理はDAOに集める」「呼び出し側はDAOのメソッドを使う」という分担を押さえておくと十分です。
確認問題
次のコードを見て、SongDao と呼び出し側の役割を考えてください。
SongDao dao = new SongDao();
Song song = dao.findById(1);
findById(1)は、何をするメソッドだと考えられますか。- SQLや
ResultSetを扱う処理は、どちらのクラスに書くとよいですか。 - 呼び出し側は、DAOから何を受け取ると扱いやすくなりますか。
まとめ
- DAOは、データベース処理を担当するクラス
- 呼び出し側は
dao.findById(1)のようにメソッドを呼び出して使う - SQL、DB接続、
ResultSetの処理はDAOの中にまとめる - DAOから
Songのようなオブジェクトを返すと、呼び出し側で扱いやすい