MyBatisの#{}と$ {}の違い、および$ {}に関する別の問題

以前にMyBatisを使用したことがなかった場合、JDBCを直接作成するにはStatement andPrepareを使用していました。PrepareStatementは、StatementのSQLインジェクションの問題を回避できます。これ?回避する方法は、$ {}と#{}が同様の状況であるプレースホルダーとして使用することです。

比較のために2つの例を示します。

对于 select * from user where id=#{
    
    }
传入参数 1001
实际SQL select * from user where id='1001'
    
对于 select * from user where id=${
    
    }
传入参数 1001
实际SQL select * from user where id=1001

前述のように、SQLインジェクションを防ぐためにPrepareStatementを使用し、ここではSQLインジェクションを防ぐために#{}も使用します。

假如我们在程序中写这样的SQL 
String sql = "select * where name= ' "+name+" ' "
传入参数 name = " 'or 1=1 '"
最终的SQL结果
    select * where name= ' ' or '1=1'

$ {}を使用します:

ここに画像の説明を挿入します

このようにして、クエリ条件(–はSQLコメント)をスキップして、すべての結果を直接取得できます。PrepareStatementと#{}を使用すると、この状況を回避できます。パラメーターを文字列に渡し、引用符を直接追加します。

使用する#{}:

ここに画像の説明を挿入します

ただし、order by、like、および受信テーブル名を使用する場合は、引用符で囲むことができないため、$ {}を使用する必要があります。


上記の説明はインターネット上の他の場所と同様です。以下は、テスト中に発生した別の問題です。

MyBatisのデータソースを構成するときは、ドライバー、URL、その他のパラメーターを環境タグに直接書き込むか、適切なタグを使用してdatabase.propertiesに構成をインポートします(プロパティタグに直接プロパティを書き込むこともできます)。

mybatis-config.xml

ここに画像の説明を挿入します

databse.properties
ここに画像の説明を挿入します

UserMapper.java
ここに画像の説明を挿入します

UserMapper.xmlでSQLを記述し、使用される変数名がusername1またはusername2である場合、これはpropertiesタグのプロパティ名と同じです。$ {username1}を介して最初に取得されるのは、私たちではなくプロパティです。エンティティクラスUserが渡されました。
ここに画像の説明を挿入します

おすすめ

転載: blog.csdn.net/qq_39763246/article/details/114653959