Из вопроса не ясно, что именно вас здесь удивляет.Я полагаю, что то, что вы находите странным, это заполнитель ?
в 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-инъекциях .