Pregunta Usar una variable en lugar de un índice de parámetro con una declaración preparada de JDBC


En muchos lenguajes de programación, algo como esto es posible para las declaraciones preparadas:

PreparedStatement statement = connection.prepareStatement(
    "SELECT id FROM Company WHERE name LIKE ${name}");
statement.setString("name", "IBM");

Pero no con java.sql.PreparedStatement. En Java, uno tiene que usar índices de parámetros:

PreparedStatement statement = connection.prepareStatement(
    "SELECT id FROM Company WHERE name LIKE ?");
statement.setString(1, "IBM");

¿Hay alguna solución para trabajar con variables de cadena como en el primer ejemplo? ¿No se usa "$ {. *}" En otro lugar del lenguaje SQL, o hay algún conflicto? Porque entonces lo implementaría yo mismo (analizando la cadena SQL y reemplazando todas las variables por "?" Y luego haciéndolo de la manera Java).

Saludos, Kai


32
2017-07-08 12:48


origen


Respuestas:


Las declaraciones estándar preparadas de JDBC no tienen esta capacidad. Spring JDBC proporciona esta funcionalidad a través de NamedParameterJdbcTemplate.


26
2017-07-08 13:07



Como kd304 mencionó en el comentario de mi publicación, esta es una solución muy buena si no desea incorporar otra biblioteca de terceros (como Spring) en su proyecto: Artículo de Javaworld: Parámetros con nombre para PreparedStatement


16
2017-07-08 21:17



Al usar un PreparedStatement crudo, esto no es posible, como dices. Es posible con CallableStatement, pero eso requiere un procedimiento almacenado en lugar de solo una declaración SQL.

Las capas ORM como Hibernate también proporcionan la sustitución de parámetros nombrados, e Hibernate también le permite ejecutar SQL nativo, omitiendo completamente la funcionalidad de asignación OR.

Entonces, si realmente desea utilizar parámetros con nombre, podría emplear Hibernate como una forma de hacerlo; solo estarías usando una pequeña fracción de su funcionalidad.


5
2017-07-08 13:05