我正在使用spring框架,下面是要执行的SQL查询并获得结果。
String sql = "SELECT DESCRIPTION FROM ATWData WHERE SNO = '980098' ";
在Spring框架中,我们有RowMapper和ResultsetExtractor回调接口,最好用它来执行上面提到的SQL查询并获取单个记录。下面的代码使用RowMapper和ResultSetExtractor获取结果。
使用ResultSetExtractor的代码:
try
{
description = jdbcTemplate.query(sql,
new ResultSetExtractor<String>()
{
public String extractData(final ResultSet rs) throws SQLException
{
if (rs.next())
{
String description = null;
description = rs.getString("DESCRIPTION");
return description;
}
return null;
}
});
}
catch (final DataAccessException e)
{
LOG.error("Error " + e);
}
代码下面的使用RowMapper来获得结果:
try
{
description = jdbcTemplate2.query(sql,
new RowMapper<String>()
{
public String mapRow(final ResultSet rs, final int rowNum) throws SQLException
{
String description = (String)rs.getString("DESCRIPTION"));
return description;
}
});
}
catch (final DataAccessException e)
{
LOG.error("Error " + e);
}
我已经阅读了有关这些方法的文档,但在我现有的方案中选择了一个方法很困惑。请建议哪个代码(RowMapper / ResultSetExtractor)最适合执行上面给出的简单SQL查询。
答案 0 :(得分:0)
在你的情况下,要么是好的。 RowMappers
旨在将结果集中的行转换为应用程序中的模型。 ResultSetExtractor
稍微更通用,允许您完整地对ResultSet
进行操作,而不是仅仅对一行进行操作。它只取决于您需要对结果做些什么。在提取单个字符串的情况下,它们都起作用。有关详细信息,另请参阅this question。您的问题可能会被标记为重复。
答案 1 :(得分:0)
不要使用它们。
但首先,更重要的是:
不要使用字符串连接构建SQL语句,除非您希望让自己对SQL Injection攻击持开放态度,允许黑客窃取您的数据和/或损坏或删除您的数据库。< / p>
不要抓住get
并继续执行,好像一切都很好。需要让调用者知道查询失败,并且很可能想要回滚任何挂起的事务。
由于您的查询是带参数的单行/单列查询,请使用queryForObject(String sql, Class<T> requiredType, Object... args)
。
这是你应该做的:
1
如果没有找到行,它将抛出EmptyResultDataAccessException
。如果缺少的行不被视为错误,请捕获异常并返回DataAccessException
(或Optional.empty()
)。