Class BeanPropertyRowMapper<T>

java.lang.Object
org.springframework.jdbc.core.BeanPropertyRowMapper<T>
Type Parameters:
T - the result type
All Implemented Interfaces:
RowMapper<T>
Direct Known Subclasses:
DataClassRowMapper

public class BeanPropertyRowMapper<T> extends Object implements RowMapper<T>
RowMapper implementation that converts a row into a new instance of the specified mapped target class. The mapped target class must be a top-level class and it must have a default or no-arg constructor.

Column values are mapped based on matching the column name as obtained from result set meta-data to public setters for the corresponding properties. The names are matched either directly or by transforming a name separating the parts with underscores to the same name using "camel" case.

Mapping is provided for fields in the target class for many common types, e.g.: String, boolean, Boolean, byte, Byte, short, Short, int, Integer, long, Long, float, Float, double, Double, BigDecimal, java.util.Date, etc.

To facilitate mapping between columns and fields that don't have matching names, try using column aliases in the SQL statement like "select fname as first_name from customer".

For 'null' values read from the database, we will attempt to call the setter, but in the case of Java primitives, this causes a TypeMismatchException. This class can be configured (using the primitivesDefaultedForNullValue property) to trap this exception and use the primitives default value. Be aware that if you use the values from the generated bean to update the database the primitive value will have been set to the primitive's default value instead of null.

Please note that this class is designed to provide convenience rather than high performance. For best performance, consider using a custom RowMapper implementation.

