2012-09-14 18 views
14

我使用在Java中使用事先準備好的聲明,並綁定變量以便能夠通過與JDBC驅動程序

  1. 的JdbcTemplate做出一個MySQL數據庫
  2. 準備語句JDBC連接來保護自己儘可能從SQL可能注入攻擊
  3. 在需要接受來自用戶的請求發送到任何一打的排序數據
  4. 不同列
  5. 下面的語句

    jdbcTemplate.query("SELECT * FROM TABLE1 ORDER BY ? ?", colName, sortOrder); 
    

當然這不起作用,因爲變量綁定不應該指定列名稱只是查詢中表達式的參數值。

那麼......人們怎麼解決這個問題呢?只是在Java代碼中進行排序似乎是一個簡單的解決方案,但是因爲我得到了一個用於排序的列的變量字符串,並且有一個變量告訴我排序順序....這是一個比較難看的比較條件蓋。這似乎是它應該是一個共同的模式來解決這一個共同的問題...

回答

16

佔位符?只能用於參數值,不能用於列和排序順序方向。因此,標準的做法是指出例如here的作用是使用String#format()或類似的東西將您的列名稱和順序值附加到您的查詢中。

另一種選擇是使用Spring Data JPA,您可以將您的方法作爲參數提供給類型爲Sort的實例,該實例可以包含數據庫進行排序所需的所有信息。

2

我只想拼接列名和順序的SQL查詢,但只有在

  1. 覈實該列名稱和順序在此上下文中有效。
  2. 消毒他們以對付任何企圖SQL Injection攻擊。

我覺得這比將結果提取到應用程序層並在這裏排序比較有效。

+0

你能回答嗎?同樣的問題:http://stackoverflow.com/questions/42627074/checking-if-values-is-in-database-with-springboot-exactly-once-called – 2017-03-06 18:37:45

相關問題