明輝手游網(wǎng)中心:是一個(gè)免費(fèi)提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺!

JDBC是怎么完成動(dòng)態(tài)查詢的?

[摘要]在網(wǎng)絡(luò)開發(fā)中,多種條件的綜合查詢非常常見,應(yīng)對這種業(yè)務(wù)需求我們通常使用下面幾種方法來實(shí)現(xiàn): 1.直接將參數(shù)值拼接到SQL語句中,然后進(jìn)行查詢。 這種方式的安全性應(yīng)當(dāng)說是比較差的,一不小心就被SQL注...
在網(wǎng)絡(luò)開發(fā)中,多種條件的綜合查詢非常常見,應(yīng)對這種業(yè)務(wù)需求我們通常使用下面幾種方法來實(shí)現(xiàn):
1.直接將參數(shù)值拼接到SQL語句中,然后進(jìn)行查詢。
這種方式的安全性應(yīng)當(dāng)說是比較差的,一不小心就被SQL注入了。雖然可以先過濾參數(shù)值中的特殊字符,但總感覺不是很優(yōu)雅。
2.先使用占位符'?'來拼接SQL,然后再通過條件判斷去填充的PreparedStatement。
用過這種方式的TX,都知道這種方式的復(fù)雜性。先要在拼SQL時(shí)判斷一次,然后還要在填充PST時(shí)再判斷一次,麻煩。
3.過程存儲(chǔ)
的檔案本人一直不爽的存儲(chǔ)過程,以前有一個(gè)項(xiàng)目從MySQL的遷移到MSSQL,后來又換成ORACLE,最后產(chǎn)品的不同版本運(yùn)行在不同數(shù)據(jù)庫上,當(dāng)時(shí)差點(diǎn)要了親命了。
其實(shí)講 么多無非就是想要一種相對優(yōu)雅簡單的查詢方式,前一段看到.NET中的提供SQLHelper受到一些啟發(fā),然后就寫了這么一個(gè)類似的組件(其實(shí)我谷歌了半個(gè)小時(shí)都沒有找到符合要求的基礎(chǔ)

1.什么是動(dòng)態(tài)查詢?

從多個(gè)查詢條件中隨機(jī)選擇若干個(gè)組合成一個(gè)DQL語句進(jìn)行查詢,這一過程叫做動(dòng)態(tài)查詢。

2.動(dòng)態(tài)查詢的難點(diǎn)

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

3.最終查詢語句的構(gòu)成

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

二 基本原理

1.SQL基本框架

無論查詢條件如何,查詢字段與數(shù)據(jù)庫是固定不變的,這些固定不變的內(nèi)容構(gòu)成SQL語句的基本框架,如

select column... from table。

2.StringBuilder形成DQL

獲取表單輸入,如果請求參數(shù)非空,根據(jù)該請求參數(shù)生成查詢條件,如“name=?”,“age>?”,將查詢條件追加到基本框架中。利用StringBuilder來追加查詢條件,這時(shí)出現(xiàn)一個(gè)問題,怎么判斷生成的查詢條件中是否需要添加“and”?
如果該查詢條件是第一個(gè)查詢條件,不需要添加"and",否則需要添加“and”。問題變得復(fù)雜起來,每一次生成查詢條件時(shí)都需要判斷前面是否存在查詢條件。
我們可以考慮在SQL基本框架中添加一個(gè)查詢條件,該查詢條件的存在不影響查詢結(jié)果,只充當(dāng)占位角色,避免動(dòng)態(tài)添加查詢條件時(shí)判斷是否需要添加“and”。根據(jù)這些要求,這一查詢條件必須恒為真,這里我們?nèi) ?=1”,SQL基本框架就變成了

select column...from table where 1=1

每一個(gè)動(dòng)態(tài)查詢條件前段都添加“and”。

3.List集合為占位符賦值

有了DQL語句,接著需要考慮怎么為占位符賦值?梢栽谏刹樵儣l件的同時(shí),將占位符對應(yīng)的參數(shù)收集起來,存入一個(gè)有序集合中,這里選擇List集合,這樣占位符就與List集合中的元素形成了順序上的對應(yīng)關(guān)系,第n個(gè)占位符對應(yīng)第n個(gè)元素,遍歷集合就可以為占位符賦值了。
為占位符賦值時(shí),不僅僅需要將數(shù)據(jù)傳遞給占位符,還需要選擇與字段一致的數(shù)據(jù)類型,List集合僅僅存儲(chǔ)數(shù)據(jù)已經(jīng)不能夠滿足要求了,還需要添加字段信息,以區(qū)分不同的字段,選擇不同的數(shù)據(jù)類型。這里集合中的元素采用“column+data”的形式。

三 Demo

1.數(shù)據(jù)庫

JDBC是如何實(shí)現(xiàn)動(dòng)態(tài)查詢的?

2.頁面

<!DOCTYPE html><html><head><meta charset="UTF-8"><style>span {display: inline-block;width: 75px;margin-bottom: 15px;}</style><title>動(dòng)態(tài)查詢</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>

JDBC是如何實(shí)現(xiàn)動(dòng)態(tài)查詢的?

3.服務(wù)器端(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"查詢?yōu)榭?quot;+ "<br>" +   (str ==    str.equals(""    Connection getConnection() "com.mysql.jdbc.Driver" DriverManager.getConnection("jdbc:mysql://localhost:3366/test01", "root", "123"

以上就是JDBC是如何實(shí)現(xiàn)動(dòng)態(tài)查詢的?的詳細(xì)內(nèi)容,更多請關(guān)注php中文網(wǎng)其它相關(guān)文章!


學(xué)習(xí)教程快速掌握從入門到精通的SQL知識。