三层架构下DAO层布尔值始终返回false的问题排查与解决咨询
Hey,我来帮你搞定这个问题!你的核心困扰是DAO层的valid字段一直返回false,导致永远走第一个业务方法对吧?咱们一步步拆解问题,找到根源:
问题排查与修复方案
首先明确:valid始终为false,说明rs.next()从未返回true——也就是你的SQL查询根本没找到匹配的数据库记录。下面是几个关键排查点:
1. 修复SQL的类型匹配错误
从代码里rs.getInt("rph_id")能看出来,rph_id是整数类型,但你写的查询语句却把它当成字符串用单引号包裹了:
String searchQuery = "select * from rphs where rph_id='" + rph_id + "'";
这种写法会让数据库把整数列和字符串值做匹配,很多情况下会直接查不到数据(尤其是开启严格模式的数据库)。赶紧去掉单引号,改成:
String searchQuery = "select * from rphs where rph_id=" + rph_id;
💡 更推荐用PreparedStatement,既避免SQL注入,又能彻底解决类型问题:
String searchQuery = "select * from rphs where rph_id=?"; PreparedStatement pstmt = currentCon.prepareStatement(searchQuery); pstmt.setInt(1, rph_id); rs = pstmt.executeQuery();
2. 确认传入的rph_id是否存在于数据库
先搞清楚你实际查询的ID是什么:
- 在代码里加一句日志:
System.out.println("当前查询的rph_id: " + rph_id); - 拿着这个ID直接去数据库客户端(比如MySQL Workbench)执行
select * from rphs where rph_id=XXX,看看有没有返回结果。如果数据库里根本没有这个ID,那valid自然是false!
3. 简化冗余的判断逻辑
你当前的if (more) else if (!more)完全没必要,直接把more的值赋值给valid就行,逻辑更清晰:
boolean more = rs.next(); rph.setValid(more); // 直接赋值,省去分支判断 if (more) { int rph_id = rs.getInt("rph_id"); rph.setRph_id(rph_id); }
4. 别忘了处理资源释放(额外优化)
你的代码里没有关闭ResultSet、Statement和Connection,长期运行会导致数据库连接泄漏。建议用try-with-resources语法自动关闭资源,避免潜在问题:
public static RPHS getRph(RPHS rph) { int rph_id = rph.getRph_id(); String searchQuery = "select * from rphs where rph_id=?"; try (Connection currentCon = ConnectionManager.getConnection(); PreparedStatement pstmt = currentCon.prepareStatement(searchQuery)) { pstmt.setInt(1, rph_id); try (ResultSet rs = pstmt.executeQuery()) { boolean more = rs.next(); rph.setValid(more); if (more) { rph.setRph_id(rs.getInt("rph_id")); } } } catch (SQLException e) { // 这里可以加日志或者异常处理,方便排查错误 e.printStackTrace(); } return rph; }
按照上面的步骤排查,应该就能让valid正确返回true啦!
内容的提问来源于stack exchange,提问作者herman farlan
相关产品推荐
相关产品推荐

