对于具体问题
SQLException,您需要更换
ResultSet rs = stmt.executeQuery(sql);
通过
ResultSet rs = stmt.executeQuery();
因为您使用的是
PreparedStatement子类而不是
Statement。使用时
PreparedStatement,您已经将SQL字符串传递给
Connection#prepareStatement()。您只需要在其上设置参数,然后
executeQuery()直接调用方法,而无需重新传递SQL字符串。
也可以看看:
- JDBC教程-使用准备好的语句
对于具体的问题
rs.next(),它将光标从数据库中移至结果集的下一
true行,否则返回
false。与
if语句(而不是
while)结合使用,意味着程序员仅对第一行(即第一行)期望或感兴趣。
也可以看看:
ResultSet#next()
方法的Javadoc- SQL问题,java中的ResultSet



