2012-09-14 14 views
14

estoy usandoEl uso de una declaración preparada y Orden unen variable en Java con JDBC

  1. JdbcTemplate para hacer conexiones JDBC a una base de datos MySQL
  2. declaraciones preparadas para protegerme tanto como sea posible de SQL ataques de inyección
  3. en la necesidad de aceptar las peticiones del usuario para ordenar los datos en cualquiera de una docena de columnas diferentes
  4. la siguiente declaración

    jdbcTemplate.query("SELECT * FROM TABLE1 ORDER BY ? ?", colName, sortOrder); 
    

Por supuesto, esto no funciona, porque no se supone que los enlaces de variables especifiquen los nombres de las columnas solo los valores de los parámetros para las expresiones en la consulta.

Entonces ... ¿cómo está la gente resolviendo este problema? Solo hacer el ordenamiento en código Java parece una solución fácil, pero dado que obtengo una cadena variable para la columna para ordenar, y una variable que me dice el orden de clasificación ... esa es una cantidad fea de condiciones de comparación para cubrir. Esta parece que debería ser un problema común con un patrón común de resolverlo ...

Respuesta

16

Los marcadores de posición ? solo se pueden usar para valores de parámetros, pero no con instrucciones de columna y orden de clasificación. Entonces, la forma estándar de hacerlo es como se señala, p. here es usar String#format() o algo similar para agregar el nombre de su columna y el valor del pedido a su consulta.

Otra opción es usar Spring Data JPA donde puede dar a su método como argumento una instancia del tipo Sort que puede contener toda la información necesaria para que la base de datos la ordene.

2

me gustaría simplemente concatenar el nombre de la columna y el fin de la consulta SQL, pero sólo después de

  1. verificar que el el nombre y el orden de la columna son válidos en este contexto.
  2. desinfectándolos para contrarrestar cualquier intento de ataque SQL Injection.

Creo que esto es eficiente en comparación con buscar los resultados en la capa de aplicación y ordenarlos aquí.

+0

¿me puede responder aquí? El mismo problema: http://stackoverflow.com/questions/42627074/checking-if-values-is-in-database-with-springboot-excaly-once-llamado –

Cuestiones relacionadas