You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何我的代码无法从数据库获取值?附相关实现代码

问题排查与修复方案

兄弟,我帮你捋捋这段代码里的坑,这几个点都是导致你拿不到数据库数据的关键:


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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 05:02:54