Search in sources :

Example 6 with Mappers

use of org.jdbi.v3.core.mapper.Mappers in project jdbi by jdbi.

the class RegisterConstructorMapperImpl method configureForType.

@Override
public void configureForType(ConfigRegistry registry, Annotation annotation, Class<?> sqlObjectType) {
    RegisterConstructorMapper registerConstructorMapper = (RegisterConstructorMapper) annotation;
    RowMappers mappers = registry.get(RowMappers.class);
    Class<?> type = registerConstructorMapper.value();
    String prefix = registerConstructorMapper.prefix();
    if (prefix.isEmpty()) {
        mappers.register(ConstructorMapper.factory(type));
    } else {
        mappers.register(ConstructorMapper.factory(type, prefix));
    }
}
Also used : RegisterConstructorMapper(org.jdbi.v3.sqlobject.config.RegisterConstructorMapper) RowMappers(org.jdbi.v3.core.mapper.RowMappers)

Example 7 with Mappers

use of org.jdbi.v3.core.mapper.Mappers in project jdbi by jdbi.

the class ConstructorMapper method specialize0.

private RowMapper<T> specialize0(ResultSet rs, StatementContext ctx, List<String> columnNames, List<ColumnNameMatcher> columnNameMatchers, List<String> unmatchedColumns) throws SQLException {
    final int count = constructor.getParameterCount();
    final Parameter[] parameters = constructor.getParameters();
    final RowMapper<?>[] mappers = new RowMapper<?>[count];
    for (int i = 0; i < count; i++) {
        final Parameter parameter = parameters[i];
        Nested anno = parameter.getAnnotation(Nested.class);
        if (anno == null) {
            final String paramName = prefix + paramName(parameters, i, constructorProperties);
            final int columnIndex = findColumnIndex(paramName, columnNames, columnNameMatchers, () -> debugName(parameter)).orElseThrow(() -> new IllegalArgumentException(String.format("Constructor '%s' parameter '%s' has no column in the result set. " + "Verify that the Java compiler is configured to emit parameter names, " + "that your result set has the columns expected, or annotate the " + "parameter names explicitly with @ColumnName", constructor, paramName)));
            final Type type = parameter.getParameterizedType();
            mappers[i] = ctx.findColumnMapperFor(type).map(mapper -> new SingleColumnMapper(mapper, columnIndex + 1)).orElseThrow(() -> new IllegalArgumentException(String.format("Could not find column mapper for type '%s' of parameter '%s' for constructor '%s'", type, paramName, constructor)));
            unmatchedColumns.remove(columnNames.get(columnIndex));
        } else {
            String nestedPrefix = prefix + anno.value();
            mappers[i] = nestedMappers.computeIfAbsent(parameter, p -> new ConstructorMapper<>(findConstructorFor(p.getType()), nestedPrefix)).specialize0(rs, ctx, columnNames, columnNameMatchers, unmatchedColumns);
        }
    }
    return (r, c) -> {
        final Object[] params = new Object[count];
        for (int i = 0; i < count; i++) {
            params[i] = mappers[i].map(r, c);
        }
        return construct(params);
    };
}
Also used : ReflectionMapperUtil.getColumnNames(org.jdbi.v3.core.mapper.reflect.ReflectionMapperUtil.getColumnNames) RowMapperFactory(org.jdbi.v3.core.mapper.RowMapperFactory) ConstructorProperties(java.beans.ConstructorProperties) ConcurrentHashMap(java.util.concurrent.ConcurrentHashMap) Nested(org.jdbi.v3.core.mapper.Nested) SingleColumnMapper(org.jdbi.v3.core.mapper.SingleColumnMapper) Constructor(java.lang.reflect.Constructor) JdbiConstructors.findConstructorFor(org.jdbi.v3.core.mapper.reflect.JdbiConstructors.findConstructorFor) InvocationTargetException(java.lang.reflect.InvocationTargetException) ArrayList(java.util.ArrayList) StatementContext(org.jdbi.v3.core.statement.StatementContext) SQLException(java.sql.SQLException) List(java.util.List) Type(java.lang.reflect.Type) Parameter(java.lang.reflect.Parameter) ResultSet(java.sql.ResultSet) Map(java.util.Map) ReflectionMapperUtil.findColumnIndex(org.jdbi.v3.core.mapper.reflect.ReflectionMapperUtil.findColumnIndex) RowMapper(org.jdbi.v3.core.mapper.RowMapper) Type(java.lang.reflect.Type) SingleColumnMapper(org.jdbi.v3.core.mapper.SingleColumnMapper) Nested(org.jdbi.v3.core.mapper.Nested) Parameter(java.lang.reflect.Parameter) RowMapper(org.jdbi.v3.core.mapper.RowMapper)

Example 8 with Mappers

use of org.jdbi.v3.core.mapper.Mappers in project jdbi by jdbi.

the class FieldMapper method specialize0.

