以前に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が渡されました。