pasar los parámetros a un JDBC PreparedStatement

Estoy tratando de hacer mi clase de validación para mi progtwig. Ya establecí la conexión a la base de datos MySQL y ya inserté las filas en la tabla. La tabla consta de los campos firstName , lastName e lastName userID . Ahora quiero seleccionar una fila específica en la base de datos a través de mi parámetro de mi constructor.

 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); } } } 

pero no parece funcionar.

Debe usar el método setString() para establecer el setString() . Esto garantiza que la statement tenga el formato correcto y previene la SQL injection :

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

Hay un buen tutorial sobre cómo usar PreparedStatement correctamente en los Tutoriales de Java .

Si está utilizando una statement preparada, debe usarla así:

 "SELECT * from employee WHERE userID = ?" 

Luego usa:

 statement.setString(1, userID); 

? se reemplazará en su consulta con la ID de usuario pasada al método setString .

Mire aquí cómo usar PreparedStatement .

Hay un problema en su consulta …

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

Está utilizando Preparar statement. Por lo tanto, debe establecer su parámetro utilizando statement.setInt() o statement.setString() dependiendo de cuál sea el tipo de su userId

Reemplázalo con: –

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

O bien, puedes usar ? en lugar del valor con nombre – :userId ..

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

Haz algo como esto, que también previene ataques de inyección SQL

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

Puedes usar ‘?’ para establecer parámetros personalizados en una cadena usando PreparedStatments.

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

Si pasa directamente el ID de usuario en la consulta como lo hace, puede ser atacado por SQL INJECTION Attack.

El problema era que necesitabas agregar “‘;” al final.