如果isLast()返回JdbcTemplate

时间:2016-10-21 10:51:37

标签: java request spring-jdbc jdbctemplate

我正在使用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;
        }
    )
}

1 个答案:

答案 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>() {...}
    } );
  }