mybatisの#{}と$ {}の違いを理解する

違い

1.#受信データを文字列として扱い、自動的に受信するデータに二重引用符を追加します。例:order by#user_id#、渡された値が111の場合、sqlに解析されたときの値はorder by“ 111”、渡された値がidの場合、解析されたsqlはorder by“ id”です。 SQLインジェクションを効果的に防ぐことができます。

2. $は、SQLで受信データを直接表示および生成するためのものです。例:orderbyは、受信データを直接表示し、SQLで生成します。例:orderbyuser_id $、渡された値が111の場合、SQLに解析されたときの値はuser_idによる順序になり、渡された値がidの場合、解析されたsqlはidによる順序になります。

3.#メソッドはSQLインジェクションを大幅に防ぐことができます。

4. $メソッドは、SQLインジェクションを防ぐことはできません。

5. $メソッドは通常、テーブル名などのデータベースオブジェクトを渡すために使用されます。

6.通常、#を使用できる場合は$を使用しないでください。

MyBatisで並べ替えるときに、動的パラメーターによるorder by動的パラメーターを使用する場合は注意してください。#の代わりに$を使用してください。

説明の例:

動的SQLはMyBatisの主な機能の1つであり、マッパーで定義されたパラメーターがxmlに渡された後、MyBatisはクエリを実行する前にそれらを動的に解析します。Mybatisは、動的SQLをサポートする2つの構文#{}と$ {}を提供します。

次のステートメントで、nameの値がzhangsanの場合、2つの方法に違いはありません。

select * from user where name =#{name};
select * from user where name = $ {name};
解析後の結果は次のとおりです。

select * from user where name = 'zhangsan';
ただし、#{}と$ {}はコンパイル前で異なる方法で処理されます。

#{}前処理では、パラメーター部分がプレースホルダー?に置き換えられ、次のSQLステートメントになります。

select * from user where name = ?;
and $ {}は単純な文字列置換です。動的解析段階では、sqlステートメントは次のように解析されます。

select * from user where name = 'zhangsan';
上記では、#{}パラメータの置換はDBMSで発生し、$ {}は動的分析プロセスで発生します。

では、使用中にどちらの方法を使用する必要がありますか?

答えは次のとおりです。最初に#{}を使用します。$ {}はSQLインジェクションの問題を引き起こすからです。

次の例を見てください。

select * from $ {tableName} where name =#{name}

この例では、テーブル名が

ユーザー; ユーザーを削除します。

動的分析後のSQLは次のとおりです。

ユーザーから*を選択します。ユーザーを削除します。–ここで、name = ?;

–次のステートメントはコメント化されており、元のクエリuserステートメントは、すべてのユーザー情報をクエリし、ユーザーテーブルを削除するステートメントになっています。これにより、データベースに大きな損傷が発生し、サーバーのダウンタイムが発生する可能性があります。

ただし、テーブル名がパラメーターとして渡される場合、使用できるのは$ {}のみです。これはまた、この使用法でのSQLインジェクションに注意することを思い出させます。

おすすめ

転載: blog.csdn.net/qq_41454044/article/details/114937050