在JDBC中转义单引号(获取错误:您的SQL语法中有错误...)

时间:2015-05-26 10:27:01

标签: java mysql jdbc syntax-error quotes

我正在尝试使用jdbc将数据插入到mysql中。我有这样的事情:

    Connection conn = DriverManager.getConnection(urlDB, userDB, passwordDB);

    String postTitle = "Post title";
    String postContent = "A Linux's distributions";

    String sql = "INSERT INTO posts VALUES ( '"+postTitle+"', '"+postContent+"')";          
    PreparedStatement statement = conn.prepareStatement(sql);
    statement.executeUpdate();
    conn.close();

但是我收到了一个错误:

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 's

据我所知,prepareStatement方法应该转义单引号(Мaybe我错了)。我会很高兴有任何建议。

3 个答案:

答案 0 :(得分:3)

要正确使用预准备语句,您需要使用参数占位符(String sql = "INSERT INTO posts VALUES (?, ?)"; try (PreparedStatement statement = conn.prepareStatement(sql)) { statement.setString(1, postTitle); statement.setString(2, postContent); statement.executeUpdate(); } )并在语句上设置值。这将自动为您提供防止SQL注入的保护。

您需要将代码更改为:

PreparedStatement

有关如何使用INSERT INTO posts(title, content) VALUES (?, ?) 的示例,请参阅JDBC Basics - Using Prepared Statements

我还将代码更改为使用try-with-resources,因为这将始终正确关闭语句(即使发生异常),而问题中的代码却没有。

请注意,如果明确指定要插入的列,则会更好。这可以保护您的代码免受列更改顺序或新增 - 可选 - 列添加:

{{1}}

答案 1 :(得分:2)

您不应该使用串联在SQL查询中插入参数值。使用问号和设置*方法。这将确保逃避。

PreparedStatement pstmt = con.prepareStatement("UPDATE EMPLOYEES SET SALARY = ? WHERE ID = ?");
pstmt.setBigDecimal(1, 153833.00)
pstmt.setInt(2, 110592)

请参阅文档:https://docs.oracle.com/javase/8/docs/api/java/sql/PreparedStatement.html

答案 2 :(得分:0)

替换

String sql = "INSERT INTO posts VALUES ( '"+postTitle+"', '"+postContent+"')";

String sql = "INSERT INTO posts VALUES ( '"+postTitle.replace("'","''")+"', '"+postContent.replace("'","''")+"')";