未执行PreparedStatement且未调用RowMapper

为了进行简单的登录访问检查,我将jdbcTemplate与以下DAO方法结合使用:-

    @Autowired
        JdbcTemplate jdbcTemplate;

        public List<User> hasaccess (String user,String pass) {
            return jdbcTemplate.query(new PreparedStatementCreator() {
                @Override
                public PreparedStatement createPreparedStatement(Connection connection) throws SQLException {
                    PreparedStatement ps = connection.prepareStatement("SELECT * FROM SHB_USERS WHERE USER=? AND PASS=?");
                    ps.setString(1,user);
                    ps.setString(2,pass);
                    return ps;
                }
            },new RowMapper<User>() {
                @Override
                public User mapRow(ResultSet resultSet,int rownum) throws SQLException {
                    String user = resultSet.getString("USER");
                    String pass = resultSet.getString("PASS");
                    User userObj = new User(user,pass);
                    System.out.println(userObj.toString());
                    return userObj;
                }
            });
        }

但是以某种方式未调用mapRow。当我使用直接字符串而不是PreparedStatement例如select * from shb_users where rownum <2时,它可以工作。 我是Spring Boot的新手,无法找出错误。

zhouzhou99 回答:未执行PreparedStatement且未调用RowMapper

如果查询的结果集为空,则不会调用行映射器。

您可以确认SHB_USERS表中是否存在匹配的用户名和密码?

,

尽管您已在代码中找到问题所在,但我仍然会继续向其他最终用户提及此问题,这些用户最终在此页面上找到了mapRow(...)不采取任何措施的原因。

@Nullable
T mapRow(ResultSet rs,int rowNum)
            throws SQLException

根据春季官方documentation

This method should not call next() on the ResultSet; it is only supposed to map values of the current row.

这解释为在此方法的任何给定执行中,参数cursor中的ResultSet rs位于由rowNum参数表示的单行中。如果resultset在传递的rowNum处没有行,则该方法将不会执行。

本文链接:https://www.f2er.com/2977807.html

大家都在问