Class ConstructorMapper<T>

  • All Implemented Interfaces:
    RowMapper<T>

    public final class ConstructorMapper<T>
    extends java.lang.Object
    implements RowMapper<T>
    A row mapper which maps the fields in a result set into a constructor. The default implementation will perform a case insensitive mapping between the constructor parameter names and the column labels, also considering camel-case to underscores conversion.

    This mapper respects Nested annotations on constructor parameters.

    Constructor parameters annotated as @Nullable may be omitted from the result set without error. Any annotation named "Nullable" can be used, no matter which package it is from.

    • Field Detail

      • UNMATCHED_CONSTRUCTOR_PARAMETERS

        private static final java.lang.String UNMATCHED_CONSTRUCTOR_PARAMETERS
        See Also:
        Constant Field Values
      • UNMATCHED_CONSTRUCTOR_PARAMETER

        private static final java.lang.String UNMATCHED_CONSTRUCTOR_PARAMETER
        See Also:
        Constant Field Values
      • prefix

        private final java.lang.String prefix
      • constructorProperties

        private final java.beans.ConstructorProperties constructorProperties
      • nestedMappers

        private final java.util.Map<java.lang.reflect.Parameter,​ConstructorMapper<?>> nestedMappers
    • Constructor Detail

      • ConstructorMapper

        private ConstructorMapper​(InstanceFactory<T> factory,
                                  java.lang.String prefix)
    • Method Detail

      • factory

        public static RowMapperFactory factory​(java.lang.Class<?> clazz)
        Use the only declared constructor to map a class.
        Parameters:
        clazz - the class to find a constructor of
        Returns:
        the factory
      • factory

        public static RowMapperFactory factory​(java.lang.Class<?> clazz,
                                               java.lang.String prefix)
        Use the only declared constructor to map a class.
        Parameters:
        clazz - the class to find a constructor of
        prefix - a prefix for the parameter names
        Returns:
        the factory
      • factory

        public static RowMapperFactory factory​(java.lang.reflect.Constructor<?> constructor)
        Use a Constructor<T> to map its declaring type.
        Parameters:
        constructor - the constructor to invoke
        Returns:
        the factory
      • factory

        public static RowMapperFactory factory​(java.lang.reflect.Constructor<?> constructor,
                                               java.lang.String prefix)
        Use a Constructor<T> to map its declaring type.
        Parameters:
        constructor - the constructor to invoke
        prefix - a prefix to the constructor parameter names
        Returns:
        the factory
      • of

        public static <T> RowMapper<T> of​(java.lang.Class<T> type)
        Return a ConstructorMapper for the given type.
        Type Parameters:
        T - the type to map
        Parameters:
        type - the mapped type
        Returns:
        the mapper
      • of

        public static <T> RowMapper<T> of​(java.lang.Class<T> type,
                                          java.lang.String prefix)
        Return a ConstructorMapper for the given type and prefix.
        Type Parameters:
        T - the type to map
        Parameters:
        type - the mapped type
        prefix - the column name prefix
        Returns:
        the mapper
      • of

        public static <T> RowMapper<T> of​(java.lang.reflect.Constructor<T> constructor)
        Return a ConstructorMapper using the given constructor
        Type Parameters:
        T - the type to map
        Parameters:
        constructor - the constructor to be used in mapping
        Returns:
        the mapper
      • of

        public static <T> RowMapper<T> of​(java.lang.reflect.Constructor<T> constructor,
                                          java.lang.String prefix)
        Instantiate a ConstructorMapper using the given constructor and prefix
        Type Parameters:
        T - the type to map
        Parameters:
        constructor - the constructor to be used in mapping
        prefix - the column name prefix
        Returns:
        the mapper
      • map

        public T map​(java.sql.ResultSet rs,
                     StatementContext ctx)
              throws java.sql.SQLException
        Description copied from interface: RowMapper
        Map the current row of the result set. This method should not cause the result set to advance; allow Jdbi to do that, please.
        Specified by:
        map in interface RowMapper<T>
        Parameters:
        rs - the result set being iterated
        ctx - the statement context
        Returns:
        the value to produce for this row
        Throws:
        java.sql.SQLException - if anything goes wrong go ahead and let this percolate; Jdbi will handle it
      • specialize

        public RowMapper<T> specialize​(java.sql.ResultSet rs,
                                       StatementContext ctx)
                                throws java.sql.SQLException
        Description copied from interface: RowMapper
        Returns a specialized row mapper, optimized for the given result set.

        Before mapping the result set from a SQL statement; Jdbi will first call this method to obtain a specialized instance. The returned mapper will then be used to map the result set rows, and discarded.

        Implementing this method is optional; the default implementation returns this. Implementors might choose to override this method to improve performance, e.g. by matching up column names to properties once for the entire result set, rather than repeating the process for every row.

        Specified by:
        specialize in interface RowMapper<T>
        Parameters:
        rs - the result set to specialize over
        ctx - the statement context to specialize over
        Returns:
        a row mapper equivalent to this one, possibly specialized.
        Throws:
        java.sql.SQLException - if anything goes wrong go ahead and let this percolate; Jdbi will handle it
        See Also:
        for an example of specialization.
      • createSpecializedRowMapper

        private java.util.Optional<RowMapper<T>> createSpecializedRowMapper​(StatementContext ctx,
                                                                            java.util.List<java.lang.String> columnNames,
                                                                            java.util.List<ColumnNameMatcher> columnNameMatchers,
                                                                            java.util.List<java.lang.String> unmatchedColumns)
      • locatePropagateNullColumnIndex

        private java.util.OptionalInt locatePropagateNullColumnIndex​(java.util.List<java.lang.String> columnNames,
                                                                     java.util.List<ColumnNameMatcher> columnNameMatchers)
      • isNullable

        private boolean isNullable​(java.lang.reflect.Parameter parameter)
      • paramName

        private static java.lang.String paramName​(java.lang.reflect.Parameter[] parameters,
                                                  int position,
                                                  java.beans.ConstructorProperties parameterNames)
      • debugName

        private java.lang.String debugName​(java.lang.reflect.Parameter parameter)