2017-10-04 2 views
0

J'ai une interface requêtes comme ceci:le stockage des requêtes dans une interface pour obtenir des données de base de données (+ java Sélénium WebDriver)

public interface Queries { 

    String QUERY1= "SELECT distinct TOP1 FROM ETC...." 
    String QUERY2= "SELECT * FROM Whatever WHERE whateverId = QUERY1" 

} 

J'exécuter les requêtes en utilisant mon coureur personnalisé avec Queries.QUERY1 et fonctionne comme un charme, mais dans certains cas, besoin de valeurs personnalisées à partir de la base de données et l'utiliser dans une autre requête. S'il vous plaît voir QUERY2. Avec cette approche, je ne peux pas utiliser le premier résultat de requête dans la requête 2.

J'ai essayé de stocker mes requêtes dans les fichiers de propriétés, mais j'ai trouvé que cette approche d'interface est meilleure, plus facile.

Aucune recommandation Comment puis-je l'obtenir? Une meilleure solution pour stocker des requêtes pour les scripts de test de sélénium et l'utiliser facilement?

+0

Je pense que vous vous méprenez sur l'interface. Je crois que ce que vous voulez est une classe ou une classe statique. – Buaban

Répondre

1

Ce n'est pas ce à quoi les interfaces étaient destinées. Vous devriez probablement lire sur les interfaces pour en savoir plus sur la façon de les utiliser. Si vous avez besoin d'utiliser des requêtes SQL, je créerais une classe auxiliaire et certaines propriétés telles que QUERY1 ne changeraient pas, puis quelques méthodes pour QUERY2 où la méthode prend les paramètres que vous utilisez pour construire la requête et rends le.

Je suggère également que vous donniez aux requêtes des noms descriptifs. Personne ne saura ce qu'est QUERY1 v QUERY2. Des noms comme TopTenBugs, MostPurchasedProduct, etc. seraient plus facilement identifiés.

Quelques exemples de code

public static class Queries 
{ 
    public static String TopProduct = "SELECT TOP 1 ProductId FROM Products"; 

    public static PreparedStatement getTopNOfField(Connection connection, int number, String fieldName) 
    { 
     PreparedStatement statement = connection.prepareStatement("SELECT TOP ? ? FROM Products"); 
     statement.setInt(1, number); 
     statement.setString(2, fieldName); 

     return statement; 
    } 
} 

Je ne suis pas un expert en SQL, mais cela devrait vous donner une idée de ce dont je parle. Je suis allé avec PreparedStatement puisque c'est une bonne pratique pour éviter l'injection SQL. Il y a aussi beaucoup de bibliothèques créées pour aider à construire des requêtes SQL que vous pourriez utiliser.

Vous voudrez peut-être changer cela pour que tout soit PreparedStatement par souci de cohérence. Par conséquent, remplacez les String statiques par des méthodes sans paramètres. De cette façon, votre expérience utilisateur est la même quelle que soit la requête que vous utilisez.

Vous pouvez également modifier cette classe d'assistance pour gérer toutes les connexions SQL métier ..., les requêtes, etc. et renvoyer les résultats plutôt que PreparedStatement s. C'est à vous.

+0

Bien sûr, j'ai utilisé ces noms pour juste exemple. Pourriez-vous s'il vous plaît me donner un exemple de haut niveau, quelle est votre idée avec les classes auxiliaires? J'ai beaucoup, mais dans ce cas, je ne comprends pas. Merci – brobee

+0

Ajout d'un exemple de code et quelques explications. – JeffC

+0

J'ai compris votre point maintenant! J'ai un coureur de requête et je passe juste la requête en tant que chaîne pour cela. J'ai besoin de le modifier pour passer des paramètres non seulement avec des chaînes? marque. Merci! – brobee