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

如何将MySQL某列数据总和存入Java变量?结果为0问题求助

嘿,我来帮你排查这个问题!你的代码运行后求和结果始终为0,大概率是这几个原因之一,咱们一步步来解决:

首先,先确认基础数据问题:

  • 先打开MySQL客户端,手动执行这条SQL:select credit_balance from credit where user_id = '你代码里的uid值',看看有没有返回非0的记录。如果根本没返回数据,那结果为0是正常的——因为循环根本没执行,totalcdebts一直是初始值0。

然后看代码本身的问题:

  1. 循环累加的潜在风险:你的代码逻辑是对的,但如果totalcdebts没有在循环外正确初始化(比如你没写double totalcdebts = 0;),不过局部变量没初始化编译会报错,所以这个可能性低。但更关键的是,这种自己循环累加的方式不如让数据库直接帮你算,既高效又不容易出错。
  2. 严重的SQL注入风险:直接把uid拼接到SQL字符串里是非常危险的,很容易被攻击者利用注入漏洞,必须用PreparedStatement代替Statement。

给你一个更可靠的修正版本,用MySQL的SUM()函数直接计算总和,同时解决注入问题:

try {
    double totalcdebts = 0;
    // 使用PreparedStatement避免SQL注入,同时让数据库直接求和
    String rq3 = "SELECT SUM(credit_balance) FROM credit WHERE user_id = ?";
    PreparedStatement pst3 = conn.prepareStatement(rq3);
    // 根据uid的实际类型选择set方法:如果是字符串用setString,数字用setInt/setLong
    pst3.setString(1, uid);
    ResultSet rs3 = pst3.executeQuery();
    
    if (rs3.next()) {
        // 注意:如果没有匹配的记录,SUM()会返回NULL,getDouble会自动转成0
        // 如果需要区分"无数据"和"总和为0",可以加个判断:
        totalcdebts = rs3.getDouble(1);
        if (rs3.wasNull()) {
            // 这里表示SUM返回了NULL,也就是没有匹配的记录
            totalcdebts = 0; // 或者根据你的业务需求处理
        }
    }
    // 现在totalcdebts就是你要的求和结果啦
} catch (SQLException e) {
    e.printStackTrace();
    // 记得在这里处理异常,比如日志记录或者给用户提示
}

为什么这个版本更好?

  • 数据库计算SUM比Java循环累加更高效,尤其是当数据量很大的时候
  • 避免了循环过程中可能出现的逻辑错误(比如漏加、重复加)
  • 彻底解决了SQL注入的安全问题

再回头看你原来的代码,如果一定要用循环累加的方式,要确保:

  • totalcdebts在循环前已经初始化为0
  • 执行的SQL确实能返回非0的credit_balance记录
  • 循环里的totalcdebts += cdebts;逻辑正确(你的代码这部分是对的)

内容的提问来源于stack exchange,提问作者Steven Saxbury

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:50:23