很难通过查看构建 SQL 的代码来尝试调试 SQL。
String sql = "INSERT INTO `ad`.`ad` (`imgURL`, `linkURL`, `client`, `idx`) VALUES ("
+ a.getImgURL() + " , " + a.getLinkURL() + " , " + a.getClient() + " , "
+ a.getIdx() + ");";
相反,检查结果sql
字符串:
INSERT INTO `ad`.`ad` (`imgURL`, `linkURL`, `client`, `idx`) VALUES (fooURL, ...);
fooURL
当您查看没有引号的 SQL 时,您应该能够更容易地看到。因此它被解释为一个表达式,而不是一个简单的标量字符串值。单个单词的表达式仅假定为列名,但在 ad 表中不存在该名称的此类列。
避免在 SQL 语句中插入字符串会好得多。 了解如何改用准备好的查询和查询参数。
String sql = "INSERT INTO `ad`.`ad` (`imgURL`, `linkURL`, `client`, `idx`) "
+ " VALUES (?, ?, ?, ?)";
PreparedStatement insertAd = con.prepareStatement(sql);
insertAd.setString(1, a.getImgUrl);
insertAd.setString(2, a.getLinkUrl);
insertAd.setInt(3, a.getClient);
insertAd.setInt(4, a.getIdx);
insertAd.executeUpdate();
您不需要引用或转义查询参数。使用参数比记住平衡引号的位置要容易得多。出于这个原因,它也更安全,因为你更有可能做对。