Java 使用变量的SQL insert查询语法错误
当试图在sql表中插入一条记录时,我对表中的10列使用了10个变量,但是当我运行查询时,它抛出了一个错误。我已尝试查找我的代码中是否有任何拼写错误,但找不到: 线程“main”java.sql.SQLSyntaxErrorException中的异常:sql语法中有错误;检查与MySQL服务器版本对应的手册,以了解在第1行的“,”2019“,”12“,”3“,”10660“,”2018-12-11“,”UTC“,”{”sleepIQScore:“{”min“:0,“max””附近使用的正确语法 我的代码是:Java 使用变量的SQL insert查询语法错误,java,mysql,sql,jdbc,Java,Mysql,Sql,Jdbc,当试图在sql表中插入一条记录时,我对表中的10列使用了10个变量,但是当我运行查询时,它抛出了一个错误。我已尝试查找我的代码中是否有任何拼写错误,但找不到: 线程“main”java.sql.SQLSyntaxErrorException中的异常:sql语法中有错误;检查与MySQL服务器版本对应的手册,以了解在第1行的“,”2019“,”12“,”3“,”10660“,”2018-12-11“,”UTC“,”{”sleepIQScore:“{”min“:0,“max””附近使用的正确语法 我
public void insertDataTable1() throws SQLException {
connection = new MyConnection().getConnection();
Random random = new Random();
String timeZone = "UTC";
String dummyJson = "'{\"sleepIQScore\": {\"min\": 0, \"max\": 0, \"sum\": 0, \"count\": 0}}')";
int longestSessionDuration = 1000 + random.nextInt(9999), bamUserID = 1000000 + random.nextInt(9999999);
int year = 2019, month = 12, sleepSessionCount =3;
java.sql.Date longestSessionStart = new java.sql.Date(Calendar.getInstance().getTime().getTime());
String sql = "INSERT INTO aggregates_all_time(bam_user,year,month,sleep_session_count," +
"longest_session_total_duration,longest_session_start,timezone, current_stats, second_longest_session_stats, prior_stats)"
+ "VALUES ("+bamUserID+"','"+year+"','"+month+"','"+sleepSessionCount+"','"+longestSessionDuration+"','" +
""+longestSessionStart+"','"+timeZone+"','"+dummyJson+" ','"+dummyJson+"','"+dummyJson+")";
PreparedStatement preparedStatement = connection.prepareStatement(sql);
int i = preparedStatement.executeUpdate();
System.out.println(i + " Row/s inserted");
}
您永远不应该将值连接到这样的查询字符串中。这是不安全的,因为它会将应用程序打开到SQL注入,而SQL注入是安全问题的主要原因之一。此外,由于缺少引号等原因,它会导致像您的问题一样的错误 但是,解决方案不是添加那些缺少的引号,因为这仍然会使您面临SQL注入风险。相反,您需要在执行之前使用参数并设置这些参数的值 基于您问题中的查询的简化示例:
try (PreparedStatement preparedStatement = connection.prepareStatement(
"INSERT INTO aggregates_all_time(bam_user, year, month, ..) values (?, ?, ?, ..)")) {
preparedStatement.setInt(bamUserID);
preparedStatement.setInt(year);
preparedStatement.setInt(month);
// other values
preparedStatement.executeUpdate();
}
另请参见JDBC教程。您不应该将值连接到这样的查询字符串中。这是不安全的,因为它会将应用程序打开到SQL注入,而SQL注入是安全问题的主要原因之一。此外,由于缺少引号等原因,它会导致类似问题的错误 但是,解决方案不是添加那些缺少的引号,因为这仍然会使您面临SQL注入风险。相反,您需要在执行之前使用参数并设置这些参数的值 基于您问题中的查询的简化示例:
try (PreparedStatement preparedStatement = connection.prepareStatement(
"INSERT INTO aggregates_all_time(bam_user, year, month, ..) values (?, ?, ?, ..)")) {
preparedStatement.setInt(bamUserID);
preparedStatement.setInt(year);
preparedStatement.setInt(month);
// other values
preparedStatement.executeUpdate();
}
另请参见JDBC教程。从“sql”变量打印字符串,并在
的“值(“+bamUserID+”,”中共享该字符串
您可能可以删除第一个单引号。这不是您应该如何使用PreparedStatement。不要将值连接到查询字符串中。这是不安全的,并且/或者会导致与您的问题类似的错误。请改用参数。避免连接字符串。改用PreparedStatement。您的代码在SQL注入中不安全。打印“sql”变量中的字符串,并在“值(“+bamUserID+”,”中共享它您可能可以删除第一个单引号。这不是您应该如何使用PreparedStatement。不要将值连接到查询字符串中。这是不安全的,并且/或者会导致像您的问题一样的错误。请改用参数。避免连接字符串。改用PreparedStatement。您的代码在SQL注入中不安全。谢谢马克,谢谢你,马克。