複数行のinsert
配列とかListを引数に渡せば、勝手にその配列数分ループして実行してくれます
Dao007.java
public interface Dao007 { @SqlBatch("insert into table001 (id, name) values ((select count(*)+1 from table001), :first || '-' || :last)") int[] insertBatch( @Bind("first") List<String> firstNames, @Bind("last") String lastName ); @SqlQuery("select name from table001") List<String> findNames(); }
Sample013.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> firstNames = Arrays.asList(new String[]{"Firstname1", "Firstname2", "Firstname3"}); String lastName = "Lastname"; Dao007 dao007 = dbi.onDemand(Dao007.class); int[] result = dao007.insertBatch(firstNames, lastName); System.out.println("result.length = " + result.length); // 3 for( int i : result ) { System.out.println("i = " + i); // 1 } for( String name : dao007.findNames() ) { System.out.println("name = " + name); } }
SqlBatch アノテーションで指定したSQLを引数のサイズ分実行してくれます。
実行結果は配列にして返してくれます。この例では3回実行してますので、
- result[0]:1回目の実行結果
- result[1]:2回目の実行結果
- result[2]:3回目の実行結果
となりますね。insert文はinsertした行数が返ることになってまして、それぞれのSQLでは1行だけinsertすることになりますから、全部 1 ですね。
実行結果が必要無ければ、void insertBatch と宣言すればよいです。