【问题标题】:Spring JDBC getting values returned from querySpring JDBC获取从查询返回的值
【发布时间】:2012-08-16 23:17:40
【问题描述】:

您好,我有一个查询,我从数据库中选择值,我想与所选数据进行比较。我能够创建查询并传入参数,但在访问从查询返回的值时仍然遇到一些问题。谁能告诉我我是否走在正确的轨道上,我想我最后两条语句写错了。

    String sql = "SELECT userName, password FROM tblusers WHERE userName = ? AND password = ? ";



    Object[] parameters = new Object[] {login.getUserName(), login.getPassword()};

    String dbUserName = (String)getJdbcTemplate().queryForObject(
            sql, parameters, String.class);

    String dbPassword = (String)getJdbcTemplate().queryForObject(
            sql, parameters, String.class);

【问题讨论】:

  • 您发现了哪些问题?
  • 我无法将值输入 dbUserName 和 dbPassword 我收到 NULL 点异常错误。我不认为我正确地从查询中提取结果是他正确的方法吗?
  • 有几种方法可以使用JdbcTemplate 获得结果。如果您不能使用自定义对象来映射结果(例如 User 类),您可以通过 MapListMaps 获得结果。
  • 在数据库中存储原始密码根本不是一个好习惯。
  • 应用已更新,密码已加密

标签: java sql spring jdbc spring-jdbc


【解决方案1】:

如果您的查询只返回一条记录,我建议您使用:

queryForMap(String sql, Object... args)

看看 javadoc。

对于您的具体问题,这应该有效:

Map<String,Object> results = 
        getJdbcTemplate().queryForMap(
            "SELECT userName, password FROM tblusers WHERE userName = ? AND password = ?"
            , login.getUserName()
            , login.getPassword());

String dbUserName = (String)results.get("userName");
String dbPassword = (String)results.get("password");

【讨论】:

  • 这样我得到一个错误:org.springframework.web.util.NestedServletException:请求处理失败;嵌套异常是 org.springframework.dao.EmptyResultDataAccessException: Incorrect result size: expected 1, actual 0
  • 实际上发生了,因为没有记录,你能告诉我处理这类错误的最佳方法是什么
  • 处理空结果集的最佳方法是捕获org.springframework.dao.EmptyResultDataAccessException
【解决方案2】:

您的查询将返回两个字符串,如果这是您想要的,那么您应该将结果转换为一个对象,或者一次只查询一个用户名和密码。以下是如何使用行映射器同时获取用户名和密码。

    public class CustomRowMapper implements RowMapper {

        public Object mapRow(ResultSet rs, int rowNum) throws SQLException {
            User user = new User();
            user.setPassword(rs.getString("password");
            user.setUserName(rs.getString("userName"); 
            return user;  
        }
    }


    String sql = "SELECT userName, password FROM tblusers WHERE userName = ? AND password =        ? ";

    Object[] parameters = new Object[] {login.getUserName(), login.getPassword()};

    User u = (User) getJdbcTemplate().queryForObject(sql, parameters, new CustomRowMapper());

否则...

String sql = "SELECT userName FROM tblusers WHERE userName = ? AND password = ? ";

String userName = getJdbcTemplate().queryForString(sql, parameters);

String passwordSql = String sql = "SELECT password FROM tblusers WHERE userName = ? AND password = ? ";

String password= getJdbcTemplate().queryForString(sql, parameters);

【讨论】:

  • +1 用于显示 RowMapper 解决方案,这就是我要引导他的方向。
猜你喜欢
  • 1970-01-01
  • 2010-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多