ホームページ  >  記事  >  Java  >  Java Mybatis の ${ } と #{ } の違い

Java Mybatis の ${ } と #{ } の違い

Guanhui
Guanhui転載
2020-07-21 13:00:453625ブラウズ

Java Mybatis の ${ } と #{ } の違い

さて、開発を始めてからほぼ 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 サイトの他の関連記事を参照してください。

声明:
この記事はjb51.netで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。