さて、開発を始めてからほぼ 1 年が経ちました。いつも他の人のブログは読んでいるけど、書くのがめんどくさいし、ブログの書き方も分からないので、今日からゆっくりブログの練習を始めてみましょう。少し前に私の会社でこの問題に遭遇しました。
1. 例
select * from user where name = "dato"; select * from user where name = #{name}; select * from user where name = '${name}';
通常の状況では、ここでの違いには気づきません。これらの SQL は、dato という名前のユーザーにクエリを実行するという目的を達成できるためです。
2. 違い
動的 SQL は mybatis の強力な機能の 1 つであり、mybatis が他の ORM フレームワークよりも優れている重要な理由です。 mybatis は SQL ステートメントをプリコンパイルする前に、SQL を動的に解析して BoundSql オブジェクトに解析し、そこで動的 SQL も処理されます。動的 SQL 解析段階では、#{ } と ${ } は異なる動作をします。
select * from user where name = #{name};
#{} は動的解析中にパラメータ マーカーに解析されます。つまり、解析後のステートメントは次のとおりです:
select * from user where name = ?;
その後、${} を使用すると、動的解析中に String 文字列として渡したパラメータが
select * from user where name = '${name}';
${} によって埋められます。このステートメントは次のステートメントになります。
select * from user where name = "dato";
プリコンパイル前の SQL ステートメントには変数が含まれず、完全な定数データになります。これは、変数のない通常の SQL と同等です。
要約すると、${ } 変数の置換ステージは動的 SQL 解析ステージにあり、#{ } 変数の置換ステージは DBMS 内にあります。
これが #{} と ${} の間に見られる主な違いです。さらに、次の違いもあります:
メソッドは非常に大きくなる可能性がありますSQLインジェクションをある程度防ぐ。
$ メソッドでは SQL インジェクションを防ぐことはできません。
$ メソッドは通常、テーブル名などのデータベース オブジェクトを渡すために使用されます。
通常、次の場合は $ を使用しないでください。
そのため、mybatis を使用するときは、# メソッドを使用するようにしています。 ! !これは誰もが注意すべき点です。
推奨チュートリアル: 「Java チュートリアル 」
以上がJava Mybatis の ${ } と #{ } の違いの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。