ある指定した列だけ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
- Query
q2 = q.map(new StringMapper(2)); - List
list = q2.list();
※予め定義されている変換クラス
- BigDecimalMapper
- BooleanMapper
- ByteArrayMapper
- ByteMapper
- DoubleMapper
- FloatMapper
- IntegerMapper
- LongMapper
- ShortMapper
- StringMapper
- TimestampMapper
- URLMapper