
该
queryForObject方法如下所示:
public <T> T queryForObject(String sql, RowMapper<T> rowMapper, Object... args) throws DataAccessException { List<T> results = query(sql, args, new RowMapperResultSetExtractor<T>(rowMapper, 1)); return DataAccessUtils.requiredSingleResult(results);}所述
queryForObject-method内部调用该方法
query的上
JdbcTemplate对象。所述
query-method定义为:
public <T> T query( PreparedStatementCreator psc, final PreparedStatementSetter pss, final ResultSetExtractor<T> rse) throws DataAccessException;
如您所见,a
ResultSetExtractor<T>传递给
query-method,Spring方便地将您转换
RowMapper<T>为type对象
newRowMapperResultSetExtractor<T>(rowMapper,1)。该
RowMapperResultSetExtractor是保存的关键法宝的对象。调用对象时,它将按照以下代码片段迭代所有行:
public List<T> extractData(ResultSet rs) throws SQLException { List<T> results = (this.rowsExpected > 0 ? new ArrayList<T>(this.rowsExpected) : new ArrayList<T>()); int rowNum = 0; while (rs.next()) { results.add(this.rowMapper.mapRow(rs, rowNum++)); } return results;}因此,您的原始内容
RowMapper是为每一行调用的回调。此外,如您在此处看到的,
RowMapper将为所有匹配的结果调用,并将
Restaurant您创建的-
object添加到结果列表中。但是,由于仅查询 一个 对象,因此以下语句最终用于返回单个
Restaurant对象。
return DataAccessUtils.requiredSingleResult(results);
因此,总结一下:
JdbcTempalte实现了Strategy
Pattern(类似于Template方法模式)。并且通过提供一个
Strategy接口
(
RowMapper),您可以
JdbcTemplate为您完成繁重的工作(处理异常,连接等)。该
RowMapper地图将每个
Restaurant匹配项都映射为POJO
,所有匹配项都被收集到中
List。
queryForObject然后,该方法从中获取第一行,
List并将其返回给调用方。返回值基于的通用类型
RowMapper,在您的情况下为
Restaurant。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)