Since:
2.5
Author:
Thomas Risberg, Juergen Hoeller
See Also:
  • Field Details

    • logger

      protected final Log logger
      Logger available to subclasses.
  • Constructor Details

    • BeanPropertyRowMapper

      public BeanPropertyRowMapper()
      Create a new BeanPropertyRowMapper for bean-style configuration.
      See Also:
    • BeanPropertyRowMapper

      public BeanPropertyRowMapper(Class<T> mappedClass)
      Create a new BeanPropertyRowMapper, accepting unpopulated properties in the target bean.
      Parameters:
      mappedClass - the class that each row should be mapped to
    • BeanPropertyRowMapper

      public BeanPropertyRowMapper(Class<T> mappedClass, boolean checkFullyPopulated)
      Create a new BeanPropertyRowMapper.
      Parameters:
      mappedClass - the class that each row should be mapped to
      checkFullyPopulated - whether we're strictly validating that all bean properties have been mapped from corresponding database fields
  • Method Details

    • setMappedClass

      public void setMappedClass(Class<T> mappedClass)
      Set the class that each row should be mapped to.
    • getMappedClass

      @Nullable public final Class<T> getMappedClass()
      Get the class that we are mapping to.
    • setCheckFullyPopulated

      public void setCheckFullyPopulated(boolean checkFullyPopulated)
      Set whether we're strictly validating that all bean properties have been mapped from corresponding database fields.

      Default is false, accepting unpopulated properties in the target bean.

    • isCheckFullyPopulated

      public boolean isCheckFullyPopulated()
      Return whether we're strictly validating that all bean properties have been mapped from corresponding database fields.
    • setPrimitivesDefaultedForNullValue

      public void setPrimitivesDefaultedForNullValue(boolean primitivesDefaultedForNullValue)
      Set whether we're defaulting Java primitives in the case of mapping a null value from corresponding database fields.

      Default is false, throwing an exception when nulls are mapped to Java primitives.

    • isPrimitivesDefaultedForNullValue

      public boolean isPrimitivesDefaultedForNullValue()
      Return whether we're defaulting Java primitives in the case of mapping a null value from corresponding database fields.
    • setConversionService

      public void setConversionService(@Nullable ConversionService conversionService)
      Set a ConversionService for binding JDBC values to bean properties, or null for none.

      Default is a DefaultConversionService, as of Spring 4.3. This provides support for java.time conversion and other special types.

      Since:
      4.3
      See Also:
    • getConversionService

      @Nullable public ConversionService getConversionService()
      Return a ConversionService for binding JDBC values to bean properties, or null if none.
      Since:
      4.3
    • initialize

      protected void initialize(Class<T> mappedClass)
      Initialize the mapping meta-data for the given class.
      Parameters:
      mappedClass - the mapped class
    • suppressProperty

      protected void suppressProperty(String propertyName)
      Remove the specified property from the mapped fields.
      Parameters:
      propertyName - the property name (as used by property descriptors)
      Since:
      5.3.9
    • lowerCaseName

      protected String lowerCaseName(String name)
      Convert the given name to lower case. By default, conversions will happen within the US locale.
      Parameters:
      name - the original name
      Returns:
      the converted name
      Since:
      4.2
    • underscoreName

      protected String underscoreName(String name)
      Convert a name in camelCase to an underscored name in lower case. Any upper case letters are converted to lower case with a preceding underscore.
      Parameters:
      name - the original name
      Returns:
      the converted name
      Since:
      4.2
      See Also:
    • mapRow

      public T mapRow(ResultSet rs, int rowNumber) throws SQLException
      Extract the values for all columns in the current row.

      Utilizes public setters and result set meta-data.

      Specified by:
      mapRow in interface RowMapper<T>
      Parameters:
      rs - the ResultSet to map (pre-initialized for the current row)
      rowNumber - the number of the current row
      Returns:
      the result object for the current row (may be null)
      Throws:
      SQLException - if an SQLException is encountered getting column values (that is, there's no need to catch SQLException)
      See Also:
    • constructMappedInstance

      protected T constructMappedInstance(ResultSet rs, TypeConverter tc) throws SQLException
      Construct an instance of the mapped class for the current row.
      Parameters:
      rs - the ResultSet to map (pre-initialized for the current row)
      tc - a TypeConverter with this RowMapper's conversion service
      Returns:
      a corresponding instance of the mapped class
      Throws:
      SQLException - if an SQLException is encountered
      Since:
      5.3
    • initBeanWrapper

      protected void initBeanWrapper(BeanWrapper bw)
      Initialize the given BeanWrapper to be used for row mapping. To be called for each row.

      The default implementation applies the configured ConversionService, if any. Can be overridden in subclasses.

      Parameters:
      bw - the BeanWrapper to initialize
      See Also:
    • getColumnValue

      @Nullable protected Object getColumnValue(ResultSet rs, int index, PropertyDescriptor pd) throws SQLException
      Retrieve a JDBC object value for the specified column.

      The default implementation delegates to getColumnValue(ResultSet, int, Class).

      Parameters:
      rs - is the ResultSet holding the data
      index - is the column index
      pd - the bean property that each result object is expected to match
      Returns:
      the Object value
      Throws:
      SQLException - in case of extraction failure
      See Also:
    • getColumnValue

      @Nullable protected Object getColumnValue(ResultSet rs, int index, Class<?> paramType) throws SQLException
      Retrieve a JDBC object value for the specified column.

      The default implementation calls JdbcUtils.getResultSetValue(java.sql.ResultSet, int, Class). Subclasses may override this to check specific value types upfront, or to post-process values return from getResultSetValue.

      Parameters:
      rs - is the ResultSet holding the data
      index - is the column index
      paramType - the target parameter type
      Returns:
      the Object value
      Throws:
      SQLException - in case of extraction failure
      Since:
      5.3
      See Also:
    • newInstance

      public static <T> BeanPropertyRowMapper<T> newInstance(Class<T> mappedClass)
      Static factory method to create a new BeanPropertyRowMapper.
      Parameters:
      mappedClass - the class that each row should be mapped to
      See Also:
    • newInstance

      public static <T> BeanPropertyRowMapper<T> newInstance(Class<T> mappedClass, @Nullable ConversionService conversionService)
      Static factory method to create a new BeanPropertyRowMapper.
      Parameters:
      mappedClass - the class that each row should be mapped to
      conversionService - the ConversionService for binding JDBC values to bean properties, or null for none
      Since:
      5.2.3
      See Also: