簡體   English   中英

使用ScalikeJDBC進行SQL插值

[英]SQL interpolation with ScalikeJDBC

我嘗試使用庫ScalikeJDBC( 此處 )重現SQL插值的示例。

val member = sql"select id, name from members where id = ${id}"
println(member.statement)

但是我得到一個奇怪的結果:

select id, name from members where id = ?

我錯過了什么?

編輯和回答:

Mea culpa,我嘗試調試為什么我的sql查詢不能與字符串interpolaiton一起使用,所以我打印了查詢的值。 我得到了這個結果,但是我沒有檢查是否還可以。 問題是我必須對要用於插值的字符串使用SQLSyntax.createUnsafely

從這個問題尚不清楚,您在這里究竟發現了什么驚奇。 我想您覺得很奇怪的是? statement占位符。 被引用的文章使用占位符顯示了完全相同的查詢,甚至明確提到了它的原因:

不用擔心,此代碼已受到SQL注入攻擊的安全保護。 ${id}將是一個占位符。

如果查看SQL的源,它是sql""插值的所有結果的基礎,則可能會在其中看到兩個字段:

val statement: String,
private[scalikejdbc] val rawParameters: Seq[Any]

還有

  final lazy val parameters: Seq[Any] = rawParameters.map {
    case ParameterBinder(v) => v
    case x => x
  }

這樣做是為了不重新在庫中實現棘手的SQL轉義邏輯。 而是使用標准java.sql.PreparedStatement來做到這一點。 這就是為什么將查詢字符串解析為占位符查詢和單獨的參數列表的原因。

PS:如果不清楚為什么必須使用某種形式的轉義來避免SQL注入,或者不清楚SQL注入的壞處,那么您可能應該閱讀有關SQL注入的更多信息。

暫無
暫無

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

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