#{}和${}

  • #{}是对非字符串拼接的参数占位符,如果入参是简单的数据类型,#{}里可以任意写,但如果入参是对象类型,则#{}里必须是对象的成员变量的名称,#{}可以有效的防止sql注入

    • 传参大部分使用#{}传参,它的底层使用的是PreparedStatement对象,是安全的数据库访问,防止sql注入.(只有拼字符串的才有sql注入的风险)
    • #{}里怎么写,看parameterType参数的类型

      • 如果parameterType参数的类型是简单类型(8种基本(封装)+String),则#{}里面随便写

        1. <select id="getById" resultType="users" parameterType="int"><!--入参类型是简单类型-->
        2. --随便写
        3. select * from users where id=#{zar}
        4. </select>
      • parameterType参数的类型是实体类的类型,则#{}里面只能是类中的成员变量的名称,而且区分大小写

        <insert id="insertUsers" parameterType="users"><!--入参数实体类-->
        --成员变量名称
        insert into users(username,birthday,sex,address) values(#{userName},#{birthday},#{sex},#{address})
        </insert>
        
  • ${}主要是针对字符串拼接替换,如果入参是基本数据类型,#{}解析 - 图1{}必须是对象的成员变量的名称。${}还可以替换列名和表名,存在sql注入风险,尽量少用

    • ${}字符串拼接字符串替换

      • 字符串拼接

        • 一般用于模糊查询中,建议少用,因为有sql注入的风险
        • 也分俩种情况,同样的看parameterType的类型

          • 如果parameterType的类型是简单类型${}里面随便写,但是分版本,如果是3.5.1以下的版本,只能写value

            <select id="getLikeByName" resultType="users" parameterType="string"><!--入参是简单类型-->
            --随便写
            select * from users where username like "%${name}%"
            </select>
            
          • 如果parameterType的类型是实体类的类型,则只能是类中成员变量的名称