MyBatisの#と$の違い
1。#すべての着信データを文字列として扱い、自動化するデータに二重引用符を追加します。たとえば、#user_id#で注文、渡された値が111の場合、sqlにパージするときの値は「111」で注文します。渡された値がIDである場合、SQLに解析された値は「ID」によって順序です。
2。$渡されたデータを直接表示し、SQLで生成します。たとえば、$ user_id $で注文します。渡された値が111の場合、sqlに解析されたときの値はuser_idによって順序です。渡された値がIDである場合、SQLに解析された値はIDで順序です。
3.#メソッドは、SQL注入を大幅に防ぐことができます。
4. $メソッドはSQL注入を防ぐことはできません。
5。$メソッドは、一般に、テーブル名を渡すなど、データベースオブジェクトを渡すために使用されます。
6.一般的に、#を使用できる場合は、$を使用しないでください。
SQL注入を防ぎます
注:sqlステートメントをselect * from t_stuから書いてはいけません。ここで、s_nameは「%$ name $%」のように、注射攻撃に対して非常に脆弱です。
フォーマット「$ {xxx}」のパラメーターは、SQLコンパイルに直接参加して、噴射攻撃を防ぎます。ただし、動的なテーブル名と列名に関しては、「$ {xxx}」などのパラメーター形式のみを使用できます。
MyBatisマッピングステートメントを書くときは、フォーマット「#{xxx}」を使用してみてください。 「$ {xxx}」のようなパラメーターを使用する必要がある場合は、SQL注入攻撃を防ぐために手動でフィルタリングを行う必要があります。
例
<sql id = "condition_where"> <isnotempty property = "companyname" prepend = "および"> t1.company_name like#companyName#</isNoTempty> </sql>
Javaコードは元のコードに似ていますが、それに問題はありません。判断nullと「%」を1つの方法にカプセル化するのが面倒だと思われる場合。
if(!stringutil.isempty(this.companyname)){table.setcompanyname( "%" + this.companyname + "%"); }上記は、MyBatisの#と$の違いとSQL注入を防ぐ方法に関する簡単な議論です。誰もがwulin.comをもっとサポートすることを願っています〜