将参数传递给JDBC PreparedStatement
我正在尝试为我的程序制作validation课程。 我已经建立了与MySQL数据库的连接,我已经在表中插入了行。 该表由firstName
, lastName
和userID
字段组成。 现在我想通过构造函数的参数在数据库中选择一个特定的行。
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攻击。
问题是你需要添加“’;” 最后。