package jdbi.doc; import static org.assertj.core.api.Assertions.assertThat; import java.util.Arrays; import java.util.Collection; import org.jdbi.v3.core.Handle; import org.jdbi.v3.core.rule.H2DatabaseRule; import org.jdbi.v3.core.statement.Batch; import org.jdbi.v3.core.statement.PreparedBatch; import org.jdbi.v3.sqlobject.SqlObjectPlugin; import org.jdbi.v3.sqlobject.customizer.BindBean; import org.jdbi.v3.sqlobject.statement.SqlBatch; import org.jdbi.v3.sqlobject.statement.SqlQuery; import org.junit.Before; import org.junit.Rule; import org.junit.Test; public class BatchTest { @Rule public H2DatabaseRule dbRule = new H2DatabaseRule().withPlugin(new SqlObjectPlugin()); private Handle handle; @Before public void getHandle() { handle = dbRule.getSharedHandle(); handle.execute("CREATE TABLE fruit (id INT PRIMARY KEY, name VARCHAR)"); } @Test // tag::simpleBatch[] public void testSimpleBatch() { Batch batch = handle.createBatch(); batch.add("INSERT INTO fruit VALUES(0, 'apple')"); batch.add("INSERT INTO fruit VALUES(1, 'banana')"); int[] rowsModified = batch.execute(); assertThat(rowsModified).containsExactly(1, 1); assertThat(handle.createQuery("SELECT count(1) FROM fruit") .mapTo(int.class) .findOnly() .intValue()) .isEqualTo(2); } // end::simpleBatch[] @Test // tag::preparedBatch[] public void testPreparedBatch() { PreparedBatch batch = handle.prepareBatch("INSERT INTO fruit VALUES(:id, :name)"); batch.bind("id", 0).bind("name", "apple").add(); batch.bind("id", 1).bind("name", "banana").add(); int[] rowsModified = batch.execute(); assertThat(rowsModified).containsExactly(1, 1); assertThat(handle.createQuery("SELECT count(1) FROM fruit") .mapTo(int.class) .findOnly() .intValue()) .isEqualTo(2); } // end::preparedBatch[] @Test // tag::sqlObjectBatch[] public void testSqlObjectBatch() { BasketOfFruit basket = handle.attach(BasketOfFruit.class); int[] rowsModified = basket.fillBasket(Arrays.asList( new Fruit(0, "apple"), new Fruit(1, "banana"))); assertThat(rowsModified).containsExactly(1, 1); assertThat(basket.countFruit()).isEqualTo(2); } public interface BasketOfFruit { @SqlBatch("INSERT INTO fruit VALUES(:id, :name)") int[] fillBasket(@BindBean Collection<Fruit> fruits); @SqlQuery("SELECT count(1) FROM fruit") int countFruit(); } public class Fruit { private final int id; private final String name; Fruit(int id, String name) { this.id = id; this.name = name; } public int getId() { return id; } public String getName() { return name; } } // end::sqlObjectBatch[] }