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

本記事は、Schooの「Java入門 中級【2026年版】」第2回「データベース処理とオブジェクト設計の基礎」を学ぶ前後に、DAOから複数件の検索結果を返す考え方を整理したい方向けの記事です。
1件だけ検索する場合は Song を1つ返せます。しかし、一覧検索のように複数行を扱う場合は、Song を複数入れられる List<Song> として返すと扱いやすくなります。
Schoo コースページ:Java入門 中級【2026年版】
複数件の検索結果はListで受け取る
データベースで一覧検索をすると、検索結果が1行とは限りません。曲一覧を検索する場合、1行目、2行目、3行目のように複数行が返ってきます。
Java側では、1行分を Song オブジェクトにし、それを List<Song> に追加していくと、複数件のデータをまとめて扱えます。
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 を使います。
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を作る- 作った
SongはsongList.add(song)でListに追加する - 呼び出し側はDAOからListを受け取り、拡張for文で1件ずつ使う