簡體   English   中英

Java / JDBC –多參數搜索最佳實踐

[英]Java/ JDBC – Multi Parameter Search Best Practice

我正在使用以下代碼從關系數據庫生成搜索結果,具體取決於基於Web的客戶端的多個(可選)搜索參數。

目前我使用的是“ java.sql.Statement ”實現的功能,但我需要使用“能夠得到同樣的java.sql.PreparedStatement ,以防止SQL注入”。

讓我知道更改代碼的最佳做法


例如

來自基於Web的客戶端的用戶輸入。

  • param1-可選
  • param2-可選
  • dateParamFr-可選
  • dateParamTo-可選

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.

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