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はPreparedStatementを使用してSQLクエリを実行できないため、セキュリティホールを導入したことを通知します。

Groovyにクエリ本文を正しく評価して変数を準備させる方法を誰かに説明してもらえますか?

4

2 に答える 2

5

PreparedStatement文字列を自動的に変換するために、文字列を何かで飾る必要はありません。

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

GStringを単一のパラメータとして受け入れるすべてのメソッドに対して正しいことを行います。糖衣構文が不足していることに注意してください{}.toString()

あなたが苦情を申し立てる理由は、

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

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()またはを使用して連結する場合はプレーン+です。

于 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 に答える