В целях отладки я создал построитель запросов SQL из подготовленного оператора, я не уверен, что мой построитель запросов обрабатывает все крайние случаи и / или использует лучшие практики:
- Просто замените все
?
значения:
var argIndex = -1
sql
.map { token: String =>
if (token.contains("?")) {
argIndex = argIndex + 1
token.replace("?", s"'${args(argIndex).toString}'")
} else {
token
}
}
.dropWhile(_.trim.isEmpty)
.mkString("\n ")
Создайте его, попытавшись проанализировать несколько крайних случаев:
val where = "WHERE "
val splitSql_1 = sql.split(where).toList
val countOfQuestionMarksInSql = "[?]".r.findAllIn(sql).length
if (countOfQuestionMarksInSql > args.size) {
println("The query parsing could go wrong. Do not match.")
} else {
if (splitSql_1.size > 1) {
val prologue = splitSql_1(0)
val chapters = splitSql_1(1)
val characters = chapters.split("[?]").toList
if (characters.nonEmpty) {
var finale = ""
if (characters.length > args.length) {
finale = s"${characters.last}"
}
val arcs = (characters zip args.map(arg => s"'${arg.toString}'"))
.map {input =>
val (fieldWithCond: String, value: String) = input
s"$fieldWithCond $value"
}.mkString(", ")
println(s"$prologue $where $arcs $finale")
// prologue + where + arcs + finale
} else {
println("This is a hardcoded query")
}
} else {
println("This is a query without a condition")
println(sql)
}
}
Положитесь на подготовленный оператор и замените
?
на
value
и напечатайте
string
Похоже, мы не можем получить экземпляр PreparedStatement
без базы данныхподключение.Это в журнале, который не имеет доступа к соединению с базой данных.
Есть ли лучший способ сделать это?Можем ли мы использовать SqlParser
для достижения этого или создать фиктивное PreparedStatement, которое анализирует запрос, но не требует подключения?
Я смотрел на JSqlParser
, который заменяет значения в SQL-запросах на ?
значения.