web-dev-qa-db-ja.com

$ vs#を使用する場合

$ vs #の使用について混乱しています。このガイドは見つかりませんでした。私はそれらを
name = #{name}name like '%${Word}%'order by name ${orderAs}where name = #{Word}
時々、これらは正常に機能しますが、時々、パラメータが含まれていないか、

org.Apache.ibatis.reflection.ReflectionException:「name」という名前のプロパティのゲッターはありません.......

それで、いつ$または#を使用するかを知りたいですか?

19
Cataclysm

myBatisガイドライン#{}は、SQLステートメントで使用されます。

セクション Mapper XML Files でMyBatisリファレンスのいずれかを見ると、明示的に述べています:

パラメーター表記に注意してください。

#{id}

さもないと ${}

1-構成 プロパティ

例えば:

<properties resource="org/mybatis/example/config.properties">
  <property name="username" value="dev_user"/>
  <property name="password" value="F2Fa3!33TYyg"/>
</properties>

次に、プロパティを次のように使用できます。

<dataSource type="POOLED">
  <property name="username" value="${username}"/>
  <property name="password" value="${password}"/>
</dataSource>

2-文字列の置換${}パラメータセクション ):

デフォルトでは、#{}構文を使用すると、MyBatisはPreparedStatementプロパティを生成し、PreparedStatementパラメーター(?など)に対して安全に値を設定します。これはより安全で、高速で、ほぼ常に好まれますが、SQLステートメントに変更されていない文字列を直接挿入したい場合があります。たとえば、ORDER BYの場合、次のようなものを使用できます。

ORDER BY $ {columnName}

ここでは、MyBatisは文字列を変更またはエスケープしません。

注ユーザーからの入力を受け入れ、この方法で変更されていないステートメントに入力することは安全ではありません。これは潜在的なSQLインジェクション攻撃につながるため、これらのフィールドへのユーザー入力を許可しないか、常に独自のエスケープとチェックを実行する必要があります。

したがって、name like '%${Word}%' ororder by name $ {orderAs} `準備されたステートメントではなく、文字列置換を使用する必要があります。

24
Pau