[英]Using Spring JdbcTemplate to extract one string
Can't seem to find a way to get one string from table using JdbcTemplate query.似乎无法找到一种使用 JdbcTemplate 查询从表中获取一个字符串的方法。 This is the table my sql returns:这是我的 sql 返回的表:
ID | STREET_NAME
------------------------
1 | Elm street
Now how am I supposed to get the value of STREET_NAME.现在我应该如何获得 STREET_NAME 的值。 SQL always returns one row, so no need to worry about returning more than one row. SQL 总是返回一行,所以不必担心返回多于一行。
For some background info: INNER JOIN and COUNT in the same query有关一些背景信息: 同一查询中的 INNER JOIN 和 COUNT
Using Tony Stark answer to get my table.使用 Tony Stark 的答案来获取我的桌子。
But how can I extract "Elm street" from it using JdbcTemplate?但是如何使用 JdbcTemplate 从中提取“榆树街”?
It would help a lot to know what your SQL query looks like, but assuming it's something like SELECT STREET_NAME FROM table WHERE ID=1;
了解您的 SQL 查询是什么样的会SELECT STREET_NAME FROM table WHERE ID=1;
,但假设它类似于SELECT STREET_NAME FROM table WHERE ID=1;
CODE:代码:
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;
}
If you want to get only one column "string" from your table (or any query with joins), you have to say the name of the column.如果您只想从您的表(或任何带有连接的查询)中获取一列“字符串”,您必须说出该列的名称。
Using SELECT * FROM TABLE is a very-very bad practice by the way.顺便说一下,使用SELECT * FROM TABLE是一种非常非常糟糕的做法。 I bet you did this.我打赌你这样做了。
@JLewkovich modified code: @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;
}
But what if there is 0 or more than one result?但是如果有 0 个或多个结果怎么办? Think about it!想一想!
But to getting a sequence value (in Oracle), this should work.但是要获得序列值(在 Oracle 中),这应该可行。
public Long getSequence() {
Long seq;
String sql = "select SEQ_XY.NEXTVAL from dual";
seq = jdbcTemplateObject.queryForObject(sql, new Object[] {}, Long.class);
return seq;
}
The class JdbcTemplate
implements JdbcOperations
. JdbcTemplate
类实现了JdbcOperations
。
If you look at the queryForObject
javadocs in JdbcOperations
it states:如果你看一下queryForObject
中的javadoc JdbcOperations
它指出:
Deprecated .已弃用。 as of 5.3, in favor of queryForObject(String, Class, Object...)从 5.3 开始,支持queryForObject(String, Class, Object...)
Basically, they have changed the method signature to get rid of Object[]
arguments in the method signatures in favor of varargs.基本上,他们已经更改了方法签名以摆脱方法签名中的Object[]
参数,转而使用可变参数。 Please, see the relevant Github issue .请参阅相关的Github 问题。
You can rewrite answer of @jlewkovich with the new method signature like this:您可以使用新方法签名重写@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;
}
As per latest specification queryForObject with below syntax is now deprecated根据最新的规范queryForObject现在不推荐使用以下语法
<T> T queryForObject(String sql, Object[] args, Class<T> requiredType)
New method uses varargs .新方法使用varargs 。
<T> T queryForObject(String sql, Class<T> requiredType, Object... args)
Updated Solution: We have to replace the class type with Object args and vice-versa.更新的解决方案:我们必须用 Object args 替换类类型,反之亦然。
Sql Query: SELECT STREET_NAME FROM table WHERE ID=1;
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;
}
I usually do this way:我通常这样做:
String result = DataAccessUtils.singleResult(
jdbcTemplate.queryForList(
"SELECT street_name FROM table WHERE id = :id",
Collections.singletonMap("id", id),
String.class
)
)
queryForList is used instead of queryForObject for handling empty results.使用 queryForList代替queryForObject来处理空结果。 queryForObject throws EmptyResultDataAccessException for empty results. queryForObject为空结果抛出 EmptyResultDataAccessException。 Often it is not desired behavior.通常这不是我们想要的行为。
DataAccessUtils.singleResult + queryForList : DataAccessUtils.singleResult + queryForList :
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.