数据库的表中有两个字段,username和password
sql表达式是:select password from app_user where username=?;
username已知,
通过String dbPassword = getJdbcTemplate().queryForObject(this.sql, String.class, username);
就可以得到password。
这部分是官方示例程序,不用怀疑,也测试过,能正常运行。现在给表中增加了一个字段id,即现在有表中有三个字段:id,username和password
sql表达式是应该是:select id, password from app_user where username=?;
username已知,
怎么得到id和password?折腾了一天没有解决,高手指点一下!

解决方案 »

  1.   

    参考了几个网站,凑成了下面的代码,可是还是不行
    Object[] parameters = new Object[] {new String(username)};
    //Object[] parameters = new Object[] {username};
    List<Map<String, Object>> userList = getJdbcTemplate().queryForList(this.sql,parameters);
    Map<String, Object> userMap = userList.get(0);
    final String userid = (String)userMap.get("id");
    final String dbPassword = (String)userMap.get("password");
      

  2.   

    关键是需要对记录进行封装,以下代码片段供你参考一下:class User {
      private String id;
      
      private String userName;
      
      ....
    }SimpleJdbcTemplate jdbcTemplate;
    jdbcTemplate = new SimpleJdbcTemplate(dataSource);List<User> users = jdbcTemplate.query(sql,
    new ParameterizedRowMapper<User>() {
    @Override
    public User mapRow(ResultSet rs, int index) throws SQLException {
    User user = new User();
    user.setId(rs.getString("id"));
    user.setUsername(rs.getString("username"));
    ...

    return user;
    }
    });
      

  3.   

    多谢,我先琢磨测试你给点代码。
    下面是系统自带的一个文件,我就想把这个文件修改一下,满足我的需要,即一次查询查询两个字段。你再帮我看看有没有其它需要注意到地方。package org.jasig.cas.adaptors.jdbc;
    import org.jasig.cas.authentication.handler.AuthenticationException;
    import org.jasig.cas.authentication.principal.UsernamePasswordCredentials;
    import org.springframework.dao.IncorrectResultSizeDataAccessException;
    import javax.validation.constraints.NotNull;public final class QueryDatabaseAuthenticationHandler extends
        AbstractJdbcUsernamePasswordAuthenticationHandler {    @NotNull
        private String sql;    protected final boolean authenticateUsernamePasswordInternal(final UsernamePasswordCredentials credentials) throws AuthenticationException {
            final String username = getPrincipalNameTransformer().transform(credentials.getUsername());
            final String password = credentials.getPassword();
            final String encryptedPassword = this.getPasswordEncoder().encode(
                password);
            
            try {
                final String dbPassword = getJdbcTemplate().queryForObject(
                    this.sql, String.class, username);
                return dbPassword.equals(encryptedPassword);
            } catch (final IncorrectResultSizeDataAccessException e) {
                // this means the username was not found.
                return false;
            }
        }
        
        public void setSql(final String sql) {
            this.sql = sql;
        }
    }
      

  4.   

    上面文件对应的sql表达式在一个xml文件中:
    <bean class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler">
    <property name="dataSource" ref="dataSource" />
    <property name="sql" value="select id, password from app_user where username = ?" />
    </bean>dataSource也在另外一个xml文件中做了定义,这些都没有问题,测试过的。
      

  5.   

    找到问题了,这句:
    final String userid = (String)userMap.get("id");
    应该写成:
    int userid = ((Integer) userMap.get("id")).intValue();多谢irvine007!