Maison >Java >javaDidacticiel >Les instructions préparées peuvent-elles gérer les noms de colonnes dynamiques dans les requêtes SQL ?

Les instructions préparées peuvent-elles gérer les noms de colonnes dynamiques dans les requêtes SQL ?

Linda Hamilton
Linda Hamiltonoriginal
2024-12-10 09:20:15276parcourir

Can Prepared Statements Handle Dynamic Column Names in SQL Queries?

Utilisation d'instructions préparées pour les noms de colonnes dynamiques

Lorsque vous travaillez avec des requêtes de base de données, un dilemme courant se pose lorsque vous essayez de spécifier des noms de colonnes dynamiques. Cet article explore la possibilité de transmettre des noms de colonnes variables via des instructions préparées, en particulier dans MySQL utilisant Java.

Déclaration de défi

Lorsque l'utilisateur tente d'exécuter l'instruction préparée, les noms de colonnes sont transmis sous forme de chaîne :

String columnNames = "d,e,f";
String query = "SELECT a,b,c,? FROM " + name + " WHERE d=?";
stmt = conn.prepareStatement(query);
stmt.setString(1, columnNames);
stmt.setString(2, "x");

Cependant, l'instruction SQL résultante affiche les noms de colonnes dans le cadre du littéral string :

SELECT a,b,c,'d,e,f' FROM some_table WHERE d='x'

Le résultat souhaité, cependant, est d'avoir les noms de colonnes dans des colonnes séparées :

SELECT a,b,c,d,e,f FROM some_table WHERE d='x'

Discussion sur la solution

Il est crucial de noter que cette pratique indique une conception de base de données défectueuse. Idéalement, les utilisateurs ne devraient pas connaître les noms des colonnes. Une meilleure solution serait de créer une colonne explicite dans la base de données pour stocker les « noms de colonnes » à la place.

Malheureusement, définir les noms de colonnes comme valeurs PreparedStatement n'est pas possible. Les instructions préparées ne peuvent être utilisées que pour définir les valeurs des colonnes.

Si l'utilisation de noms de colonnes variables est inévitable, il est nécessaire de nettoyer l'entrée et de construire manuellement la chaîne SQL. Cela implique de citer les noms de colonnes individuelles et d'échapper les guillemets dans les noms de colonnes à l'aide de String#replace().

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn