![](/img/trans.png)
[英]Passing array parameter in prepare statement - getting “java.sql.SQLFeatureNotSupportedException”
[英]Java SQL query prepare statement dynamic parameter
我使用帶有可能在查詢中存在或不存在的參數的java來進行sql查詢。
例如,http請求參數為:
在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.