为何我的代码无法从数据库获取值?附相关实现代码
问题排查与修复方案
兄弟,我帮你捋捋这段代码里的坑,这几个点都是导致你拿不到数据库数据的关键:
1. SQL语句的致命语法错误
你的SQL写得完全混乱了,至少有三个大问题:
- 缺少FROM子句:SQL查询必须指定从哪个表取数据,你根本没写
FROM 你的表名(记得替换成实际表名); - 条件逻辑完全错误:原语句里的
WHERE ID=? AND ... ) LIKE '%...%'逻辑不通,既用了占位符?又直接拼接字符串,还多了个闭合括号; - 模糊匹配的逻辑错误:如果是想让
ValToSearch匹配任意一个字段,应该用OR连接,而不是AND(用AND的话只有当所有字段都完全匹配时才会返回结果,几乎不可能命中)。
2. 结果集列名与代码读取不匹配
你的SQL查询的列是ID, room_Type, host_Name, Neighbourhood,但代码里读取的是:
rs.getInt("id") // 数据库列名是ID,这里小写id可能不匹配(取决于数据库是否区分大小写) rs.getString("hname") // 对应不上host_Name rs.getString("rtype") // 对应不上room_Type rs.getString("area") // 对应不上Neighbourhood
列名完全对不上,这肯定拿不到值!
3. 未使用参数化查询,存在SQL注入风险
直接拼接字符串到SQL里不仅容易出语法错误,还会导致SQL注入漏洞,必须用PreparedStatement替代Statement。
4. 资源未关闭,存在连接泄漏风险
Connection、Statement、ResultSet用完后没关闭,会占用数据库连接资源,时间长了会导致连接池耗尽。
修复后的完整代码
public ArrayList<User> ListUsers(String ValToSearch) { ArrayList<User> usersList = new ArrayList<>(); PreparedStatement pst = null; ResultSet rs = null; Connection con = null; try { con = getConnection(); // 替换下面的your_table_name为你实际的数据库表名 String searchQuery = "SELECT ID, room_Type, host_Name, Neighbourhood FROM your_table_name " + "WHERE ID LIKE ? OR room_Type LIKE ? OR host_Name LIKE ? OR Neighbourhood LIKE ?"; pst = con.prepareStatement(searchQuery); // 统一设置模糊匹配的参数,避免字符串拼接 String searchPattern = "%" + ValToSearch + "%"; pst.setString(1, searchPattern); pst.setString(2, searchPattern); pst.setString(3, searchPattern); pst.setString(4, searchPattern); rs = pst.executeQuery(); while (rs.next()) { // 严格匹配SQL查询的列名,注意大小写 User user = new User( rs.getInt("ID"), rs.getString("host_Name"), rs.getString("room_Type"), rs.getString("Neighbourhood") ); usersList.add(user); } } catch (Exception ex) { // 别只打印错误消息,打印完整栈轨迹更容易排查问题 ex.printStackTrace(); } finally { // 按顺序关闭资源:ResultSet → PreparedStatement → Connection try { if (rs != null) rs.close(); if (pst != null) pst.close(); if (con != null) con.close(); } catch (SQLException e) { e.printStackTrace(); } } return usersList; }
关键修复点总结
- 补全SQL的
FROM子句,修正WHERE条件的逻辑(用OR实现多字段模糊匹配); - 使用
PreparedStatement做参数化查询,既避免SQL注入,又解决字符串拼接的语法问题; - 确保结果集读取的列名与SQL查询的列名完全一致;
- 添加
finally块关闭所有数据库资源,防止连接泄漏; - 打印完整异常栈轨迹,方便定位问题。
内容的提问来源于stack exchange,提问作者MDar
相关产品推荐
相关产品推荐

