package org.simpleflatmapper.jdbc.test; import org.junit.Test; import org.simpleflatmapper.jdbc.JdbcColumnKey; import org.simpleflatmapper.jdbc.JdbcMapper; import org.simpleflatmapper.jdbc.JdbcMapperBuilder; import org.simpleflatmapper.test.beans.DbObject; import org.simpleflatmapper.map.Mapper; import org.simpleflatmapper.map.MapperBuilderErrorHandler; import org.simpleflatmapper.map.MappingException; import org.simpleflatmapper.map.property.FieldMapperColumnDefinition; import org.simpleflatmapper.map.error.LogFieldMapperErrorHandler; import org.simpleflatmapper.map.mapper.MapperImpl; import org.simpleflatmapper.reflect.Getter; import org.simpleflatmapper.reflect.getter.FieldGetter; import org.simpleflatmapper.reflect.primitive.LongGetter; import org.simpleflatmapper.util.ListCollector; import java.lang.reflect.Field; import java.sql.ResultSet; import java.sql.SQLException; import java.util.List; import static org.junit.Assert.*; public class JdbcMapperBuilderTest { @Test public void testInstantiateBuilderOnType() throws SQLException { JdbcMapperBuilder<DbObject> builder = new JdbcMapperBuilder<DbObject>(DbObject.class); builder.addMapping("id").addMapping("name"); final JdbcMapper<DbObject> mapper = builder.mapper(); List<DbObject> l = mapper.forEach(new MockDbObjectResultSet(1), new ListCollector<DbObject>()).getList(); assertEquals(1, l.size()); assertEquals(1, l.get(0).getId()); assertEquals("name1", l.get(0).getName()); } @Test public void testWithWrongColumn() throws MappingException, SQLException { JdbcMapperBuilder<DbObject> builder = JdbcMapperFactoryHelper.asm().mapperBuilderErrorHandler(MapperBuilderErrorHandler.NULL).newBuilder(DbObject.class); builder.addMapping("no_id").addMapping("no_name").addMapping("email"); JdbcMapper<DbObject> mapper = builder.mapper(); List<DbObject> l = mapper.forEach(new MockDbObjectResultSet(1), new ListCollector<DbObject>()).getList(); assertEquals(1, l.size()); assertEquals(0, l.get(0).getId()); assertNull(l.get(0).getName()); assertEquals("email1", l.get(0).getEmail()); } @Test public void testAsmFactoryJdbcMapperCache() throws Exception { Mapper<ResultSet, DbObject> mapper1 = getSubMapper(JdbcMapperFactoryHelper.asm().newBuilder(DbObject.class).addMapping("id").addMapping("name").mapper()); Mapper<ResultSet, DbObject> mapper2 = getSubMapper(JdbcMapperFactoryHelper.asm().newBuilder(DbObject.class).addMapping("id").addMapping("name").mapper()); final FieldMapperColumnDefinition<JdbcColumnKey> columnDefinition = FieldMapperColumnDefinition.customGetter(new StaticLongGetter<ResultSet>(3)); Mapper<ResultSet, DbObject> mapper3 = getSubMapper( JdbcMapperFactoryHelper.asm().fieldMapperErrorHandler(new LogFieldMapperErrorHandler<JdbcColumnKey>()).newBuilder(DbObject.class).addMapping("id", columnDefinition).addMapping("name") .mapper()); assertNotSame(mapper1, mapper2); assertSame(mapper1.getClass(), mapper2.getClass()); assertNotSame(mapper1.getClass(), mapper3.getClass()); assertTrue(mapper1.getClass().getSimpleName().startsWith("AsmMapperFrom")); assertTrue(mapper2.getClass().getSimpleName().startsWith("AsmMapperFrom")); assertTrue(mapper3.getClass().getSimpleName().startsWith("AsmMapperFrom")); } private Mapper<ResultSet, DbObject> getSubMapper(JdbcMapper<DbObject> mapper) throws Exception { Field field; try { field = mapper.getClass().getDeclaredField("mapper"); } catch(NoSuchFieldException e) { field = mapper.getClass().getSuperclass().getDeclaredField("mapper"); } field.setAccessible(true); return new FieldGetter<JdbcMapper<?>, MapperImpl<ResultSet, DbObject>>(field) .get(mapper); } static class StaticLongGetter<T> implements LongGetter<T>, Getter<T, Long> { private final long l; StaticLongGetter(long l) { this.l = l; } @Override public Long get(T target) throws Exception { return l; } @Override public long getLong(T target) throws Exception { return l; } } }