ある指定した列だけListで取得する

例えば name 列だけ一覧でほしいという場合、前回の方法だと一度全部取得してから、name列だけを再度取得する、という2段階になるので少し面倒です。そんな時に使うテクニック

Sample006.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");

	List<String> rows = dbi.withHandle(new HandleCallback<List<String>>() {
		@Override
		public List<String> withHandle(Handle handle) throws Exception {
			return handle.createQuery("select id, name from table001") // ※1
					.map(new StringMapper(2)) // ※2
					.list(); // ※3
		}
	});

	System.out.println("total = " + rows.size());
	for( int i=0; i<rows.size(); ++i )
	{
		System.out.println("[" + i + "]: " + rows.get(i));
	}
}

これは追加で説明が必要ですね。

  • ※1
    • これはそんなに難しくないですが、「handle.createQuery」を使用してますのでそこだけ注意。前回は「handle.select」でした
  • ※2
    • ここが肝となるところです。
    • StringMapperは、結果をStringに変換するクラスで、ResultSetMapper、TypedMapper のサブクラスとなってます。クラス名から大体の動作は想像つきますね。他の変換クラスは最後に一覧にしておきます。もちろん自分で定義することも可能。
    • 引数の「2」というのは、「2列目」という意味です。select文が id, name となってますので、1列目はid、2列目がname。なので「2」を指定してます。
    • ちなみに select 文を「select name from table001」とした場合は、「new StringMapper(1)」でもいいですが、1列目は予め想定されてまして、「StringMapper.FIRST」とできます。これならnewしなくていいので、少しだけ速いです。少しだけ・・
    • map の戻り値は引数のResultSetMapper の T 型になるんですが、StringMapper は で実体化されてるので、String型になります。
  • ※3
    • map でString型になったので、その型のListが返ることになります
    • もう少し分解すると以下のようになってます
      • Query> q = handle.createQuery(...);
      • Query q2 = q.map(new StringMapper(2));
      • List list = q2.list();

※予め定義されている変換クラス

  • BigDecimalMapper
  • BooleanMapper
  • ByteArrayMapper
  • ByteMapper
  • DoubleMapper
  • FloatMapper
  • IntegerMapper
  • LongMapper
  • ShortMapper
  • StringMapper
  • TimestampMapper
  • URLMapper