Escape single quotes in JDBC (getting error: You have an error in your SQL syntax ...)

Escape single quotes in JDBC (getting error: You have an error in your SQL syntax ...)

我正在尝试使用 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 方法应该转义单引号(也许我错了)。我很乐意提出任何建议。

您不应使用连接在 SQL 查询中插入参数值。使用问号和 set* 方法。这将确保转义。

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

替换

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

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

要正确使用预准备语句,您需要使用参数占位符 (?) 并在语句中设置值。这将自动为您提供针对 SQL 注入的保护。

您需要将代码更改为:

String sql = "INSERT INTO posts VALUES (?, ?)";          
try (PreparedStatement statement = conn.prepareStatement(sql)) {
    statement.setString(1, postTitle);
    statement.setString(2, postContent);
    statement.executeUpdate();
}

有关如何使用 PreparedStatement 的示例,另请参阅 JDBC Basics - Using Prepared Statements

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

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

INSERT INTO posts(title, content) VALUES (?, ?)