大家好,好朋友们
我最近了解了the importance of bind parameters in sql queries for optimization。
我在DSL设置中使用kotlin-exposed,当我遵循basic query example时,如下所示:
TExportJobs
.select { TExportJobs.id eq request.id.toInt() }.firstOrNull()打印的查询不使用绑定参数:
SELECT export_jobs.id, ... FROM export_jobs WHERE export_jobs.id = 4是在幕后使用绑定参数暴露的吗?我的设置可能没有正确格式化吗?
下面是我的示例表对象:
object TExportJobs: IntIdTable("export_jobs") {
val userEmail = varchar("user_email", 128).index()
}发布于 2021-08-11 16:28:09
找到了!
sqlLogger接口(org.jetbrains.exposed.sql.SqlLogger)使用来自(org.jetbrains.exposed.sql.statements.StatementContext) sqlLogger的expandArgs方法来替换'?‘参数。
所以这是在幕后进行的。
buildString {
val quoteStack = Stack<Char>()
var lastPos = 0
for (i in 0..sql.length - 1) {
val char = sql[i]
if (char == '?') {
if (quoteStack.isEmpty()) {
append(sql.substring(lastPos, i))
lastPos = i + 1
val (col, value) = iterator.next()
append(col.valueToString(value))
}
continue
}
if (char == '\'' || char == '\"') {
if (quoteStack.isEmpty()) {
quoteStack.push(char)
} else {
val currentQuote = quoteStack.peek()
if (currentQuote == char)
quoteStack.pop()
else
quoteStack.push(char)
}
}
}
if (lastPos < sql.length)
append(sql.substring(lastPos))
}https://stackoverflow.com/questions/68745769
复制相似问题