JDBC是如何實作動態查詢的?

零下一度
發布: 2017-07-21 14:12:56
原創
1147 人瀏覽過

在網路開發中,多種條件的綜合查詢非常常見,應對這種業務需求我們通常使用以下幾種方法來實現: 
1.直接將參數值拼接到SQL語句中,然後進行查詢。 
這種方式的安全性應當說是比較差的,一不小心就被SQL注入了。雖然可以先過濾參數值中的特殊字符,但總感覺不是很優雅。 
2.先使用佔位符'? '來拼接SQL,然後再透過條件判斷去填入的PreparedStatement。 
用過這種方式的TX,都知道這種方式的複雜度。先要在拼SQL時判斷一次,然後還要在填入PST時再判斷一次,麻煩。
3.流程儲存 
的檔案本身一直不爽的儲存過程,以前有一個專案從MySQL的遷移到MSSQL,後來又換成ORACLE,最後產品的不同版本運行在不同資料庫上,當時差點要了親命了。
其實講 麼多無非是想要一種相對優雅簡單的查詢方式,前一段看到.NET中的提供SQLHelper受到一些啟發,然後就寫了這麼一個類似的組件(其實我谷歌了半個小時都沒有找到符合要求的基礎 

1.什麼是動態查詢?若干個組合成一個DQL語句進行查詢,這個過程叫做動態查詢。的查詢條件多,組合情況多,難以一一列舉。中輸入數據,該查詢條件就成為最終條件的一部分。 ## 無論查詢條件為何,查詢欄位與資料庫是固定不變的,這些固定不變的內容構成SQL語句的基本框架,如

select column... from table。
登入後複製

2.StringBuilder形成DQL

取得表單輸入,如果請求參數非空,根據該請求參數產生查詢條件,如“name=?”,“age> ;?”,將查詢條件追加到基本框架中。利用StringBuilder來追加查詢條件,這時出現一個問題,怎麼判斷生成的查詢條件中是否需要添加“and”?

    如果該查詢條件是第一個查詢條件,不需要新增"and",否則需要新增「and」。判斷前面是否存在查詢條件。 在新增查詢條件時判斷是否需要新增“and”。

select column...from table where 1=1
登入後複製

每個動態查詢條件前段都會加上「and」。符賦值

有了DQL語句,接著需要考慮怎麼為佔位符賦值。 ##一個有序集合中,這裡選擇List集合,這樣佔位符就與List集合中的元素形成了順序上的對應關係,第n個佔位符對應

第n個元素,遍歷集合就可以為佔位符賦值了。

    為佔位符賦值時,不僅需要將資料傳遞給佔位符,還需要選擇與欄位一致的資料類型,List集合僅儲存資料已經

#不能夠滿足要求了,還需要添加字段信息,以區分不同的字段,選擇不同的數據類型。這裡集合中的元素採用

「column+data」的形式。

三Demo1.資料庫

##2.頁

<!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="查询"> <input type="reset"value="重置"></div></form></body></html>
登入後複製
#

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"
登入後複製

以上是JDBC是如何實作動態查詢的?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板