使用Spring JdbcTemplate 提取一个字符串
Using Spring JdbcTemplate to extract one string
似乎无法找到使用 JdbcTemplate 查询从 table 获取一个字符串的方法。
这是 table 我的 sql returns:
ID | STREET_NAME
------------------------
1 | Elm street
现在我应该如何获得 STREET_NAME 的值。 SQL 始终 returns 一行,因此无需担心返回多行。
一些背景信息:
使用 Tony Stark 的答案得到我的 table。
但是如何使用 JdbcTemplate 从中提取 "Elm street"?
了解您的 SQL 查询是什么样的会很有帮助,但假设它类似于 SELECT STREET_NAME FROM table WHERE ID=1;
代码:
public String getStreetNameById(int id) {
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
String sql = "SELECT STREET_NAME FROM table WHERE ID=?";
String streetName = (String) jdbcTemplate.queryForObject(
sql, new Object[] { id }, String.class);
return streetName;
}
如果您只想从 table 中获取一列 "string"(或任何具有连接的查询),您必须说出该列的名称。
顺便说一下,使用 SELECT * FROM TABLE 是一种 very-very 不好的做法。我打赌你做到了。
@JLewkovich 修改代码:
public String getStreetNameById(int id) {
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
String sql = "SELECT STREET_NAME FROM table WHERE ID=?";
String streetName = (String) jdbcTemplate.queryForObject(
sql, new Object[] { id }, String.class);
return streetName;
}
但如果有 0 个或多个结果怎么办?
想想看!
但是要获取序列值(在 Oracle 中),这应该可行。
public Long getSequence() {
Long seq;
String sql = "select SEQ_XY.NEXTVAL from dual";
seq = jdbcTemplateObject.queryForObject(sql, new Object[] {}, Long.class);
return seq;
}
我通常这样做:
String result = DataAccessUtils.singleResult(
jdbcTemplate.queryForList(
"SELECT street_name FROM table WHERE id = :id",
Collections.singletonMap("id", id),
String.class
)
)
queryForList 代替 queryForObject 用于处理空结果。 queryForObject 为空结果抛出 EmptyResultDataAccessException。通常这不是我们想要的行为。
DataAccessUtils.singleResult + queryForList:
- returns 空结果为 null
- returns 如果恰好找到 1 行,则为单个结果
- 如果找到超过 1 行,则抛出异常。主键/唯一索引搜索不应该发生
根据最新规范 queryForObject,现在 已弃用
<T> T queryForObject(String sql, Object[] args, Class<T> requiredType)
新方法使用 varargs.
<T> T queryForObject(String sql, Class<T> requiredType, Object... args)
更新的解决方案:我们必须用 Object args 替换 class 类型,反之亦然。
Sql 查询:SELECT STREET_NAME FROM table WHERE ID=1;
public String getStreetNameById(int id) {
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
String sql = "SELECT STREET_NAME FROM table WHERE ID=?";
String streetName = (String) jdbcTemplate.queryForObject(
sql, String.class, new Object[] { id });
return streetName;
}
class JdbcTemplate
implements JdbcOperations
.
如果您查看 JdbcOperations
中的 queryForObject
javadoc,它指出:
Deprecated. as of 5.3, in favor of queryForObject(String, Class, Object...)
基本上,他们更改了方法签名以摆脱方法签名中的 Object[]
参数,转而支持可变参数。请参阅相关 Github issue.
您可以像这样使用新方法签名重写@jlewkovich 的答案:
public String getStreetNameById(int id) {
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
String sql = "SELECT STREET_NAME FROM table WHERE ID=?";
String streetName = (String) jdbcTemplate.queryForObject(
sql, String.class, id);
return streetName;
}
似乎无法找到使用 JdbcTemplate 查询从 table 获取一个字符串的方法。 这是 table 我的 sql returns:
ID | STREET_NAME
------------------------
1 | Elm street
现在我应该如何获得 STREET_NAME 的值。 SQL 始终 returns 一行,因此无需担心返回多行。
一些背景信息:
使用 Tony Stark 的答案得到我的 table。
但是如何使用 JdbcTemplate 从中提取 "Elm street"?
了解您的 SQL 查询是什么样的会很有帮助,但假设它类似于 SELECT STREET_NAME FROM table WHERE ID=1;
代码:
public String getStreetNameById(int id) {
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
String sql = "SELECT STREET_NAME FROM table WHERE ID=?";
String streetName = (String) jdbcTemplate.queryForObject(
sql, new Object[] { id }, String.class);
return streetName;
}
如果您只想从 table 中获取一列 "string"(或任何具有连接的查询),您必须说出该列的名称。
顺便说一下,使用 SELECT * FROM TABLE 是一种 very-very 不好的做法。我打赌你做到了。
@JLewkovich 修改代码:
public String getStreetNameById(int id) {
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
String sql = "SELECT STREET_NAME FROM table WHERE ID=?";
String streetName = (String) jdbcTemplate.queryForObject(
sql, new Object[] { id }, String.class);
return streetName;
}
但如果有 0 个或多个结果怎么办? 想想看!
但是要获取序列值(在 Oracle 中),这应该可行。
public Long getSequence() {
Long seq;
String sql = "select SEQ_XY.NEXTVAL from dual";
seq = jdbcTemplateObject.queryForObject(sql, new Object[] {}, Long.class);
return seq;
}
我通常这样做:
String result = DataAccessUtils.singleResult(
jdbcTemplate.queryForList(
"SELECT street_name FROM table WHERE id = :id",
Collections.singletonMap("id", id),
String.class
)
)
queryForList 代替 queryForObject 用于处理空结果。 queryForObject 为空结果抛出 EmptyResultDataAccessException。通常这不是我们想要的行为。
DataAccessUtils.singleResult + queryForList:
- returns 空结果为 null
- returns 如果恰好找到 1 行,则为单个结果
- 如果找到超过 1 行,则抛出异常。主键/唯一索引搜索不应该发生
根据最新规范 queryForObject,现在 已弃用
<T> T queryForObject(String sql, Object[] args, Class<T> requiredType)
新方法使用 varargs.
<T> T queryForObject(String sql, Class<T> requiredType, Object... args)
更新的解决方案:我们必须用 Object args 替换 class 类型,反之亦然。
Sql 查询:SELECT STREET_NAME FROM table WHERE ID=1;
public String getStreetNameById(int id) {
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
String sql = "SELECT STREET_NAME FROM table WHERE ID=?";
String streetName = (String) jdbcTemplate.queryForObject(
sql, String.class, new Object[] { id });
return streetName;
}
class JdbcTemplate
implements JdbcOperations
.
如果您查看 JdbcOperations
中的 queryForObject
javadoc,它指出:
Deprecated. as of 5.3, in favor of queryForObject(String, Class, Object...)
基本上,他们更改了方法签名以摆脱方法签名中的 Object[]
参数,转而支持可变参数。请参阅相关 Github issue.
您可以像这样使用新方法签名重写@jlewkovich 的答案:
public String getStreetNameById(int id) {
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
String sql = "SELECT STREET_NAME FROM table WHERE ID=?";
String streetName = (String) jdbcTemplate.queryForObject(
sql, String.class, id);
return streetName;
}