Sql.execute中的Groovy GString - 文本变量未被'包围'并且查询失败

Ska*_*rab 1 sql groovy gstring

我有以下问题,当我将GString传递给SQL.executeInsert时,文本变量不会被自动索引,'因此插入查询失败:

String value4fa = "I would like to get know"
int value4fb = 2
def query = "INSERT INTO TAB_A (F_A, F_B) VALUES (${value4fa}, ${value4fb})"
sql.executeInsert(query);
Run Code Online (Sandbox Code Playgroud)

如果我'自己放:

 def query = "INSERT INTO TAB_A (F_A, F_B) VALUES ('${value4fa}', ${value4fb})"
Run Code Online (Sandbox Code Playgroud)

Groovy告诉我,我已经引入了一个安全漏洞,因为Groovy不能使用PreparedStatement来执行SQL查询.

任何人都可以解释我如何强制Groovy正确评估查询正文并准备变量?

小智 5

你不应该用任何东西装饰字符串以PreparedStatement自动转换它们.

sql.execute("INSERT INTO TAB_A (F_A, F_B) VALUES ($value4fa, $value4fb)")
Run Code Online (Sandbox Code Playgroud)

将为接受GString单个参数的所有方法做正确的事情.注意缺乏的{}是语法糖.toString()

你的投诉原因是,

def query = "INSERT INTO TAB_A (F_A, F_B) VALUES (${value4fa}, ${value4fb})"
sql.execute(query)
Run Code Online (Sandbox Code Playgroud)

不同于GString直接传递给方法.

传递query.execute()方法之前应用替换.根据您的示例数据,它会传递以下内容并且已经发生了替换."INSERT INTO TAB_A (F_A, F_B) VALUES (I would like to get know, 2)"这甚至不是一个有效的SQL语句,因为'它周围缺少字符串值.

这在功能上等同于使用String.format(),StringBuilder/Buffer.append()或者在连接时使用+.