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());
}
}
}
}
No hay comentarios:
Publicar un comentario