Javaで検索結果をオブジェクトに詰める考え方|ResultSetからSongクラスへ移す流れ

最終更新日

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

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

JDBCでSELECTを実行すると、結果は ResultSet として受け取ります。ただし、実際のアプリでは、取得した値をその場で表示するだけでなく、Song のようなクラスのオブジェクトに移して扱うことがあります。

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

検索結果をオブジェクトにするとはどういうことか

データベースの1行には、複数の列があります。たとえば曲データなら、idtitleartist のような列があります。

Java側にも、同じ情報を持つ Song クラスを用意しておくと、DBの1行をJavaの1つのデータとして扱いやすくなります。

public class Song {
    private int id;
    private String title;
    private String artist;
}
図解:DBの1行をSongオブジェクトに移す
検索結果の現在行
id
title
artist
1
青空メロディ
スターライト
↓ ResultSetから取り出してセットする
Java側のSongオブジェクト
フィールド
入る値
id
rs.getInt("id") の結果 → 1
title
rs.getString("title") の結果 → 青空メロディ
artist
rs.getString("artist") の結果 → スターライト
ResultSetの現在行から列の値を取り出し、Songオブジェクトのフィールドにセットします。

ResultSetの値をsetterでSongにセットする

ResultSet から値を取り出すときは、列名を指定します。取り出した値を Song オブジェクトにセットすると、検索結果の1行をJavaのオブジェクトとして持てます。

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

rs.getInt("id") は、現在行の id 列の値を取り出します。rs.getString("title") は、現在行の title 列の値を取り出します。

その値を song.setId(...)song.setTitle(...) に渡すことで、Song オブジェクトの中に値が入ります。

その場で表示するだけとの違い

SELECTした結果をすぐ画面に出すだけなら、System.out.println(rs.getString("title")) のように書くこともできます。

しかし、その書き方だと「表示する処理」と「DBから値を取り出す処理」が強く結びつきます。検索したデータを別のメソッドに渡したい、あとで加工したい、画面以外の場所で使いたい、というときに扱いにくくなります。

図解:検索結果をそのまま表示する場合とオブジェクトにする場合
そのまま表示する
System.out.println(rs.getString(“title”));
画面に出すだけなら十分ですが、あとで同じデータを使い回しにくくなります。
オブジェクトにする
Song song = new Song();
song.setTitle(rs.getString(“title”));
検索した1件を、Javaのデータとして戻したり、別の処理に渡したりしやすくなります。
DBの値をJava側で扱いやすい形に移すと、表示以外の処理にも使いやすくなります。

見つからなかった場合はnullを返すことがある

IDで1件検索するような処理では、該当するデータが見つからないこともあります。その場合、Song オブジェクトを作れないため、null を返す書き方があります。

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 != null を確認してから、song.getTitle() などを使います。

Song song = dao.findById(1);

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

複数行を扱うならListに入れる

SELECTの結果が複数行ある場合は、1行ごとに Song オブジェクトを作り、それを List<Song> に追加する形がよく使われます。

図解:複数行なら1行ごとにSongを作ってListに入れる
検索結果
1行目
Song
オブジェクト
List<Song>
検索結果
2行目
Song
オブジェクト
List<Song>
SELECTの結果が複数行ある場合は、1行読むたびにSongを作り、Listに追加する形がよく使われます。
List<Song> songs = new ArrayList<>();

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

この形にすると、検索結果をまとめて返したり、拡張for文で1件ずつ処理したりできます。

確認問題

次のコードは、ResultSet から値を取り出して Song オブジェクトに移す途中です。空欄に入る処理を考えてください。

if (rs.next()) {
    Song song = new Song();
    song.setId(rs.getInt("id"));
    // titleをセットする
    // artistをセットする
    return song;
}

return null;

確認問題の回答例を見る

まとめ

  • DBの1行は、Java側では1つのオブジェクトとして扱える
  • ResultSet の現在行から列の値を取り出し、オブジェクトのフィールドにセットする
  • 1件検索では、見つかったらオブジェクトを返し、見つからなければ null を返すことがある
  • 複数行を扱う場合は、1行ごとにオブジェクトを作って List に入れる

関連する記事

シェアする