栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

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

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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
       *
    FROM
        a_table
    WHERe
        id=#{id}     

当使用${}占位符时:
  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
        
    FROM
        pms_album
    WHERe
        ${where}



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1035110.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号