Maison  >  Article  >  base de données  >  Comment JDBC implémente-t-il une requête dynamique ?

Comment JDBC implémente-t-il une requête dynamique ?

零下一度
零下一度original
2017-07-21 14:12:561084parcourir

Dans le développement de réseaux, les requêtes complètes avec plusieurs conditions sont très courantes. Pour répondre à ce besoin commercial, nous utilisons généralement les méthodes suivantes pour y parvenir :
1. Collez directement les valeurs des paramètres dans l'instruction SQL, puis interrogez.
Il faut dire que la sécurité de cette méthode est relativement faible et qu'elle peut être accidentellement injectée par SQL. Bien que vous puissiez d'abord filtrer les caractères spéciaux dans les valeurs des paramètres, cela ne semble pas toujours très élégant.
2. Utiliser d'abord un espace réservé ? ' pour épisser SQL, puis remplir le PreparedStatement par jugement conditionnel.
Quiconque a utilisé cette méthode de TX connaît la complexité de cette méthode. Vous devez d'abord porter un jugement lorsque vous essayez d'écrire du SQL, puis vous devez à nouveau porter un jugement lorsque vous remplissez le fichier PST, ce qui est gênant.
3. Stockage des procédures
J'ai toujours été mécontent des procédures stockées. J'ai déjà fait migrer un projet de MySQL vers MSSQL, puis vers ORACLE. En fin de compte, différentes versions du produit s'exécutaient sur différentes bases de données. cette fois-là, j’ai failli le devoir. C’est ma vie.
En fait, tout ce que j'ai à dire, c'est que je veux une méthode de requête relativement élégante et simple. Je me suis inspiré du SQLHelper fourni dans .NET dans le paragraphe précédent, puis j'ai écrit un composant similaire (en fait, je l'ai fait). Recherche de la moitié sur Google Aucune fondation répondant aux exigences n'a été trouvée depuis des heures

1 Qu'est-ce qu'une requête dynamique

. Sélectionnez au hasard parmi plusieurs conditions de requête. Plusieurs sont combinées en une seule instruction DQL pour la requête. Ce processus est appelé requête dynamique

2. Difficultés de la requête dynamique

disponible. Il existe de nombreuses conditions de requête et de nombreuses combinaisons, et il est difficile de toutes les lister

3. La composition de l'instruction de requête finale

Une fois que l'utilisateur soumet les conditions de requête, saisissez les données dans la condition de requête, et la condition de requête fait partie de la condition finale :

1. . Cadre de base SQL 🎜>

Quelles que soient les conditions de requête, les champs de requête et la base de données sont fixes. Ces contenus fixes constituent le cadre de base de l'instruction SQL, comme

<.>

2.StringBuilder forme DQL

pour obtenir la saisie du formulaire. Si le paramètre de requête n'est pas vide, les conditions de requête sont générées en fonction. le paramètre de requête, tel que "name=?", "age>?", ajoute les conditions de requête au cadre de base
select column... from table。
Utilisez StringBuilder pour ajouter les conditions de requête. À ce stade, une question se pose : comment. pour déterminer si « et » doit être ajouté aux conditions de requête générées ? >

Si la condition de requête est la première condition de requête, il n'est pas nécessaire d'ajouter « et », sinon le problème se complique, chaque fois que la condition de requête est générée. Il est nécessaire de déterminer s'il y a une condition de requête devant elle

Nous pouvons envisager d'ajouter une condition de requête dans le framework SQL de base. . L'existence de la condition de requête n'affecte pas les résultats de la requête et agit uniquement comme un espace réservé pour éviter les dynamiques Déterminez si "et" doit être ajouté lors de l'ajout de conditions de requête. Selon ces exigences, cette condition de requête. doit toujours être vrai. Ici, nous prenons "1=1", et le framework SQL de base
devient Il devient
Ajouter. "et" devant chaque condition de requête dynamique. 3.List. Collection attribue des valeurs aux espaces réservés

select column...from table where 1=1
Avec l'instruction DQL. , vous devez réfléchir à la manière d'attribuer des valeurs aux espaces réservés. Vous pouvez collecter les paramètres correspondant aux espaces réservés tout en générant des conditions de requête, stockés dans un ensemble ordonné de

. que les espaces réservés forment une correspondance séquentielle avec les éléments de la collection List. Le nième espace réservé correspond à

Pour le nième élément, vous pouvez attribuer une valeur à l'espace réservé en parcourant la collection.

Lorsque vous attribuez une valeur à un espace réservé, vous devez non seulement transmettre les données à l'espace réservé, mais également sélectionner un type de données cohérent avec le champ. La collection List stocke uniquement les données et est.

non Pour répondre aux exigences, vous devez toujours ajouter des informations sur les champs pour distinguer les différents champs et sélectionner différents types de données. Les éléments de la collection prennent ici la forme de "colonne+données". Trois démos
1. Base de données

2.Page

3.服务器端(Servlet)

"/dynamicQueryServlet"  DynamicQueryServlet     serialVersionUID = 1L "text/html;charset=UTF-8"String name = request.getParameter("name"= request.getParameter("sex"= request.getParameter("age"= request.getParameter("depNo"String baseSQL = "select name,sex,age,depNo from tb_employee where 1=1"=  StringBuilder();List<String> params =  ArrayList<String>" and name=? ""name," + name);" and sex=? ""sex," +" and age=? ""age," +" and depNo=?""depNo," += = = = == ( i = 0; i < params.size(); i++== str.split(","); (arr[0].equals("age" a = Integer.parseInt(arr[1+ 1+ 1, arr[1== res.getString("name"= res.getString("sex" targetAge = res.getInt("age"= res.getString("depNo"= "name=" + targetName + "--" + "sex=" + targetSex + "--" + "age=" + targetAge + "--"
                        + "depNo=" ++ "<br>" (ClassNotFoundException | (res !=  (ps !=  (conn != = length = (length == 0"查询为空"+ "<br>" +   (str ==  | str.equals(""    Connection getConnection() "com.mysql.jdbc.Driver" DriverManager.getConnection("jdbc:mysql://localhost:3366/test01", "root", "123"

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