web-dev-qa-db-fra.com

Quand utiliser $ vs #?

Je suis confus quant à l'utilisation de $ vs #. Je n'ai trouvé aucun guide pour cela. Je les ai utilisés comme
name = #{name}, name like '%${Word}%', order by name ${orderAs}, where name = #{Word}
Parfois, cela fonctionne bien, mais parfois, les paramètres ne sont pas inclus ou m'ont donné une erreur comme

org.Apache.ibatis.reflection.ReflectionException: il n'y a pas de getter pour la propriété nommée 'name' .......

Je voudrais donc savoir quand utiliser $ ou #?

19
Cataclysm

Suivre les myBatis directives #{} est utilisé dans vos instructions sql.

Si vous jetez un œil à l'une des références MyBatis dans la section Mapper XML Files , il est dit explicitement:

Remarquez la notation des paramètres:

#{id}

Autrement ${} est pour

1- Configuration propriétés .

Par exemple:

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

Ensuite, les propriétés peuvent être utilisées comme suit:

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

2- Substitution de chaîne ${} ( section Paramètres ):

Par défaut, l'utilisation de la syntaxe # {} obligera MyBatis à générer des propriétés PreparedStatement et à définir les valeurs en toute sécurité par rapport aux paramètres PreparedStatement (par exemple?). Bien que cela soit plus sûr, plus rapide et presque toujours préféré, vous souhaitez parfois simplement injecter directement une chaîne non modifiée dans l'instruction SQL. Par exemple, pour ORDER BY, vous pouvez utiliser quelque chose comme ceci:

COMMANDER PAR $ {columnName}

Ici, MyBatis ne modifiera ni n'échappera à la chaîne.

REMARQUE Il n'est pas sûr d'accepter les entrées d'un utilisateur et de les fournir à une instruction non modifiée de cette manière. Cela conduit à des attaques par injection SQL potentielles et vous devez donc soit interdire l'entrée utilisateur dans ces champs, soit toujours effectuer vos propres échappées et vérifications.

Donc définitivement dans name like '%${Word}%' ororder by name $ {orderAs} `vous devez utiliser la substitution de chaîne et non une instruction préparée.

24
Pau