首页 > 其他分享 >Mybatis中的${}和#{}区别(转载)

Mybatis中的${}和#{}区别(转载)

时间:2022-11-18 21:34:55浏览次数:65  
标签:解析 name 区别 SQL user sql Mybatis 转载 id

动态 sql 是 mybatis 的主要特性之一,在 mapper 中定义的参数传到xml中之后,在查询之前, mybatis 会对其进行动态解析。mybatis 为我们提供了两种支持动态 sql 的语法:#{}以及${}

一、${}与#{}的区别

1、符号类型

(1)#{}:参数占位符,即预编译
(2)${} :字符串替换符,即SQL拼接

2、防注入问题

(1)#{}:很大程度上能防止sql 注入
(2)${}:不能防止sql 注入

3、参数替换位置

DBMS:数据库管理系统(Database Management System)是一种操纵和管理数据库的大型软件,是用于建立、使用和维护数据库,简称DBMS。它对数据库进行统一的管理和控制,以保证数据库的安全性和完整性。用户通过DBMS访问数据库中的数据,数据库管理员也通过DBMS进行数据库的维护工作。它提供多种功能,可使多个应用程序和用户用不同的方法在同时或不同时刻去建立,修改和询问数据库。
(1)#{}:变量替换是在DBMS 中
(2)${}:变量替换是在 DBMS 外

4、参数解析

(1)#{}:将传入的数据都当成一个字符串,会对传入的变量自动加一个单引号。如:user_id = #{userId},如果传入的值是111,那么解析成sql时的值为user_id = ‘111’,如果传入的值是id,则解析成的sql为user_id = ‘id’。

(2)${}:将传入的参数直接显示生成在sql中,且不加任何引号。如:user_id = ${userId},如果传入的值是111,那么解析成sql时的值为user_id = 111 , 如果传入的值是id,则解析成的sql为user_id = id。

5、用$的情况

(1)MyBatis排序时使用order by 动态参数时需要注意,用$而不是#

默认情况下,使用#{}格式的语法会导致MyBatis创建预处理语句属性并以它为背景设置安全的值。这样做很安全,很迅速也是首选做法,有时你只是想直接在SQL语句中插入一个不改变的字符串。比如,像ORDER BY,你可以这样来使用:
ORDER BY ${columnName},这里MyBatis不会修改或转义字符串。

(2)${}方式一般用于传入数据库对象,例如传入表名

Select  *  from  ${tableName}  where  user_id = #{userId}

6、sql执行过程

(1)#{}:编译好SQL后语句再去取值
(2)${}:取值以后再去编译SQL语句
注:一般能用#的就别用$

二、SQL解析

1、流程

(1)#{}:动态解析 -> 预编译 -> 执行
(2)${}:动态解析 -> 编译 -> 执行

2、案例

根据用户名name查询用户表user数据,如果 name 的值为 zhangsan

(1)SQL编写

  • #{}

    select * from user where name = #{name};
    
  • ${}

    select * from user where name = ${name};
    

(2)(预)编译中的处理

  • #{}:在预处理时,会把参数用一个占位符" " 代替,变成以下SQL

    select * from user where name = ?;
    
  • ${}:只是简单的字符串替换,在动态解析时变成以下SQL

    select * from user where name = 'zhangsan';
    
  • #{}和${}最终解析结果都一样的

    select * from user where name = 'zhangsan';
    

    转载来源:https://blog.csdn.net/web18484626332/article/details/126112943

标签:解析,name,区别,SQL,user,sql,Mybatis,转载,id
From: https://www.cnblogs.com/qiu-rong/p/16904957.html

相关文章

  • SQL基础篇(一)---JOIN语句执行流程&ON与WHERE的区别
    本文主要记录了MySQL中的JOIN语句具体执行流程,同时分析了ON与WHERE条件的区别。1.执行流程一个完整的SQL语句中会被拆分成多个子句,子句的执行过程中会产生......
  • mybatis中公共字段的自动填充
    在需要自动填充的字段上添加注解@TableField@ApiModelProperty(value="创建时间")@TableField(fill=FieldFill.INSERT)privateDategmtCreate;@A......
  • Mybatis - 基础学习6
    一.CRUD我们可以在工具类中设置自动提交事务!publicstaticSqlSessiongetSqlSession(){returnsqlSessionFactory.openSession(true);} 1.编写......
  • HTTP代理不同套餐价格区别在哪里
    同样都是HTTP代理,有的服务商是500元一个月,有的服务商是680元一个月,为什么不同的HTTP代理套餐价格都不一样呢?在日常生活中,我们买东西也是一样,同样都是轿车,不同的品......
  • 从机器学习到图神经网络,inductive和transductive的区别
    目录机器学习归纳式学习(inductivelearning)转导式学习(transductivelearning)图表示学习归纳式学习(inductivelearning)节点表示图表示转导式学习(transductivelearning)节点......
  • 等保二级、三级的区别
    等保是指对国家重要信息、法人和其他组织及公民的专有信息以及公开信息和存储、传输、处理这些信息的信息系统分等级实行安全保护,对信息系统中使用的信息安全产品实行按等......
  • MyBatis 延迟加载代码详解
    在我们的实际开发中,会面临各种各样的查询操作。如果单表查询能满足业务需求。尽量用单表查询,因为单表查询的效率比多表关联查询快。那么当业务需求需要用到的数据来源于多......
  • mybatis的代码生成器
    mybatis的代码生成器packagecom.atguigu.demo;importcom.baomidou.mybatisplus.annotation.DbType;importcom.baomidou.mybatisplus.annotation.IdType;importcom......
  • @Validated与@Valid的区别
    @Validated可以配合分组使用,如QueryGroup.class,就只校验加了QueryGroup.class的属性@Valid只具备基础功能,并不具备分组校验的功能@ApiOperation("查询动态跟踪分页")......
  • mybatis中${}的用法
    MyBatis中${}的用法表t_user有如下4个字段:id 、name、 age 、 consume_amt如果需求是有时候是要age的平均数,有的是consume_amt的平均数,那么可以把列表传到SQL中查询......