zoukankan      html  css  js  c++  java
  • mybatis中#和$的区别

    在mybatis接口mapper文件中引用传入的参数是通过#{param}或者${param}来使用的。

    1.数据类型匹配

    #:会进行预编译,而且进行类型匹配

    $:不进行数据类型匹配

    2.实现方式 

    #:用于变量替换

    $:实质上是字符串拼接

    3.#和$的使用场景

    (1)变量的传递,必须使用#,使用#{}就等于使用了PrepareStatement这种占位符的形式,提高效率。可以防止sql注入等等问题。#方式一般用于传入添加,修改的值或查询,删除的where条件 id值

    select * from t_user where name = #{param}

    (2)$只是只是简单的字符串拼接,要特别小心sql注入问题,对应非变量部分,只能用$。$方式一般用于传入数据库对象,比如这种group by 字段 ,order by 字段,表名,字段名等没法使用占位符的就需要使用${}

    select count(*), from t_user group by ${param}

    (3)能同时使用#和$的时候,最好用#。

    sql注入问题:

    SQL注入就是将原本的SQL语句的逻辑结构改变,使得SQL语句的执行结果和原本开发者的意图不一样.

    比如:使用Statement语句执行者,执行sql,会造成sql注入的问题,

    String sql = "select * from tb_name where name= '"+varname+"' and passwd='"+varpasswd+"'";

    如果我们把[' or '1' = '1]作为varpasswd传入进来,执行查询的时候 sql会变成,

    String sql = "select * from tb_name where name= '' and passwd = '' or '1' = '1',1=1是永远成立的,所以,前面的条件已经不起作用,

    我们使用预编译语句执行者就可以避免这个问题,prepareStatement将sql预编译,传参数的时候,不会改变sql语句结构,就可以避免注入。

  • 相关阅读:
    17. Letter Combinations of a Phone Number
    16. 3Sum Closest
    15. 3Sum
    14. Longest Common Prefix
    13. Roman to Integer
    12. Integer to Roman
    11. Container With Most Water
    10. Regular Expression Matching
    9. Palindrome Number
    8. String to Integer (atoi)
  • 原文地址:https://www.cnblogs.com/huangjinyong/p/9375717.html
Copyright © 2011-2022 走看看