/** * Register bean arguments and row mapping for an {@code Immutable*} value class, expecting the default generated class and builder names. * @param spec the specification interface or abstract class * @param <S> the specification class * @return a plugin that configures type mapping for the given class */ public <S> JdbiImmutables registerImmutable(Class<S> spec) { final Class<? extends S> impl = classByPrefix("Immutable", spec); return registerImmutable(spec, impl, JdbiOptionals.findFirstPresent( () -> nullaryMethodOf(spec, "builder"), () -> nullaryMethodOf(impl, "builder")) .orElseThrow(() -> new IllegalArgumentException("Neither " + spec + " nor " + impl + " have a 'builder' method"))); }
@Test public void simpleTest() { jdbi.getConfig(JdbiImmutables.class).registerImmutable(Train.class); try (Handle handle = jdbi.open()) { handle.execute("create table train (name varchar, carriages int, observation_car boolean)"); assertThat( handle.createUpdate("insert into train(name, carriages, observation_car) values (:name, :carriages, :observationCar)") .bindPojo(ImmutableTrain.builder().name("Zephyr").carriages(8).observationCar(true).build()) .execute()) .isEqualTo(1); assertThat( handle.createQuery("select * from train") .mapTo(Train.class) .findOnly()) .extracting("name", "carriages", "observationCar") .containsExactly("Zephyr", 8, true); } } // end::example[]