如何将MySQL某列数据总和存入Java变量?结果为0问题求助
嘿,我来帮你排查这个问题!你的代码运行后求和结果始终为0,大概率是这几个原因之一,咱们一步步来解决:
首先,先确认基础数据问题:
- 先打开MySQL客户端,手动执行这条SQL:
select credit_balance from credit where user_id = '你代码里的uid值',看看有没有返回非0的记录。如果根本没返回数据,那结果为0是正常的——因为循环根本没执行,totalcdebts一直是初始值0。
然后看代码本身的问题:
- 循环累加的潜在风险:你的代码逻辑是对的,但如果
totalcdebts没有在循环外正确初始化(比如你没写double totalcdebts = 0;),不过局部变量没初始化编译会报错,所以这个可能性低。但更关键的是,这种自己循环累加的方式不如让数据库直接帮你算,既高效又不容易出错。 - 严重的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
相关产品推荐
相关产品推荐

