PREPARED STATEMENT JAVA

Cuando se ejecuta una sentencia SQL, la sentencia se compila y se envía al SGBD para su ejecución. Si esta misma sentencia se va a ejecutar varias veces, puede ser conveniente precompilarla para que su ejecución sea más eficiente. 

Una PreparedStatement es una sentencia SQL precompilada. 

Las utilizaremos en lugar de una Statement cuando haya que ejecutar varias veces una misma sentencia SQL con distintos parámetros. 

Ventajas de  PreparedStatement sobre Statement:
  •     Mayor velocidad de ejecución.
  •     No tendremos que revisar los datos que introduzca el usuario para formar la sentencia SQL. Por Ejemplo:
En un Statement s si hacemos una operación como esta:
s.executeUpdate("UPDATE contacto SET nombre = '" +nombre + "' WHERE id=100");
y nombre contiene por ejemplo O'Donnell obtendremos una instrucción mal formada ya que habrá una comilla simple dentro del nombre que se tomará como final de la cadena nombre, provocando un error. Esto se evita utilizando Prepared Statements. A una PreparedStatement le pasamos los datos y realizará todo lo necesario para crear una sentencia SQL correcta.

Tanto el servidor de bases de datos como el driver de conexión deben soportarlas. Si no es así funcionarán igual que Statement.
Además, en la conexión debemos indicar al servidor que active el uso de Prepared Statements.
  DriverManager.getConnection("jdbc:mysql://localhost/prueba?useServerPrepStmts=true","root", "1daw");

Las Prepared Statements son un método para prevenir el SQL Injection.

Una PreparedStatement se crea utilizando el método prepareStatement() de Connection,  escribiendo el signo ? en lugar de los parámetros.

Por ejemplo:
PreparedStatement ps =  conexion.prepareStatement("INSERT INTO contactos values (null,?,?,?)");

Una PreparedStatement es una sentencia SQL que contiene ? en los lugares donde posteriormente se asignarán los valores. De este modo estamos indicando al SGBD cuál es el código y cuáles son las variables que el usuario debe ingresar.

Estos valores se asignan mediante métodos setXxx(posición, valor). Donde Xxx es el tipo de dato, posición indica la posición del interrogante que vamos a asignar y valor contiene el valor asignado.

Ejemplo de uso de una Prepared Statement:

Insertar un registro en la tabla contactos

import java.sql.*;
public class EjemploAccesoBD8 {
    public static void main(String[] args) {
        Connection conexion = null;
        try {
            Class.forName("com.mysql.jdbc.Driver");
       conexion =
       DriverManager.getConnection("jdbc:mysql://localhost/prueba?useServerPrepStmts=true",
                                                 "root", "1daw");
       PreparedStatement ps = conexion.prepareStatement("INSERT INTO contactos values (null,?,?,?)");
           //Asigno al primer ? el String "Leopoldo".
           //Corresponde al campo nombre de tipo VARCHAR
            ps.setString(1, "Leopoldo");
            // Asigno al segundo ? el String "Pelayo".
            //Corresponde al campo apellidos de tipo VARCHAR
            ps.setString(2, "Pelayo");
            // Asigno al tercer ? el String "987876509".
            //Corresponde al campo telefono de tipo VARCHAR
            ps.setString(3, "999878765");
            // Se ejecuta la operación.
            ps.executeUpdate();
        } catch (SQLException e) {
            System.out.println(e.toString());
        } catch (ClassNotFoundException e) {
            System.out.println(e.toString());
        } finally {
            try {
                if (conexion != null) {
                    conexion.close();
                }
            } catch (SQLException ex) {
                System.out.println(ex.toString());
            }
        }
    }
}