我正在使用JdbcTemplate向Spring Data REST创建的数据库发出请求。请求的数据将由angularJs管理。 在我的jdbc.query()的循环中,我正在构建一个列表,如果传递了最后一个ResultSet,则应返回该列表。
但是由于值必须在条件之外返回的原因,每次传递ResultSet的循环时都必须返回 null 。
那么有没有办法让它变得更好?
提前致谢
我的代码:
List list = new ArrayList();
public List findById(Long id){
return jdbc.query(
sql,
new Object[]{id},
(ResultSet rs, int rowNum) -> {
// code for building list
if(rs.isLast()){
return list;
}
return null;
}
)
}
答案 0 :(得分:2)
1)据我所知,返回null是一种不好的做法。返回空列表最好。
2)如果您需要迭代结果和构建列表,您可以使用(这通常是人们所做的):
return jdbcTemplate
.query( SELECT_ALL_USERS, new ResultSetExtractor<List<User>>() {
public List<User> extractData( ResultSet resultSet )
throws SQLException, DataAccessException
{
List<User> list = new ArrayList<User>();
while ( resultSet.next() ) {
User user = new User(...);
list.add( user );
}
return list;
}
} );
3)如果你想对最后的结果做一些事情,就不需要遍历整个结果集,你可以使用
List list = new ArrayList();
if(!resultSet.isBeforeFirst()){
resultSet.afterLast();
resultSet.previous();
User user = new User;
list.add(user);
}
return list;
afterLast()将光标移动到此ResultSet对象的末尾 在最后一行之后。
previous()将光标移动到此ResultSet中的上一行 对象
isBeforeFirst返回 如果光标在第一行之前,则为true;否则为false。如果光标位于,则为false 任何其他位置或结果集不包含行
有用的链接: https://docs.oracle.com/javase/7/docs/api/java/sql/ResultSet.html
要将参数传递给查询,您可以使用:
public User getUserByEmail( final String email )
{
return jdbcTemplate.query( SELECT_USER_BY_EMAIL, new PreparedStatementSetter() {
public void setValues( PreparedStatement preparedStatement )
throws SQLException
{
preparedStatement.setString( 1, email );
}
}, new ResultSetExtractor<User>() {...}
} );
}