La différence entre $ et # dans MyBatis
1. Description du problème
Dans le passage dynamique des paramètres de mybatis, nous pouvons utiliser # {} pour passer des paramètres en privé, ou utiliser $ {} pour passer des paramètres. Quelle est la différence entre eux?
Si l'instruction sql dans mybatis utilise une requête conditionnelle, une erreur sera signalée lors de l'utilisation de $ {}, pourquoi?
2. Exemples
2.1: Méthode d'interface UserDao
//根据字符串usernames,查询所有的User信息
public List<User> findByNames(@Param("usernames") String usernames) throws Exception;
2.2: Appelez cette méthode
public class MybatisTest {
@Test
public void test01() throws Exception {
InputStream is = Resources.getResourceAsStream("SqlMapconfig.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
SqlSession sqlSession = sqlSessionFactory.openSession();
UserDao userDao = sqlSession.getMapper(UserDao.class);
//假设参数是 'lucy','tom'
String usernames = "'lucy','tom'";
List<User> list = userDao.findByNames(usernames);
System.out.println(list);
}
}
2.3: Configuration dans le fichier de configuration (mapping)
2.3.1 Utilisez # {}
① Modifier les paramètres xml
<mapper namespace="com.ittest.dao.UserDao">
<!--根据字符串usernames,查询所有的User信息-->
<select id="findByNames" resultType="com.ittest.domain.User" >
select * from user where username in (#{usernames})
</select>
</mapper>
② Exécuter la méthode de test delete test01 ()
③ Afficher le journal d'exécution
DEBUG *** ==> Preparing: select * from user where username in (?)
DEBUG *** ==> Parameters: 'lucy','tom'(String)
DEBUG *** ==> Total: 0
④ Conclusion
# {} Une fois la pré-compilation terminée, est-elle devenue un espace réservé?, Peut empêcher les attaques SQL
2.3.2 Utilisation de $ {}
① Modifier les paramètres xml
<mapper namespace="com.ittest.dao.UserDao">
<!--根据字符串usernames,查询所有的User信息-->
<select id="findByNames" resultType="com.ittest.domain.User" >
select * from user where username in (${usernames})
</select>
</mapper>
② Exécuter la méthode de test delete test01 ()
③ Afficher le journal d'exécution
DEBUG *** ==> Preparing: Preparing: select * from user where username in ('lucy','tom')
DEBUG *** ==> Parameters:
DEBUG *** ==> Total: 2
[User{id=1, username='lucy', password='123'}, User{id=2, username='tom', password='123'}]
④ Conclusion
$ {} Remplacera simplement la valeur du paramètre à la position correspondante de l'instruction SQL. Impossible d'empêcher l'attaque SQL
3. Supplément
3.1 La scène de $ {}
- Comme en condition,
- Le paramètre est de type int et le type du champ dans la base de données est nombre,
- Dans l'instruction SQL, réalisez le nom de la table dynamique
- trier par $ {}, trier dynamiquement les champs
3.2 Inconvénients de $ {} (sérieux)
$ {} Impossible d'empêcher les attaques SQL
Exemples de paramètres:
Instruction SQL: sélectionnez * dans $ {tablename}
Valeur de paramètre: produit, produit de baisse;
Vos données de surveillance seront alors supprimées en silence.