1

我有以下问题,当我将 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);

如果我'自己放:

 def query = "INSERT INTO TAB_A (F_A, F_B) VALUES ('${value4fa}', ${value4fb})"

Groovy 通知我引入了一个安全漏洞,因为 Groovy 不能使用 PreparedStatement 来执行 SQL 查询。

谁能解释我如何强制 Groovy 正确评估查询主体并准备变量?

4

2 回答 2

5

您不必用任何东西来装饰字符串以使其PreparedStatement自动转换为。

sql.execute("INSERT INTO TAB_A (F_A, F_B) VALUES ($value4fa, $value4fb)")

将对所有接受 aGString作为单个参数的方法执行正确的操作。注意缺少{}which 是语法糖.toString()

你引起投诉的原因是,

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

GString直接传递给方法不同。

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

这在功能上等同于 usingString.format()StringBuilder/Buffer.append()简单的串联 using +

于 2016-03-02T20:19:12.817 回答
-2

我没有测试过这个想法,但是 2.4.4 的代码在这里

execute(String sql, List<Object> params)方法使用准备好的语句。

鉴于此,请考虑以下示例:

firstName = "yue"
lastName = "wu"
sql.execute("insert into people (firstName, lastName) "+
  " values (?,?)", [firstName, lastName])

如有必要,很容易将单引号添加到变量本身(而不是 SQL 字符串)。

于 2010-11-09T10:59:33.613 回答