@BatchChunkSize(4) @RegisterConstructorMapper(BatchingRow.class) public interface SingleValueBatching { @SqlBatch("insert into batching (id, values) values (:id, :values)") int[] insertValues(int[] id, @SingleValue int[] values); @SqlQuery("select id, values from batching order by id asc") List<BatchingRow> select(); }
private SqlBatchHandler.ChunkSizeFunction determineBatchChunkSize(Class<?> sqlObjectType, Method method) { // this next big if chain determines the batch chunk size. It looks from most specific // scope to least, that is: as an argument, then on the method, then on the class, // then default to Integer.MAX_VALUE int batchChunkSizeParameterIndex = indexOfBatchChunkSizeParameter(method); if (batchChunkSizeParameterIndex >= 0) { return new ParamBasedChunkSizeFunction(batchChunkSizeParameterIndex); } else if (method.isAnnotationPresent(BatchChunkSize.class)) { final int size = method.getAnnotation(BatchChunkSize.class).value(); if (size <= 0) { throw new IllegalArgumentException("Batch chunk size must be >= 0"); } return new ConstantChunkSizeFunction(size); } else if (sqlObjectType.isAnnotationPresent(BatchChunkSize.class)) { final int size = sqlObjectType.getAnnotation(BatchChunkSize.class).value(); return new ConstantChunkSizeFunction(size); } else { return new ConstantChunkSizeFunction(Integer.MAX_VALUE); } }
@BatchChunkSize(2) @RegisterRowMapper(SomethingMapper.class) public interface UsesBatching { @SqlBatch("insert into something (name) values (:name)") @GetGeneratedKeys long[] insertNames(@Bind("name") String... names); @SqlBatch("insert into something (name) values (:name)") @GetGeneratedKeys Something[] insertNamesToBean(@Bind("name") Iterable<String> names); @SqlBatch("insert into something (name) values (:name)") @GetGeneratedKeys List<Something> insertVarargs(@Bind("name") String... names); } }
@BatchChunkSize(4) @RegisterRowMapper(SomethingMapper.class) public interface UsesBatching { @SqlBatch("insert into something (id, name) values (:id, :name)") int[] insertBeans(@BindBean Iterable<Something> elements); @SqlBatch(value = "insert into something (id, name) values (:id, :name)", transactional = false) int[] insertBeansNoTx(@BindBean Iterator<Something> elements); @SqlBatch("insert into something (id, name) values (:id, :name)") int[] withConstantValue(@Bind("id") Iterable<Integer> ids, @Bind("name") String name); @SqlBatch("insert into something (id, name) values (:id, :name)") int[] zipArgumentsTogether(@Bind("id") Iterable<Integer> ids, @Bind("name") List<String> name); @SqlBatch("insert into something (id, name) values (:it.id, :it.name)") @BatchChunkSize(2) int[] insertChunked(@BindBean("it") Iterable<Something> its); @SqlBatch("insert into something (id, name) values (:it.id, :it.name)") int[] insertChunked(@BatchChunkSize int size, @BindBean("it") Iterable<Something> its); @SqlQuery("select count(*) from something") int size(); @SqlBatch("insert into test (id) values (:id)") void invalidInsertInt(@Bind("id") int id); @SqlBatch("insert into test (id) values (:id)") void invalidInsertString(@Bind("id") String id); }
@SqlBatch("insert into something (id, name) values (:it.id, :it.name)") @BatchChunkSize(2) int[] insertChunked(@BindBean("it") Iterable<Something> its);
@SqlBatch("insert into something (id, name) values (:it.id, :it.name)") int[] insertChunked(@BatchChunkSize int size, @BindBean("it") Iterable<Something> its);
@SqlBatch("insert into something (id, name) values (:id, :name)") @BatchChunkSize(2) void insertBatch(@Bind("id") List<Integer> ids, @Bind("name") List<String> names);
@SqlBatch("insert into something (id, name) values (:id, :first || ' ' || :last)") @BatchChunkSize(2) void insertFamily(@Bind("id") List<Integer> ids, @Bind("first") Iterator<String> firstNames, @Bind("last") String lastName);
@BatchChunkSize(4) @RegisterConstructorMapper(BatchingRow.class) public interface SingleValueBatching { @SqlBatch("insert into batching (id, values) values (:id, :values)") int[] insertValues(int[] id, @SingleValue int[] values); @SqlQuery("select id, values from batching order by id asc") List<BatchingRow> select(); }
@BatchChunkSize(4) @RegisterRowMapper(SomethingMapper.class) public interface UsesBatching { @SqlBatch("insert into something (id, name) values (:id, :name)") int[] insertBeans(@BindBean Iterable<Something> elements); @SqlBatch(value = "insert into something (id, name) values (:id, :name)", transactional = false) int[] insertBeansNoTx(@BindBean Iterator<Something> elements); @SqlBatch("insert into something (id, name) values (:id, :name)") int[] withConstantValue(@Bind("id") Iterable<Integer> ids, @Bind("name") String name); @SqlBatch("insert into something (id, name) values (:id, :name)") int[] zipArgumentsTogether(@Bind("id") Iterable<Integer> ids, @Bind("name") List<String> name); @SqlBatch("insert into something (id, name) values (:it.id, :it.name)") @BatchChunkSize(2) int[] insertChunked(@BindBean("it") Iterable<Something> its); @SqlBatch("insert into something (id, name) values (:it.id, :it.name)") int[] insertChunked(@BatchChunkSize int size, @BindBean("it") Iterable<Something> its); @SqlQuery("select count(*) from something") int size(); @SqlBatch("insert into test (id) values (:id)") void invalidInsertInt(@Bind("id") int id); @SqlBatch("insert into test (id) values (:id)") void invalidInsertString(@Bind("id") String id); }
@SqlBatch("insert into something (id, name) values (:it.id, :it.name)") @BatchChunkSize(2) int[] insertChunked(@BindBean("it") Iterable<Something> its);
@SqlBatch("insert into something (id, name) values (:it.id, :it.name)") int[] insertChunked(@BatchChunkSize int size, @BindBean("it") Iterable<Something> its);
@SqlBatch("insert into something (id, name) values (:id, :name)") @BatchChunkSize(2) void insertBatch(@Bind("id") List<Integer> ids, @Bind("name") List<String> names);
@SqlBatch("insert into something (id, name) values (:id, :first || ' ' || :last)") @BatchChunkSize(2) void insertFamily(@Bind("id") List<Integer> ids, @Bind("first") Iterator<String> firstNames, @Bind("last") String lastName);