Для целей отладки создайте строку SQL, используя строку PreparedStatement и аргументы - PullRequest
0 голосов
/ 08 марта 2019

В целях отладки я создал построитель запросов SQL из подготовленного оператора, я не уверен, что мой построитель запросов обрабатывает все крайние случаи и / или использует лучшие практики:

  1. Просто замените все ? значения:
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-запросах на ? значения.

...