private RowMapper<T> specialize0(ResultSet rs, StatementContext ctx, List<String> columnNames, List<ColumnNameMatcher> columnNameMatchers, List<String> unmatchedColumns) throws SQLException {
    final List<RowMapper<?>> mappers = new ArrayList<>();
    final List<Field> fields = new ArrayList<>();
    for (Class<?> aType = type; aType != null; aType = aType.getSuperclass()) {
        for (Field field : aType.getDeclaredFields()) {
            Nested anno = field.getAnnotation(Nested.class);
            if (anno == null) {
                String paramName = prefix + paramName(field);
                findColumnIndex(paramName, columnNames, columnNameMatchers, () -> debugName(field)).ifPresent(index -> {
                    Type type = field.getGenericType();
                    ColumnMapper<?> mapper = ctx.findColumnMapperFor(type).orElse((r, n, c) -> rs.getObject(n));
                    mappers.add(new SingleColumnMapper(mapper, index + 1));
                    fields.add(field);
                    unmatchedColumns.remove(columnNames.get(index));
                });
            } else {
                String nestedPrefix = prefix + anno.value().toLowerCase();
                RowMapper<?> mapper = nestedMappers.computeIfAbsent(field, f -> new FieldMapper<>(field.getType(), nestedPrefix)).specialize0(rs, ctx, columnNames, columnNameMatchers, unmatchedColumns);
                mappers.add(mapper);
                fields.add(field);
            }
        }
    }
    if (mappers.isEmpty() && columnNames.size() > 0) {
        throw new IllegalArgumentException(String.format("Mapping fields for type %s " + "didn't find any matching columns in result set", type));
    }
    return (r, c) -> {
        T obj = construct();
        for (int i = 0; i < mappers.size(); i++) {
            RowMapper<?> mapper = mappers.get(i);
            Field field = fields.get(i);
            Object value = mapper.map(rs, ctx);
            writeField(obj, field, value);
        }
        return obj;
    };
}
Also used : ReflectionMapperUtil.getColumnNames(org.jdbi.v3.core.mapper.reflect.ReflectionMapperUtil.getColumnNames) RowMapperFactory(org.jdbi.v3.core.mapper.RowMapperFactory) ConcurrentHashMap(java.util.concurrent.ConcurrentHashMap) Nested(org.jdbi.v3.core.mapper.Nested) Field(java.lang.reflect.Field) SingleColumnMapper(org.jdbi.v3.core.mapper.SingleColumnMapper) ArrayList(java.util.ArrayList) StatementContext(org.jdbi.v3.core.statement.StatementContext) SQLException(java.sql.SQLException) List(java.util.List) Type(java.lang.reflect.Type) ResultSet(java.sql.ResultSet) Map(java.util.Map) ReflectionMapperUtil.findColumnIndex(org.jdbi.v3.core.mapper.reflect.ReflectionMapperUtil.findColumnIndex) ColumnMapper(org.jdbi.v3.core.mapper.ColumnMapper) Optional(java.util.Optional) RowMapper(org.jdbi.v3.core.mapper.RowMapper) SingleColumnMapper(org.jdbi.v3.core.mapper.SingleColumnMapper) ArrayList(java.util.ArrayList) Nested(org.jdbi.v3.core.mapper.Nested) Field(java.lang.reflect.Field) Type(java.lang.reflect.Type) RowMapper(org.jdbi.v3.core.mapper.RowMapper)

Example 9 with Mappers

use of org.jdbi.v3.core.mapper.Mappers in project jdbi by jdbi.

the class RegisterFieldMapperImpl method configureForType.

@Override
public void configureForType(ConfigRegistry registry, Annotation annotation, Class<?> sqlObjectType) {
    RegisterFieldMapper registerFieldMapper = (RegisterFieldMapper) annotation;
    Class<?> type = registerFieldMapper.value();
    String prefix = registerFieldMapper.prefix();
    RowMappers mappers = registry.get(RowMappers.class);
    if (prefix.isEmpty()) {
        mappers.register(FieldMapper.factory(type));
    } else {
        mappers.register(FieldMapper.factory(type, prefix));
    }
}
Also used : RegisterFieldMapper(org.jdbi.v3.sqlobject.config.RegisterFieldMapper) RowMappers(org.jdbi.v3.core.mapper.RowMappers)

Example 10 with Mappers

use of org.jdbi.v3.core.mapper.Mappers in project jdbi by jdbi.

the class RegisterBeanMapperImpl method configureForType.

@Override
@SuppressWarnings("deprecation")
public void configureForType(ConfigRegistry registry, Annotation annotation, Class<?> sqlObjectType) {
    RegisterBeanMapper registerBeanMapper = (RegisterBeanMapper) annotation;
    Class<?> beanClass = registerBeanMapper.value();
    String prefix = registerBeanMapper.prefix();
    RowMappers mappers = registry.get(RowMappers.class);
    if (prefix.isEmpty()) {
        mappers.register(BeanMapper.factory(beanClass));
    } else {
        mappers.register(BeanMapper.factory(beanClass, prefix));
    }
}
Also used : RowMappers(org.jdbi.v3.core.mapper.RowMappers) RegisterBeanMapper(org.jdbi.v3.sqlobject.config.RegisterBeanMapper)

Aggregations

ResultSet (java.sql.ResultSet)5 SQLException (java.sql.SQLException)5 Map (java.util.Map)5 StatementContext (org.jdbi.v3.core.statement.StatementContext)5 Type (java.lang.reflect.Type)4 RowMappers (org.jdbi.v3.core.mapper.RowMappers)4 ArrayList (java.util.ArrayList)3 List (java.util.List)3 ConcurrentHashMap (java.util.concurrent.ConcurrentHashMap)3 ColumnMapper (org.jdbi.v3.core.mapper.ColumnMapper)3 ColumnMappers (org.jdbi.v3.core.mapper.ColumnMappers)3 Nested (org.jdbi.v3.core.mapper.Nested)3 RowMapper (org.jdbi.v3.core.mapper.RowMapper)3 RowMapperFactory (org.jdbi.v3.core.mapper.RowMapperFactory)3 Injector (com.google.inject.Injector)2 Module (com.google.inject.Module)2 InvocationTargetException (java.lang.reflect.InvocationTargetException)2 JdbcDataSource (org.h2.jdbcx.JdbcDataSource)2 Jdbi (org.jdbi.v3.core.Jdbi)2 SingleColumnMapper (org.jdbi.v3.core.mapper.SingleColumnMapper)2