🌟

Javaフレームワークを使用せずにDBのカラム名を意識せずにjsonデータを返却する

に公開

フレームワークを使って、API開発をする機会が多くなったのと、フレームワークを使う理由って何があるんだろ???と素朴に疑問に思うことがあったので、たまたま気になった処理があったので記事にしました。

検索

フレームワークを使わずに、検索SQL文を実行するにはこんな感じになると思います。

// 変数queryには文字列のSQL文を設定
PreparedStatement preparedStatement = connection.prepareStatement(query);
ResultSet resultSet = preparedStatement.executeQuery()

DB取得結果

SQL結果を取得するには、何も考えないとこんな感じになります。

while (resultSet.next()) {
    int id = resultSet.getInt("id");
    String name = resultSet.getString("name");
    System.out.println("ID: " + id + ", Name: " + name);
}

課題点

上記のコードだと、テーブル名とカラム名が異なっているたんびにメソッドなりクラス名なり変えないといけなくなるのが難点です。

課題解決策

そこで、解決するのがこちら

ResultSetMetaData metaData = resultSet.getMetaData();
while (resultSet.next()) {				
    for(int i = 1; i<= metaData.getColumnCount(); i++) {
        // 1レコード分のDB情報
        System.out.println("DBカラム名: " + metaData.getColumnName(i) + ", DB値: " + resultSet.getString(i));
    }
}

DBカラム名をkeyにDB値をvalueにする

resultSet.getMetaData()でメタ情報を取得して、その中でカラム名を取得できるようです。
resultSet.getString(int columnIndex)で値を取得できるようになるので、key、valueのセットが取得できるようになりますね。
データ型を意識するのであれば、getObject(int columnIndex)が良いと思います。

JSONObjectにリストで設定して返却する

上記のコードを使用して、JSONObjectに設定すると・・・・

ResultSetMetaData metaData = resultSet.getMetaData();
JSONArray records = new JSONArray();

while (resultSet.next()) {
    JSONObject record = new JSONObject();
    for(int i = 1; i<= metaData.getColumnCount(); i++) {
        // 1レコード分のDB情報
        record.put(metaData.getColumnName(i), resultSet.getString(i));
    }
    records.put(record);
}
JSONObject response = new JSONObject();
response.put("records", records);

return response;

Jsonデータイメージ

recordに1レコード分のkey、valueを設定してrecordsに追加
responseにkey名を設定してrecordsを設定することで以下のようなjsonデータを返却できるようになります。

{
    "records": [
        {
            "id": "1",
            "name": "hoge"
        },
        {
            "id": "2",
            "name": "fuga"
        }
    ]
}

ライブラリを駆使したら簡易にコードを書けそうな予感

JSONObjectはライブラリが必要ですが、こういうこともできるんですね~
カラム名を意識することなくなれば、DBテーブル毎に専用クラスを用意する必要はないので共通化できて楽ですね。

Discussion