簡體   English   中英

Java SQL查詢准備語句動態參數

[英]Java SQL query prepare statement dynamic parameter

我使用帶有可能在查詢中存在或不存在的參數的java來進行sql查詢。

例如,http請求參數為:

  1. 名稱
  2. 開始
  3. 限制

在jsp中,我做了這樣的事情。

if (request.getParameter("query") != null) {        
  query = request.getParameter("query"); 
}

if (request.getParameter("start") != null) {
  start = Integer.parseInt(request.getParameter("start"));  
}

if (request.getParameter("limit") != null) {
  limit = Integer.parseInt(request.getParameter("limit"));  
}

....

if (query != null) {
  sql += " AND dbo.TABLENAME.namelike '%?%'";
}

if (start != null) {
  sql += " AND RowNum >= ?";
}

if (limit != null) {
  sql += " AND RowNum <= ?";
  if (start == null) 
    start =0;
}

有什么簡單的方法可以使用PreparedStatement做到這一點? 還是有任何更清潔的方法來做到這一點。 如果我沒有記錯,則必須在准備好的語句中首先指定SQL字符串,而不能在后面指定。

在您的特定情況下,您應該可以執行以下操作

sql += "AND dbo.TABLENAME.namelike '%?%' AND RowNum >= ? AND RowNum <= ?";

如果沒有開始,則可以將RowNum設置為0,如果沒有結束,則可以將RowNum設置為Integer.MAX_INTEGER。 另外,如果沒有傳遞任何查詢,則無論如何它將返回所有內容。

但是,這效率很低,因此您可以使用CASE語句嘗試使其更有效。

嘗試使用SQL標記。 JSTL提供此sql標記,因為您只能使用JSP。 它是Java EE標准的一部分。

這比在jsp中編寫Java代碼更加干凈和容易。

鏈接在這里。 http://download.oracle.com/javaee/1.4/tutorial/doc/JSTL7.html

希望能幫助到你!

為了在沒有框架幫助的情況下使其更整潔,您可以在示例中使用-和不使用分頁參數來對單獨的查詢進行外部化,然后將它們放在屬性文件中,例如querys.properties:

query.paging=SELECT * FROM dbo.TABLENAME WHERE namelike ? AND RowNum >= ? AND RowNum <= ?
query.nopaging=SELECT * FROM dbo.TABLENAME WHERE namelike ?

然后在您的代碼中區分用例並訪問適當的查詢:

ResourceBundle queries = ResourceBundle.getBundle("queries");

String nameLike = request.getParameter("nameLike");
String startRow= request.getParameter("startRow");
String endRow= request.getParameter("endRow");

if (nameLike == null) {        
    nameLike = ""; // or you could report an error here
}

Connection connection = ...get a JDBC Conection...

PreparedStatement st;
if (startRow != null && endRow != null) {
    st = connection.prepareStatement(queries.get("query.paging"));
    st.setString(1, nameLike);
    st.setString(2, startRow);
    st.setString(3, endRow);
}
else {
    st = connection.prepareStatement(queries.get("query.nopaging"));
    st.setString(1, nameLike);
}

使用PreparedStatement可以避免SQL注入攻擊的安全風險。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM