Java连接MariaDB插入文件路径报MySQLSyntaxErrorException如何解决
问题产生原因
- 拼接SQL时,字符串类型的字段值没有用单引号包裹:拼接后的SQL语句为
INSERT INTO stage1 (ATTESTATION) VALUES (D:\\wallpaper\\a.jpg),MariaDB会把D:识别为数据库标识符而非字符串值,直接触发语法错误。 - 手动转义特殊字符不可靠:自行替换反斜杠的处理方式不仅容易遗漏转义规则,还存在SQL注入风险。
- PreparedStatement API使用错误:已创建预编译对象的前提下,仍将SQL语句作为参数传入
executeUpdate方法,等于直接绕过了预编译的特殊字符处理逻辑,等价于使用普通Statement执行拼接SQL。
修复方案
使用PreparedStatement原生的占位符机制处理参数,无需手动拼接SQL、手动转义特殊字符,修正后的代码如下:
try { JFileChooser f = new JFileChooser("D:\\"); f.showOpenDialog(null); FileNameExtensionFilter fnef = new FileNameExtensionFilter("IMAGES", "png", "jpg", "jpeg"); f.setFileFilter(fnef); File selected = f.getSelectedFile(); String selectedPath = selected.getAbsolutePath(); ImageIcon icon = new ImageIcon(selectedPath); Image image = icon.getImage(); // 使用?作为参数占位符,不需要手动拼接值 String sql = "INSERT INTO stage1 (ATTESTATION) VALUES (?)"; pst = cnx.prepareStatement(sql); // 给占位符赋值,预编译会自动处理特殊字符转义 pst.setString(1, selectedPath); // 调用无参executeUpdate,不要传入sql参数 pst.executeUpdate(); JOptionPane.showMessageDialog(null, "succes!!"); } catch (SQLException ex) { ex.printStackTrace(); }
内容的提问来源于stack exchange,提问作者Nabil Lacost
相关产品推荐
相关产品推荐

