違い
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インジェクションに注意することを思い出させます。