![](/img/trans.png)
[英]Java/ JDBC – Multi Parameter Search Using JDBC PreparedStatement
[英]Java/ JDBC – Multi Parameter Search Best Practice
我正在使用以下代碼從關系數據庫生成搜索結果,具體取決於基於Web的客戶端的多個(可選)搜索參數。
目前我使用的是“ java.sql.Statement
”實現的功能,但我需要使用“能夠得到同樣的java.sql.PreparedStatement
,以防止SQL注入”。
讓我知道更改代碼的最佳做法
例如
來自基於Web的客戶端的用戶輸入。
SQL模式的偽代碼取決於搜索參數,如下所示
IF (WITHOUT ANY SEARCH PARAMETER){
SELECT * FROM TEST_TABLE;
}
ELSE IF(WITH param1){
SELECT * FROM TEST_TABLE WHERE COLUMN1= param1;
}
ELSE IF(WITH param1 & param2){
SELECT * FROM TEST_TABLE WHERE COLUMN1= param1 AND COLUMN2= param2
}
SO ON
………
以下是我的EJB中的Java代碼片段
/*
NOTE : Hashtable pSearchParam is a method parameter
*/
Connection cnBOP = null;
Statement stmt = null;
StringBuffer sb = new StringBuffer("");
try {
cnBOP = jdbcBOP.getConnection(); // DataSource jdbcBOP
stmt = cnBOP.createStatement();
/* ######################## SQL BODY ######################################*/
sb.append("SELECT COLUMN1, COLUMN2, DATE_COLUMN ");
sb.append("FROM TEST_TABLE ");
/* ######################## SQL WHERE CLAUSE ##############################*/
if(pSearchParam.size()>=1){
sb.append("WHERE ");
Enumeration e = pSearchParam.keys();
int count =0;
while(e.hasMoreElements()){
if (count >=1) sb.append("AND ");
String sKey = (String) e.nextElement();
if (sKey.equals("param1")) sb.append ("COLUMN1 ='"+pSearchParam.get(sKey)+"' ");
else if (sKey.equals("param1")) sb.append ("COLUMN2 ='"+pSearchParam.get(sKey)+"' ");
else if (sKey.equals("dateParamFr")) sb.append ("DATE_COLUMN >= TO_DATE('"+pSearchParam.get(sKey)+" 00:00:00','DD/MM/YYYY HH24:MI:SS') ");
else if (sKey.equals("dateParamTo")) sb.append ("DATE_COLUMN <= TO_DATE('"+pSearchParam.get(sKey)+" 23:59:59','DD/MM/YYYY HH24:MI:SS') ");
count ++;
}
}
/* ######################## SQL ORDER BY CLAUSE ############################*/
sb.append("ORDER BY DATE_COLUMN DESC");
ResultSet rs = stmt.executeQuery(sb.toString());
代替
sb.append ("COLUMN1 ='"+pSearchParam.get("param1")+"' ");
你將不得不做
sb.append ("COLUMN1 = ? ");
然后在創建語句之后
stmt.setString(1, pSearchParam.get("param1"));
這僅用於第一個參數,您需要對所有語句執行此操作並枚舉其中的索引
setString(int index, String param);
請注意,您將需要對int,long,Date等使用其他方法
取決於您的數據庫引擎,您可以使用SQL函數,例如
isnull(value,valueIfNull)
例如在MSSQL中
select * from Order where storeId = isnull(?,storeId)
Java代碼中的下一個
preparedStatement.setNull(1,java.sql.Types.INTEGER)
如果您需要從過濾器中忽略此參數,或者,
preparedStatement.setInt(1,20)
如果需要查找所有storeId = 20的訂單
這確實看起來像是休眠標准查詢的工作 ...
Criteria是一種簡化的API,用於通過組合Criterion對象來檢索實體。 對於諸如“搜索”屏幕之類的功能而言,這是一種非常方便的方法,其中在結果集上放置了可變數量的條件。
您正在使用Hibernate嗎? 然后,您可以使用條件API 。 否則,您可以看看SqlBuilder工具來根據條件生成SQL。
另外,您應該使用標記“?” 而不是實際值。
所以這個查詢應該是這樣的。
SELECT * FROM TEST_TABLE WHERE COLUMN1= ?;
然后,您可以使用PreparedStatement設置此列的值。 這里是使用PreparedStatement的入門教程。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.