CodeGym/Cursos Java/Módulo 4. Working with databases/Trabajar con declaraciones preparadas

Trabajar con declaraciones preparadas

Disponible

Tipos de declaraciones

Ya hemos visto la interfaz de declaración más simple . Y aunque es bastante adecuado para el trabajo, no lo es tanto para consultas complejas. En algunas fuentes, se expresa la opinión de que no es necesario usar Statement en absoluto; en su lugar, son adecuadas interfaces más complejas y funcionalmente más ricas.

  • Declaración preparada
  • CallableStatement

Surge una pregunta bastante razonable: ¿por qué se necesitan estas interfaces? Averigüémoslo.

Primero, veremos la interfaz de PreparedStatement y otras características de JDBC. Pasaremos a la interfaz CallableStatement más adelante: su uso, en primer lugar, no es tan común y, en segundo lugar, después de todo lo considerado al respecto, la conversación ya puede ser bastante breve.

Además, PreparedStatement es una gran ayuda desde el enfoque popular para piratear bases de datos llamado Inyección SQL.

Pero más sobre eso un poco más tarde.

Declaración preparada

Si intenta traducir el nombre PreparedStatement , puede obtener algo como "declaración preparada". La palabra más importante aquí es "preparado". ¿Qué es "preparación"?

Antes de considerar este tema, propongo ver un punto bastante importante desde el punto de vista de la conveniencia, que ocurre con mucha frecuencia. Entonces, en alguna aplicación, necesitamos insertar datos de contacto en la tabla CONTACTO. Para hacer esto, necesitamos preparar una consulta como esta:

INSERT INTO
  JC_CONTACT (FIRST_NAME, LAST_NAME, PHONE, EMAIL)
VALUES
  (
    'Harry',
    'Potter',
    '+79112345678',
    'harry@example.com'
  );

A primera vista, parece que no todo es tan difícil y aterrador. Necesitamos escribir un código que recopile la cadena que necesitamos de los parámetros: nombre, apellido, dirección y número de teléfono. Solo debe recordar que todos los datos de cadena deben estar rodeados por un carácter de comilla simple.

Si hacemos esto en una función separada, obtenemos algo como esto:

public String buildInsert(String firstName,, String lastName, String phone, String email) {
    String sql = "INSERT INTO JC_CONTACT (FIRST_NAME, LAST_NAME, PHONE, EMAIL)+VALUES ('" + firstName + "','" + lastName + "','" + phone + "','" + email + ")";
    return sql;
}

Pasamos el nombre, el apellido, el número de teléfono y la dirección a la función de parámetro en el formulario y, a partir de ellos, creamos una cadena de consulta SQL. Las citas estropean un poco la imagen, pero hasta ahora no da miedo.

Bien, ¿qué pasa con los números? No es necesario que estén rodeados de comillas. Opanki, en un caso necesitas cotizaciones, en el otro no. La situación se está complicando más.

Ahora agreguemos un problema más: ¿qué pasa si hay una cita ordinaria (y ni siquiera una) dentro de la cadena? Primero debe buscar dichas cotizaciones y procesarlas. Mdaaaa. De alguna manera empezamos a sentirnos incómodos.

Si ahora agregamos el procesamiento de fechas, entonces la tarea se vuelve completamente aburrida: debe hacer una gran cantidad de trabajo. Las fechas son generalmente desagradables: diferentes servidores SQL aceptan diferentes formatos para las fechas.

Entonces ¿Qué vemos? Si necesitamos usar parámetros dentro de la consulta, la construcción manual de la consulta se vuelve muy desagradable. Y no solo desagradable, incluso diría aburrido. Hay una gran cantidad de casos a considerar, y este es un trabajo terriblemente aburrido. Básicamente, es para tales casos que se propuso la interfaz PreparedStatement .

Esta solicitud le permite hacer dos cosas:

  • Prepare una solicitud con anticipación indicando los lugares donde se sustituirán los parámetros
  • Establecer parámetros de un determinado tipo y luego ejecutar una consulta con parámetros ya establecidos

Ejemplo de instrucción preparada

La estructura de PreparedStatement para nuestra opción de establecer parámetros se verá así:

// Example variables
String firstName = "Harry";
String lastName = "Potter";
String phone = "+12871112233";
String email = "harry@example.com";

// Request with indication of places for parameters in the form of "?"
String sql = "INSERT INTO JC_CONTACT (FIRST_NAME, LAST_NAME, PHONE, EMAIL) VALUES (?, ?, ?, ?)";

// Create a request. The con variable is an object of type Connection
PreparedStatement stmt = con.prepareStatement(sql);

// Set parameters
stmt.setString(1, firstName);
stmt.setString(2, lastName);
stmt.setString(3, phone);
stmt.setString(4, email);

// Execute the request
stmt.executeUpdate();

Como puedes ver, todo es bastante simple.

En primer lugar, al escribir una consulta SQL, los lugares donde será necesario sustituir los parámetros se escriben con signos de interrogación - "?".

En segundo lugar, la solicitud se crea llamando a con.prepareStatement() .

En tercer lugar, la configuración de los parámetros pasa por la indicación del número y el valor. Tenga en cuenta que la cantidad de parámetros comienza desde 1, no desde 0, como estamos acostumbrados cuando trabajamos con matrices y colecciones.

La interfaz PreparedStatement contiene métodos para establecer cadenas — setString() , para establecer números — setInt() , setLong() , setDouble() , para establecer fechas — setDate() . Y tipos más complejos: esto se puede ver en la documentación.

En cuarto lugar, la llamada a stmt.executeUpdate() ya se ejecutó sin especificar la cadena de consulta.

Recomiendo enfáticamente hacerse amigo de PreparedStatement : esta es una herramienta muy efectiva.

1
Tarea
Módulo 4. Working with databases,  nivel 8lección 1
Bloqueada
task0803
task0803
Comentarios
  • Populares
  • Nuevas
  • Antiguas
Debes iniciar sesión para dejar un comentario
Esta página aún no tiene comentarios