国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - Java中JDBC實現動態查詢的實例詳解

Java中JDBC實現動態查詢的實例詳解

2020-11-29 11:46tonghun Java教程

從多個查詢條件中隨機選擇若干個組合成一個DQL語句進行查詢,這一過程叫做動態查詢。下面通過實例代碼給大家講解JDBC實現動態查詢的方法,需要的朋友參考下吧

一 概述

1.什么是動態查詢

從多個查詢條件中隨機選擇若干個組合成一個DQL語句進行查詢,這一過程叫做動態查詢。

2.動態查詢的難點

可供選擇的查詢條件多,組合情況多,難以一一列舉。

3.最終查詢語句的構成

一旦用戶向查詢條件中輸入數據,該查詢條件就成為最終條件的一部分。

二 基本原理

1.SQL基本框架

無論查詢條件如何,查詢字段與數據庫是固定不變的,這些固定不變的內容構成SQL語句的基本框架,如

?
1
select column... from table

2.StringBuilder形成DQL

獲取表單輸入,如果請求參數非空,根據該請求參數生成查詢條件,如“name=?”,“age>?”,將查詢條件追加到基本框架中。利用StringBuilder來追加查詢條件,這時出現一個問題,怎么判斷生成的查詢條件中是否需要添加“and”?
如果該查詢條件是第一個查詢條件,不需要添加"and",否則需要添加“and”。問題變得復雜起來,每一次生成查詢條件時都需要判斷前面是否存在查詢條件。

我們可以考慮在SQL基本框架中添加一個查詢條件,該查詢條件的存在不影響查詢結果,只充當占位角色,避免動態添加查詢條件時判斷是否需要添加“and”。根據這些要求,這一查詢條件必須恒為真,這里我們取“1=1”,SQL基本框架就變成了

?
1
select column...from table where 1=1

每一個動態查詢條件前段都添加“and”。

3.List集合為占位符賦值

有了DQL語句,接著需要考慮怎么為占位符賦值。可以在生成查詢條件的同時,將占位符對應的參數收集起來,存入一個有序集合中,這里選擇List集合,這樣占位符就與List集合中的元素形成了順序上的對應關系,第n個占位符對應第n個元素,遍歷集合就可以為占位符賦值了。
為占位符賦值時,不僅僅需要將數據傳遞給占位符,還需要選擇與字段一致的數據類型,List集合僅僅存儲數據已經不能夠滿足要求了,還需要添加字段信息,以區分不同的字段,選擇不同的數據類型。這里集合中的元素采用“column+data”的形式。

三 Demo

1.數據庫

2.頁面

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<style>
span {
  display: inline-block;
  width: 75px;
  margin-bottom: 15px;
}
</style>
<title>動態查詢</title>
</head>
<body>
  <form action="http://localhost:8080/JavaSETest/dynamicQueryServlet">
    <div>
      <span>姓名:</span><input type="text" name="name">
    </div>
    <div>
      <span>性別:</span><input type="text" name="sex">
    </div>
    <div>
      <span>年齡:</span><input type="text" name="age">
    </div>
    <div>
      <span>部門編號:</span><input type="text" name="depNo">
    </div>
    <div>
      <input type="submit"value="查詢">&nbsp;<input type="reset"value="重置">
    </div>
  </form>
</body>
</html>

