JavaのDAOで複数件の検索結果を返すには?Listで受け取る考え方

最終更新日

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

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

1件だけ検索する場合は Song を1つ返せます。しかし、一覧検索のように複数行を扱う場合は、Song を複数入れられる List<Song> として返すと扱いやすくなります。

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

複数件の検索結果はListで受け取る

データベースで一覧検索をすると、検索結果が1行とは限りません。曲一覧を検索する場合、1行目、2行目、3行目のように複数行が返ってきます。

Java側では、1行分を Song オブジェクトにし、それを List<Song> に追加していくと、複数件のデータをまとめて扱えます。

図解:複数行を1件ずつSongにしてListへ入れる
ResultSet
id
title
artist
1
青空メロディ
スターライト
2
真夜中トレイン
ルナノート
3
ひかりのカケラ
シティポップス
while (rs.next())
現在行を読む
Songを作る
Listに追加する
List<Song>
Song 1件目
Song 2件目
Song 3件目
複数行の検索結果は、1行読むたびに Song を作り、List<Song> に追加していきます。

DAOの戻り値をList<Song>にする

1件検索のメソッドでは、戻り値を Song にできます。

public Song findById(int id) {
    // IDで1件検索してSongを返す
}

一方、一覧検索では複数の Song を返す必要があります。そのため、戻り値を List<Song> にします。

public List<Song> findAll() {
    // すべての曲を検索してList<Song>を返す
}

メソッド名の findAll は「すべて探す」という意味で読めます。戻り値の List<Song> を見ると、「Songが複数返ってくる」とイメージできます。

while文の中で1行ずつSongを作る

ResultSet は、rs.next() で1行ずつ読み進めます。現在行がある間、Song を作り、列の値をセットし、songList に追加します。

List<Song> songList = new ArrayList<>();

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

return songList;

ここで重要なのは、Song song = new Song();while の中で行うことです。1行読むたびに新しい Song を作るから、1件目、2件目、3件目を別々のオブジェクトとして List に入れられます。

main側ではDAOからListを受け取る

DAOの中で検索結果を List<Song> にまとめたら、呼び出し側ではそのListを受け取ります。

SongDao dao = new SongDao();

List<Song> songList = dao.findAll();

呼び出し側は、SQLや ResultSet の処理を直接書かずに、DAOから返ってきた songList を使います。

図解:DAOはList<Song>を返し、main側で1件ずつ使う
main側
List<Song> songList = dao.findAll();
DAOから曲一覧をまとめて受け取る
DAO側
return songList;
検索結果をListに詰めて返す
main側
for (Song song : songList)
受け取ったListを1件ずつ処理する
DAOは複数件の検索結果をまとめて返し、呼び出し側は拡張for文で1件ずつ使います。

Listの中身は拡張for文で1件ずつ使う

List<Song> の中には、複数の Song オブジェクトが入っています。表示するときは、拡張for文で1件ずつ取り出すと読みやすくなります。

for (Song song : songList) {
    System.out.println("ID: " + song.getId());
    System.out.println("曲名: " + song.getTitle());
    System.out.println("アーティスト名: " + song.getArtist());
    System.out.println();
}

songList は曲の一覧です。拡張for文の song は、その一覧から1件ずつ取り出された Song オブジェクトです。

確認問題

次のDAOメソッドで、検索結果を List<Song> に追加する処理を考えてください。

List<Song> songList = new ArrayList<>();

while (rs.next()) {
    Song song = new Song();
    // id、title、artistをsongにセットする
    // songListにsongを追加する
}

return songList;

確認問題の回答例を見る

まとめ

  • 複数件の検索結果は List<Song> として返すと扱いやすい
  • while (rs.next()) の中で、1行ごとに新しい Song を作る
  • 作った SongsongList.add(song) でListに追加する
  • 呼び出し側はDAOからListを受け取り、拡張for文で1件ずつ使う

関連する記事

シェアする