web-dev-qa-db-fra.com

Utilisation d'une variable au lieu d'un index de paramètres avec une instruction préparée JDBC

Dans de nombreux langages de programmation, quelque chose comme ceci est possible pour les instructions préparées:

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

Mais pas avec Java.sql.PreparedStatement. Dans Java on doit utiliser des indices de paramètres:

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

Existe-t-il une solution pour travailler avec des variables de chaîne comme dans le premier exemple? "$ {. *}" N'est-il pas utilisé ailleurs dans le langage SQL, ou y a-t-il des conflits? Parce que je l'implémenterais moi-même (en analysant la chaîne SQL et en remplaçant chaque variable par "?" Puis en le faisant de la manière Java).

Cordialement, Kai

34
Zardoz

Comme kd304 l'a mentionné dans le commentaire de mon message, c'est une très bonne solution si vous ne voulez pas incorporer une autre bibliothèque tierce (comme Spring) dans votre projet: Article Javaworld: Paramètres nommés pour PreparedStatement

17
Zardoz

Les déclarations préparées JDBC standard n'ont pas cette capacité. Spring JDBC fournit cette fonctionnalité via NamedParameterJdbcTemplate .

26
laz

En utilisant un PreparedStatement brut, ce n'est pas possible, comme vous le dites. C'est possible avec CallableStatement, mais cela nécessite une procédure stockée plutôt qu'une simple instruction SQL.

Les couches ORM comme Hibernate fournissent également une substitution de paramètres nommés, et Hibernate vous permet également d'exécuter du SQL natif, en contournant complètement la fonctionnalité de mappage OR.

Donc, si vous souhaitiez vraiment utiliser des paramètres nommés, vous pourriez utiliser Hibernate comme moyen de le faire; vous n'utiliseriez qu'une infime partie de ses fonctionnalités.

5
skaffman