Mybatis中#{}与${}的占位符区别(无废话+易懂演示)

Mybatis的#{}${}格式的占位符区别

当使用#{}占位符时:

  1. SQL语句会进行预编译处理

    select * from a_table where id=#{id}
    相当于先编译问号前面的语句,当正式执行时,再传入值到问号中执行。
    select * from a_table where id=?
    

    预编译:不代入值的情况下,执行编译,后续执行时再将值代入

  2. 不存在SQL注入的问题

因为使用#{}占位符时,SQL语句会进行预编译处理,sql语义已经确定,只是留了一个位置等待参数传进去。最后传进去的值会直接运行。就相当于方法传参。

  1. #{}格式的占位符只能表示某个值,不能表示SQL语句中的某个片段,

    预编译必须语义正确才能成功,已经预编译后,执行时再将值代入

  2. 不需要关注参数值的数据类型

使用#{}占位符时:

<select id="getStandardById" resultMap="StandardResultMap">
    SELECT
       *
    FROM
        a_table
    WHERE
        id=#{id}     
</select>

当使用${}占位符时:

  1. 会先将值拼接到SQL语句中,再执行编译相关流程

    相当于String字符串提前拼接成的sql语句,放到数据库中执行

  2. 存在SQL注入的风险

    就相当于String字符串拼接后再执行,sql语义在拼接时有可能被改变

  3. ${}格式的占位符可以表示SQL语句中的任何片段,不仅仅只是某个值而已,只需要保证将值代入后拼接得到的SQL语句是合法的即可

    SELECT
       *
    FROM
      a_table
    WHERE
        ${where}    <=传入的参数直接拼接,比如传入where id=1 或者where name='jack' 比较灵活
    
  4. 但是,对于非数值类型(字符串、时间等)的值,需要使用一对单引号框住参数值

拼接的sql语句,必须满足sql语法

当使用${}占位符时:

<select id="testGet" resultMap="StandardResultMap">
    SELECT
        <include refid="StandardQueryFields"/>
    FROM
        pms_album
    WHERE
        ${where}
</select>
<!-- List<AlbumStandardVO> testList(
        @Param("offset") Integer offset, @Param("count") Integer count); -->
<select id="testList" resultMap="StandardResultMap">
    SELECT
        <include refid="StandardQueryFields"/>
    FROM
        pms_album
    ORDER BY
        id
    LIMIT
        ${offset}, ${count}
</select>
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

别来无恙blwy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值