T
- the result typepublic 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 or static
nested 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 in the target class 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 properties in the target class for many common types —
for example: 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 properties that don't have matching
names, try using column aliases in the SQL statement like
"select fname as first_name from customer"
, where first_name
can be mapped to a setFirstName(String)
method in the target class.
For a NULL
value read from the database, an attempt will be made to
call the corresponding setter method with null
, but in the case of
Java primitives this will result in a TypeMismatchException
by default.
To ignore NULL
database values for all primitive properties in the
target class, set the primitivesDefaultedForNullValue
flag to
true
. See setPrimitivesDefaultedForNullValue(boolean)
for
details.
If you need to map to a target class which has a data class constructor
— for example, a Java record
or a Kotlin data
class —
use DataClassRowMapper
instead.
Please note that this class is designed to provide convenience rather than
high performance. For best performance, consider using a custom RowMapper
implementation.
DataClassRowMapper
Modifier and Type | Field and Description |
---|---|
protected Log |
logger
Logger available to subclasses.
|
Constructor and Description |
---|
BeanPropertyRowMapper()
Create a new
BeanPropertyRowMapper for bean-style configuration. |
BeanPropertyRowMapper(Class<T> mappedClass)
Create a new
BeanPropertyRowMapper , accepting unpopulated
properties in the target bean. |
BeanPropertyRowMapper(Class<T> mappedClass,
boolean checkFullyPopulated)
Create a new
BeanPropertyRowMapper . |
Modifier and Type | Method and Description |
---|---|
protected T |
constructMappedInstance(ResultSet rs,
TypeConverter tc)
Construct an instance of the mapped class for the current row.
|
protected Object |
getColumnValue(ResultSet rs,
int index,
Class<?> paramType)
Retrieve a JDBC object value for the specified column.
|
protected Object |
getColumnValue(ResultSet rs,
int index,
PropertyDescriptor pd)
Retrieve a JDBC object value for the specified column.
|
ConversionService |
getConversionService()
Return a
ConversionService for binding JDBC values to bean properties,
or null if none. |
Class<T> |
getMappedClass()
Get the class that we are mapping to.
|
protected void |
initBeanWrapper(BeanWrapper bw)
Initialize the given BeanWrapper to be used for row mapping.
|
protected void |
initialize(Class<T> mappedClass)
Initialize the mapping meta-data for the given class.
|
boolean |
isCheckFullyPopulated()
Return whether we're strictly validating that all bean properties have been
mapped from corresponding database columns.
|
boolean |
isPrimitivesDefaultedForNullValue()
Get the value of the
primitivesDefaultedForNullValue flag. |
protected String |
lowerCaseName(String name)
Convert the given name to lower case.
|
T |
mapRow(ResultSet rs,
int rowNumber)
Extract the values for all columns in the current row.
|
static <T> BeanPropertyRowMapper<T> |
newInstance(Class<T> mappedClass)
Static factory method to create a new
BeanPropertyRowMapper . |
static <T> BeanPropertyRowMapper<T> |
newInstance(Class<T> mappedClass,
ConversionService conversionService)
Static factory method to create a new
BeanPropertyRowMapper . |
void |
setCheckFullyPopulated(boolean checkFullyPopulated)
Set whether we're strictly validating that all bean properties have been mapped
from corresponding database columns.
|
void |
setConversionService(ConversionService conversionService)
Set a
ConversionService for binding JDBC values to bean properties,
or null for none. |
void |
setMappedClass(Class<T> mappedClass)
Set the class that each row should be mapped to.
|
void |
setPrimitivesDefaultedForNullValue(boolean primitivesDefaultedForNullValue)
Set whether a
NULL database column value should be ignored when
mapping to a corresponding primitive property in the target class. |
protected void |
suppressProperty(String propertyName)
Remove the specified property from the mapped properties.
|
protected String |
underscoreName(String name)
Convert a name in camelCase to an underscored name in lower case.
|
protected final Log logger
public BeanPropertyRowMapper()
BeanPropertyRowMapper
for bean-style configuration.public BeanPropertyRowMapper(Class<T> mappedClass)
BeanPropertyRowMapper
, accepting unpopulated
properties in the target bean.mappedClass
- the class that each row should be mapped topublic BeanPropertyRowMapper(Class<T> mappedClass, boolean checkFullyPopulated)
BeanPropertyRowMapper
.mappedClass
- the class that each row should be mapped tocheckFullyPopulated
- whether we're strictly validating that
all bean properties have been mapped from corresponding database columnspublic void setMappedClass(Class<T> mappedClass)
@Nullable public final Class<T> getMappedClass()
public void setCheckFullyPopulated(boolean checkFullyPopulated)
Default is false
, accepting unpopulated properties in the target bean.
public boolean isCheckFullyPopulated()
public void setPrimitivesDefaultedForNullValue(boolean primitivesDefaultedForNullValue)
NULL
database column value should be ignored when
mapping to a corresponding primitive property in the target class.
Default is false
, throwing an exception when nulls are mapped
to Java primitives.
If this flag is set to true
and you use an ignored
primitive property value from the mapped bean to update the database, the
value in the database will be changed from NULL
to the current value
of that primitive property. That value may be the property's initial value
(potentially Java's default value for the respective primitive type), or
it may be some other value set for the property in the default constructor
(or initialization block) or as a side effect of setting some other property
in the mapped bean.
public boolean isPrimitivesDefaultedForNullValue()
primitivesDefaultedForNullValue
flag.public void setConversionService(@Nullable ConversionService conversionService)
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.
initBeanWrapper(BeanWrapper)
@Nullable public ConversionService getConversionService()
ConversionService
for binding JDBC values to bean properties,
or null
if none.protected void initialize(Class<T> mappedClass)
mappedClass
- the mapped classprotected void suppressProperty(String propertyName)
propertyName
- the property name (as used by property descriptors)protected String lowerCaseName(String name)
name
- the original nameprotected String underscoreName(String name)
name
- the original namelowerCaseName(java.lang.String)
public T mapRow(ResultSet rs, int rowNumber) throws SQLException
Utilizes public setters and result set meta-data.
mapRow
in interface RowMapper<T>
rs
- the ResultSet
to map (pre-initialized for the current row)rowNumber
- the number of the current rownull
)SQLException
- if an SQLException is encountered while getting
column values (that is, there's no need to catch SQLException)ResultSetMetaData
protected T constructMappedInstance(ResultSet rs, TypeConverter tc) throws SQLException
rs
- the ResultSet to map (pre-initialized for the current row)tc
- a TypeConverter with this RowMapper's conversion serviceSQLException
- if an SQLException is encounteredprotected void initBeanWrapper(BeanWrapper bw)
The default implementation applies the configured ConversionService
,
if any. Can be overridden in subclasses.
bw
- the BeanWrapper to initializegetConversionService()
,
ConfigurablePropertyAccessor.setConversionService(org.springframework.core.convert.ConversionService)
@Nullable protected Object getColumnValue(ResultSet rs, int index, PropertyDescriptor pd) throws SQLException
The default implementation calls
JdbcUtils.getResultSetValue(java.sql.ResultSet, int, Class)
using the type of the specified PropertyDescriptor
.
Subclasses may override this to check specific value types upfront,
or to post-process values returned from getResultSetValue
.
rs
- is the ResultSet holding the dataindex
- is the column indexpd
- the bean property that each result object is expected to matchSQLException
- in case of extraction failuregetColumnValue(ResultSet, int, Class)
@Nullable protected Object getColumnValue(ResultSet rs, int index, Class<?> paramType) throws SQLException
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 returned from getResultSetValue
.
rs
- is the ResultSet holding the dataindex
- is the column indexparamType
- the target parameter typeSQLException
- in case of extraction failureJdbcUtils.getResultSetValue(java.sql.ResultSet, int, Class)
public static <T> BeanPropertyRowMapper<T> newInstance(Class<T> mappedClass)
BeanPropertyRowMapper
.mappedClass
- the class that each row should be mapped tonewInstance(Class, ConversionService)
public static <T> BeanPropertyRowMapper<T> newInstance(Class<T> mappedClass, @Nullable ConversionService conversionService)
BeanPropertyRowMapper
.mappedClass
- the class that each row should be mapped toconversionService
- the ConversionService
for binding
JDBC values to bean properties, or null
for nonenewInstance(Class)
,
setConversionService(org.springframework.core.convert.ConversionService)