JAVAEE regarde de près le cadre 13 - la différence entre $ et # dans Mybatis

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 $ {}

  1. Comme en condition,
  2. Le paramètre est de type int et le type du champ dans la base de données est nombre,
  3. Dans l'instruction SQL, réalisez le nom de la table dynamique
  4. 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.

Publié 78 articles originaux · loué 30 · visites 3630

Je suppose que tu aimes

Origine blog.csdn.net/ZMW_IOS/article/details/105276857
conseillé
Classement