将参数传递给JDBC PreparedStatement

我正在尝试为我的程序制作validation课程。 我已经建立了与MySQL数据库的连接,我已经在表中插入了行。 该表由firstNamelastNameuserID字段组成。 现在我想通过构造函数的参数在数据库中选择一个特定的行。

 import java.sql.*; import java.sql.PreparedStatement; import java.sql.Connection; public class Validation { private PreparedStatement statement; private Connection con; private String x, y; public Validation(String userID) { try { Class.forName("com.mysql.jdbc.Driver"); con = DriverManager.getConnection( "jdbc:mysql://localhost:3306/test", "root", ""); statement = con.prepareStatement( "SELECT * from employee WHERE userID = " + "''" + userID); ResultSet rs = statement.executeQuery(); while (rs.next()) { x = rs.getString(1); System.out.print(x); System.out.print(" "); y = rs.getString(2); System.out.println(y); } } catch (Exception ex) { System.out.println(ex); } } } 

但它似乎没有用。

您应该使用setString()方法来设置userID 。 这既可以确保语句格式正确,又可以防止SQL injection

 statement =con.prepareStatement("SELECT * from employee WHERE userID = ?"); statement.setString(1, userID); 

有一个很好的教程,介绍如何在Java教程中正确使用PreparedStatement

如果您使用的是预准备语句,则应该像这样使用它:

 "SELECT * from employee WHERE userID = ?" 

然后使用:

 statement.setString(1, userID); 

? 将在您的查询中使用传递给setString方法的用户ID替换。

看看这里如何使用PreparedStatement 。

您的查询中存在问题..

  statement =con.prepareStatement("SELECT * from employee WHERE userID = "+"''"+userID); ResultSet rs = statement.executeQuery(); 

您正在使用Prepare Statement ..所以您需要使用statement.setInt()statement.setString()来设置您的参数,具体取决于您的userId的类型

替换为: –

  statement =con.prepareStatement("SELECT * from employee WHERE userID = :userId"); statement.setString(userId, userID); ResultSet rs = statement.executeQuery(); 

或者,你可以使用? 取代命名值 – :userId ..

  statement =con.prepareStatement("SELECT * from employee WHERE userID = ?"); statement.setString(1, userID); 

做这样的事情,这也可以防止SQL注入攻击

 statement = con.prepareStatement("SELECT * from employee WHERE userID = ?"); statement.setString(1, userID); ResultSet rs = statement.executeQuery(); 

您可以使用 ‘?’ 使用PreparedStatments在字符串中设置自定义参数。

 statement =con.prepareStatement("SELECT * from employee WHERE userID = ?"); statement.setString(1, userID); ResultSet rs = statement.executeQuery(); 

如果直接在查询中直接传递userID,那么它可能会被SQL INJECTION Attack攻击。

问题是你需要添加“’;” 最后。