我正在学习Spring核心认证,我对Spring如何处理JDBC查询有一些疑问:
String sql = "SELECT count(*) FROM T_REWARD";
int rowsNumber = jdbcTemplate.queryForObject(sql, Integer.class);
因此,为了获得一个作为int值的简单对象,我使用queryForObject()方法,将sql stattment和我期望从该方法接收的对象类型传递给它。
好的,这很简单,我认为这是可以的。
2)查询输入到Map对象中的整个表行:因此,如果我不需要单个值(可以在表的特定行的单个列中,或者类似前面的示例),我可以使用queryForMap(..)和queryForList()方法,方法如下:
String sql = "select * from T_REWARD where CONFIRMATION_NUMBER = ?";
Map<String, Object> values = jdbcTemplate.queryForMap(sql,confirmation.getConfirmationNumber());
String sql = “select * from PERSON”;
return jdbcTemplate.queryForList(sql);
我认为这也很清楚。
然后,我可以使用JdbcTemplate将ResultSet映射到一个域对象,这对我来说并不清楚。
阅读文档会发现,JdbcTemplate使用回调方法支持此功能。我和这个回调方法到底是什么?
public interface RowMapper<T> {
T mapRow(ResultSet rs, int rowNum)
throws SQLException;
}
public Restaurant findByMerchantNumber(String merchantNumber) {
String sql = "select MERCHANT_NUMBER, NAME, BENEFIT_PERCENTAGE, BENEFIT_AVAILABILITY_POLICY from T_RESTAURANT where MERCHANT_NUMBER = ?";
return jdbcTemplate.queryForObject(sql, new RestaurantRowMapper(), merchantNumber);
class RestaurantRowMapper implements RowMapper<Restaurant> {
public Restaurant mapRow(ResultSet rs, int i) throws SQLException {
return mapRestaurant(rs);
}
}
private Restaurant mapRestaurant(ResultSet rs) throws SQLException {
// get the row column data
String name = rs.getString("NAME");
String number = rs.getString("MERCHANT_NUMBER");
Percentage benefitPercentage = Percentage.valueOf(rs.getString("BENEFIT_PERCENTAGE"));
// map to the object
Restaurant restaurant = new Restaurant(number, name);
restaurant.setBenefitPercentage(benefitPercentage);
restaurant.setBenefitAvailabilityPolicy(mapBenefitAvailabilityPolicy(rs));
return restaurant;
}
我的主要疑问是:我知道使用queryForObject()方法,我会将我期望作为输出的对象类型(例如Interger或Long)作为输入参数传递给它。
如果我希望获得一个表示表的整行的域对象(例如,映射到Restaure和对象的餐厅表的一行),我认为我应该使用这个对象(作为餐厅对象),但在前面的示例中,我使用**row mapper对象而不是域对象:
return jdbcTemplate.queryForObject(sql, new RestaurantRowMapper(), merchantNumber);
这个内部类只包含返回预期域对象的mapRow()方法
class RestaurantRowMapper implements RowMapper<Restaurant> {
public Restaurant mapRow(ResultSet rs, int i) throws SQLException {
return mapRestaurant(rs);
}
}
TNX
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在内部调用jdbctemplate
对象的方法query
。查询
-方法定义为:
public <T> T query(
PreparedStatementCreator psc, final PreparedStatementSetter pss, final ResultSetExtractor<T> rse)
throws DataAccessException;
如您所见,ResultSetExtractor
被传递给查询
-method,Spring可以方便地将RowMapperResultSetExtractor
转换为类型为New RowMapperResultSetExtractor
的对象。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添加到结果列表中。但是,由于您只查询一个对象,所以下面的语句最终用于返回您的Restaurany
对象。
return DataAccessUtils.requiredSingleResult(results);
因此,总而言之:jdbctempalte
实现策略模式(类似于模板方法模式)。通过提供一个策略接口(rowmapper
),您可以让jdbctemplate
为您做繁重的工作(处理异常、连接等)。rowmapper
将每个命中映射为一个POJO(餐厅
),所有命中都被收集到列表
中。方法QueryForObject
然后从该列表
中获取第一行并将其返回给调用方。返回值基于rowmapper
的泛型类型,在您的示例中是restaurant
。
我是Spring MVC的新手,我对这个验证器示例的工作原理有以下疑问: 所以我有这个搜索。jsp页面,用户可以通过两个字段(产品名称和产品所属类别)搜索产品: 因此,在本教程中,我们将对实现自定义验证器的前一个视图的两个字段的输入进行一些限制。在特定情况下,用户必须: 1) 用户必须插入产品名称或类别 2) 名称长度必须至少由3个字符组成。 3) 用户只能按名称或类别进行选择,但不能在产品模型对
问题内容: 在查找(测试)信息时,我遇到了一些问题,完全不知道为什么会发生。现在,我知道没有实际的理由执行此操作,这绝对是可怕的代码,但是为什么行得通呢? 因此,基本上,我将对象添加到Quods的ArrayList中。现在,我看到java如何无法有效地检查它,因为它必须浏览所有引用,而这些引用可能甚至都没有存储在任何地方。但是为什么get()起作用了。get()是否不是要返回Quod的实例,就像在
问题内容: 我正在研究Spring Core认证,我对Spring如何处理bean的生命周期,尤其是bean后处理器有疑问。 所以我有这个架构: 我很清楚这是什么意思: 在“ 装入Bean定义”阶段执行以下步骤: @Configuration类被处理和/或@Components被扫描和/或XML文件进行解析。 Bean定义已添加到BeanFactory(每个索引都在其ID下建立索引) 调用特殊的B
问题内容: 注释如何工作? 如果我有这样的事情: 将如何影响testNumber?它甚至会影响testNumber吗? 谢谢。让我知道我是否使用错了。 问题答案: 不会影响电话号码。它仅用于制作javadocs。 有关Javadoc的更多信息:http : //www.oracle.com/technetwork/java/javase/documentation/index-137868.htm
问题内容: 我正在研究Spring Core认证,并且对Spring如何处理JDBC查询有一些疑问: 因此,我知道可以根据希望获取的数据类型以多种方式从数据库表中获取数据: 1)查询 简单类型* (如int,long或String):我使用 jdbcTemplate 类的 queryForObject() 方法,类似这样: * 因此,要获取一个简单的对象作为int值,我使用 queryForObj
我们知道主存域很少:年轻的、终生的(旧的gen)和PermGen。 年轻领域分为伊甸园和幸存者(有两个)。 OldGen用于生存的对象。 MaxTenuringThreshold防止对象过早地被最终复制到OldGen空间。这很清楚,也很容易理解。 但是它是如何工作的呢?垃圾回收器如何处理这些在MaxTenuringThreshold之前仍然存在的对象,以何种方式?它们位于何处? 对象被复制回幸存者