2016-10-10 1 views
8

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

org.apache.ibatis.reflectionのように私にエラーを与えました。 ReflectionException:「名前」という名前のプロパティにはゲッター はありません.......

だから、私は$または#を使用する際に知りたいの?

答えて

10

myBatisのガイドラインに続いて、#{}がSQL文で使用されます。あなたが見てみる場合は

セクションでMyBatisのリファレンスのいずれかがMapper XML Filesそれが言う明示的に:

お知らせパラメータ表記:

#{id}

そうでない場合${}

のためであります

1-設定properties。例えば

<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-文字列置換${}Parameters section):デフォルトで

、使用#{}構文を使用するとMyBatisが生成されます PreparedStatementプロパティPreparedStatementパラメータ(例:)に対して値を安全に設定します。 ?)。これはより安全で速く、 がほとんど常に優先されますが、 文字列をそのままSQL文に直接挿入したい場合もあります。たとえば、ORDER BYのために、 あなたはこのようなもの使用することがあります。ここで$ {} COLUMNNAME

BY

ORDERをMyBatisのは、文字列を変更したり、逃れられないだろう。

注記ユーザーからの入力を受け入れて、この方法で修正されていない ステートメントに供給することは安全ではありません。これにより潜在的なSQL 注射攻撃につながるため、これらのフィールドにユーザー入力 を禁止するか、常に独自のエスケープとチェックを実行する必要があります。

name like '%${word}%' or $ {orderAs} `と確定しました。準備された文ではなく、文字列の置換を使用する必要があります。

+0

'name = $ {name}'、 '%#{word}% 'のような名前です。これらはOKではありません。 *#{}があなたのSQL文で使われています.... *私は理解しませんでした。私はSQL文の中でmybatis expを使っています。そうじゃない? * $ {}はJavaプロパティーのためのものです。*これらはパラメータタイプによってはバリデートされる可能性がありますか? – Cataclysm

+0

あなたが説明したガイドラインに従うためのリンクを私にサポートできますか? – Cataclysm

+0

私は私の答えを編集しました。申し訳ありませんが、明確でない場合は – Pau

関連する問題