ObjectAPI形式で戻り値を自分でハンドリングする その1

前回の続きでObjectAPI形式の場合に自分で戻り値の型をマッピングする処理を書いてみましょう

Dao004.java
public interface Dao004 {
	public static class SimpleMapper implements ResultSetMapper<Map<String,Object>>
	{
		public Map<String,Object> map(int index, ResultSet r, StatementContext ctx) throws SQLException
		{
			Map<String,Object> result = new HashMap<>();
			result.put("id", r.getInt("id"));
			result.put("name", r.getString("name"));
			return result;
		}
	}

	@SqlQuery("select * from table001")
	@RegisterMapper(SimpleMapper.class)
	List<Map<String,Object>> findAll();
}
Sample009.java
public static void main(String[] args) {
	String url = "jdbc:postgresql://192.168.52.128/jdbi";
	DBI dbi = new DBI(url, "jdbi_user", "jdbi_pass");

	Dao004 dao004 = dbi.onDemand(Dao004.class);
	List<Map<String,Object>> rows = dao004.findAll();
	System.out.println("rows count = " + rows.size());
	for( Map<String,Object> row : rows )
	{
		System.out.println("id = " + row.get("id") + ", name = " + row.get("name"));
	}
}

いくつか説明しないといけませんね。

  • SimpleMapper
    • これが自分で戻り値の型を変換する処理のメイン部分です
    • ResultSetMapper インターフェイスの定義を見ればわかりますが、map メソッドを実装しなければなりません
    • mapメソッドはselect文の実行結果、1行毎に呼ばれる仕組みになってますので。ResultSet が1行分のデータですね。
    • ここで検索結果を取り出して適当に処理して、自分の欲しい型に変換して返してやればOKです
  • RegisterMapper アノテーション
    • このアノテーションで指定したResultSetMapperに検索結果の変換処理を委譲できるようになってます。
    • 戻り値がList(正確にはIterableなクラス)なら、SimpleMapper で変換した戻り値をJDBIが気を利かせてListにしてくれます

戻り値が Map 型だとその後取り出す側は使いにくいので、次回は戻り値を自分で定義したモデルクラスにする方法をご紹介します