Comment créer une dynamique de l'instruction préparée en Java?
Je sais à l'aide de déclarations préparées à l'avance permet d'éviter les injection sql. Mon problème est, qu'une instruction préparée est généralement très statique. J'ai un problème, lorsque j'ai construit la clause where de l'instruction sql de la requête au moment de l'exécution, en fonction de l'entrée utilisateur. En fonction d'entrée-champs sont remplis, je dois ajouter la correspending énoncés à la clause where. Comment cela peut-il être réalisé avec des requêtes préparées?
Vous devez vous connecter pour publier un commentaire.
Je suppose que vous pourriez générer dynamiquement votre prêt consolidés sur la base de ce que les colonnes qu'ils veulent de la requête, c'est à dire utiliser un StringBuffer et une boucle de construire sur la base de la colonne requise.
Pour plus d'efficacité vous devez garder dans une sorte de recherche en mémoire. Donc, si vous voulez retrouver avec une Carte ou une autre collection de déclarations préparées à l'avance où la recherche est la clé de colonnes, ils sont conçus pour s'interroger.
Si vous êtes à la construction de la où/et de la clause(s) dans votre requête basée sur ce que les options que l'utilisateur a sélectionné alors, je suppose que vous savez déjà ce que des modifications devront être apportées à la requête en vue d'obtenir les données souhaitées. Si c'est le cas, alors vous pourriez créer une méthode qui prend l'option de l'utilisateur le demande en tant que paramètre à la méthode, la méthode s'appuie la requête et renvoie cette requête.
Maintenant, si vous avez besoin d'utiliser certaines des valeurs entrées par l'utilisateur dans la requête, vous pouvez les stocker temporairement dans une liste ou sur la carte et de les définir.
Il y a probbaly plus elegeant solution au problème, mais nous avons une application qui interroge la base de données pour les enregistrements à l'aide de l'entrée de l'utilisateur pour construire les requêtes et c'est très bien pour les deux dernières années. Espérons que cela aide.
Si vous voulez seulement la protection contre l'injection sql, la construction de la requête au moment de l'exécution est OK, tant que vous n'insérez rien d'utilisateur envoyé dans la requête (mais l'insertion de la clause si l'utilisateur a envoyé au moins quelque chose dans le champ est ok).
Performances - je ne sais pas. Peut-être que DB va mettre en cache les requêtes préparées, si vous construisez exactement le même, il sera plus rapide, ou il ne sera pas. Je ne sais pas comment trouver le hors.
Si vous êtes en utilisant Hibernate, Les Critères De Requêtes API est un bel outil pour éviter de concaténation de Chaîne de construire des Requêtes SQL. Avec la plaine JDBC, vous aurez à aller à un StringBuffer comme @vous jhonny dit.
Déclarer une méthode et passer le userinput par cette méthode. Ensuite, utilisez
setString
ousetLong
en fonction de votre type de données à l'intérieur de la preparedstement objet.