Maison > Article > base de données > Comment JDBC implémente-t-il une requête dynamique ?
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
disponible. Il existe de nombreuses conditions de requête et de nombreuses combinaisons, et il est difficile de toutes les lister
1. . Cadre de base SQL 🎜>
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 ? >
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
. 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. 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
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!