簡體   English   中英

如何使用參數化查詢的方式處理SQL語句中的'IN'情況?

[英]How to handle 'IN' case in SQL Statement with the way of Parameterized Query?

為了避免在我的項目中出現SQL注入攻擊,我嘗試使用Parameterized Query方式訪問數據庫。 現在,我知道如何處理以下相同的情況(使用Spring JdbcTemplate):

String sql = "SELECT * FROM T_USER WHERE USERNAME = ? AND PASSWORD = ?"
jdbcTemplate.query(sql, 
                   new UserRowMapper(), 
                   new Object[]{"%admin%", "%password%"});

上面的代碼沒有問題,但是我不知道如何處理“ IN”情況,以下是我的情況,並且工作失敗:

String sql = 
   "SELECT * FROM T_USER WHERE USERNAME = ? AND PASSWORD = ? AND CLASS_ID IN (?)"
jdbcTemplate.query(sql, 
                   new UserRowMapper(), 
                   new Object[]{"%admin%", "%password%", "1,2,3"});

有人給我指導嗎? 非常感謝。

我認為您可以創建一個List並將其作為第三個參數傳遞。 另外,您需要在前兩列過濾器中使用LIKE代替=

List<Integer> classIds = new ArrayList<Integer>();
classIds.add(1);
classIds.add(2);
classIds.add(3);

String sql = "SELECT * FROM T_USER WHERE "+
              "USERNAME LIKE ? AND PASSWORD LIKE ? AND CLASS_ID IN (?)";
jdbcTemplate.query(sql, new Object[]{"%admin%", "%password%", classIds},
                                                         new UserRowMapper());

請注意:這是語法:

public List query(String sql, Object[] args, RowMapper rowMapper) 
             throws DataAccessException

編輯:請嘗試將namedParameterJdbcTemplate作為bwlow:

String sql = "SELECT * FROM T_USER WHERE "+
           "USERNAME LIKE :uname AND PASSWORD LIKE :passwd AND CLASS_ID IN (:ids)";
 Map<String, Object> namedParameters = new HashMap<String, Object>();
 namedParameters.put("uname", "%admin%);
 namedParameters.put("passwd", "%password%");
 namedParameters.put("ids", classIds);
 List result = namedParameterJdbcTemplate.query(sql, namedParameters, 
                                                             new UserRowMapper());

三種選擇:

  1. 為IN LIST的每個長度生成不同的JDBC查詢,並參數化每個INDIVIDUAL項目,例如此答案
  2. 對於小桌子,您可以作弊並使用LIKE語句,例如此答案
  3. 使用SPLIT函數(anti-LISTAGG)將定界列表變成每一行每一列的單獨行,並對其進行JOIN。 示例SPLIT函數
    • 您將把參數作為單個字符串參數化

暫無
暫無

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

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