我正在尝试使用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我错了)。我会很高兴有任何建议。
答案 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("'","''")+"')";