3.服務器端(Servlet)

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
package com.javase.jdbc;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/dynamicQueryServlet")
public class DynamicQueryServlet extends HttpServlet {
  private static final long serialVersionUID = 1L;
  @Override
  protected void doGet(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
    response.setContentType("text/html;charset=UTF-8");
    // 獲取請求參數
    String name = request.getParameter("name");
    String sex = request.getParameter("sex");
    String age = request.getParameter("age");
    String depNo = request.getParameter("depNo");
    // 關鍵是"where 1=1",不需要再判斷追加的查詢條件前是否需要添加and,統一在前面添加and
    String baseSQL = "select name,sex,age,depNo from tb_employee where 1=1";
    StringBuilder builder = new StringBuilder();// 用于拼接SQL語句
    // 用于在占位符與參數值之間建立映射,占位符與參數值在各自序列中的排序一相同,例如name的占位符在SQL語句中排第一,name的參數值在
    // 集合中排第一。
    List<String> params = new ArrayList<String>();
    builder.append(baseSQL);
    if (isNotEmpty(name)) {
      builder.append(" and name=? ");
      params.add("name," + name);// 集合中不能僅僅存儲具體的數據,還要存儲字段名,以便后續根據字段名選擇數據類型
    }
    if (isNotEmpty(sex)) {
      builder.append(" and sex=? ");
      params.add("sex," + sex);
    }
    if (isNotEmpty(age)) {
      builder.append(" and age=? ");
      params.add("age," + age);
    }
    if (isNotEmpty(depNo)) {
      builder.append(" and depNo=?");
      params.add("depNo," + depNo);
    }
    Connection conn = null;
    PreparedStatement ps = null;
    ResultSet res = null;
    StringBuilder resStr = new StringBuilder();
    try {
      conn = getConnection();
      ps = conn.prepareStatement(builder.toString());
      for (int i = 0; i < params.size(); i++) {
        String str = params.get(i);
        String[] arr = str.split(",");//arr[0]儲存字段信息,用于區分字段;arr[1]存儲數據,用于為占位符賦值
        // 因為為占位符賦值時,需要根據字段類型選擇數據類型,所以在此判斷類型
        if (arr[0].equals("age")) {
          int a = Integer.parseInt(arr[1]);
          ps.setInt(i + 1, a);
        } else {
          ps.setString(i + 1, arr[1]);
        }
      }
      res = ps.executeQuery();
      while (res.next()) {
        String targetName = res.getString("name");
        String targetSex = res.getString("sex");
        int targetAge = res.getInt("age");
        String targetDepNo = res.getString("depNo");
        String temp = "name=" + targetName + "--" + "sex=" + targetSex + "--" + "age=" + targetAge + "--"
            + "depNo=" + targetDepNo;
        resStr.append(temp + "<br>");
      }
    } catch (ClassNotFoundException | SQLException e) {
      e.printStackTrace();
    } finally {
      if (res != null)
        try {
          res.close();
        } catch (SQLException e) {
          e.printStackTrace();
        }
      if (ps != null)
        try {
          ps.close();
        } catch (SQLException e) {
          e.printStackTrace();
        }
      if (conn != null)
        try {
          conn.close();
        } catch (SQLException e) {
          e.printStackTrace();
        }
    }
    PrintWriter out = response.getWriter();
    int length = resStr.length();
    if (length == 0)
      out.write("查詢為空");
    else
      out.write(builder.toString() + "<br>" + resStr.toString());
  }
  /**
   * 判斷請求參數是否存在,是否有數據輸入
   *
   * @param str
   * @return
   */
  private boolean isNotEmpty(String str) {
    if (str == null | str.equals("")) {
      return false;
    }
    return true;
  }
  public static Connection getConnection() throws ClassNotFoundException, SQLException {
    Class.forName("com.mysql.jdbc.Driver");
    return DriverManager.getConnection("jdbc:mysql://localhost:3366/test01", "root", "123");
  }
}

以上所述是小編給大家介紹的Java中JDBC實現動態查詢的實例詳解,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對服務器之家網站的支持!

原文鏈接:http://www.cnblogs.com/tonghun/archive/2017/07/07/7132469.html

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 日韩成人精品在线观看 | www.fefe66.com| 中文字幕国产日韩 | 国产视频久久 | 爱操在线 | 不卡中文一区 | 欧美黄色网 | www.欧美视频 | 亚洲视频一区 | 欧美精品成人一区二区三区四区 | 偷拍一区二区 | 国产精品国产 | 欧美激情一区二区 | 亚洲人免费视频 | 久久99精品久久久久久6194 | av超碰| 国产精品美女久久久久久久网站 | 亚洲国产视 | 国产精彩视频 | 国产免费久久精品 | 国产成人精品一区二区三区四区 | 成人在线观看av | 日韩精品久久久久 | 免费自拍视频 | 亚洲一级在线 | 国产专区一区二区三区 | 在线免费观看av电影 | 国产毛片在线 | 精品国产乱码久久久久久久软件 | 亚洲高清在线观看 | 丁香久久 | 在线成人免费视频 | 国产午夜精品一区二区三区视频 | 国产精品无码久久久久 | 亚洲精品久久久一区二区三区 | 转生成为史莱姆这档事第四季在线观看 | 97精品国产一区二区三区 | 日日嗨av一区二区三区四区 | 国产精品3区 | 欧洲精品视频在线观看 | 云南一级毛片 |