为了进行简单的登录访问检查,我将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的新手,无法找出错误。
答案 0 :(得分:0)
如果查询的结果集为空,则不会调用行映射器。
您可以确认SHB_USERS
表中是否存在匹配的用户名和密码?
答案 1 :(得分:0)
尽管您已在代码中找到问题所在,但我仍然会继续向其他最终用户提及此问题,这些用户最终在此页面上找到了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
处没有行,则该方法将不会执行。