Mybatis中的#{}与${}

本文介绍了Mybatis中#{}和${}的区别,包括它们在动态解析、预编译、执行阶段的不同以及如何传值。#{}作为参数占位符,能够防止SQL注入,而${}进行字符串替换,不支持预编译,存在安全隐患。在使用时,建议尽可能使用#{},并在需要时配合@Param注解明确参数名。对于数据库对象和ORDER BY语句,可以考虑使用${}。
摘要由CSDN通过智能技术生成

Mybatis中的#{}与${}

MyBatis映射配置文件中,动态传递参数两种方式:

  • #{}:占位符
  • ${}:拼接符

区别

  1. #{}为参数占位符?,即sql预编译;${}为字符串替换,即sql拼接。
  2. #{}:动态解析->预编译->执行;${}:动态解析->编译->执行。
  3. #{}的变量替换是在DBMS中;${}的变量替换是在DBMS外。
  4. 变量替换后,#{}对应的变量自动加上单引号’’;变量替换后,${}对应的变量不会加上单引号’’。
  5. #{}能防止sql注入;${}不能防止sql注入。

实例分析

假设传入参数为1,分析如下SQL

动态解析

-- #{}
select * from user where uid=#{uid}
-- ${}
select * from user where uid='${uid}'

预编译

-- #{}
select * from user where uid= ?
-- ${}
select * from user where uid= '1'

执行

-- #{}
select * from user where uid= '1'
-- ${}
select * from user where uid= '1'

传值

单值

  1. #{}

    无MyBatis默认值,可任意,且与参数名无关
    #{}单值
    #{}单值

  2. ${}

    使用MyBatis默认值value,即${value}
    单值
    单值
    使用自定义参数名,前提:在映射器接口方法的参数前加注释@Param("")
    自定义
    自定义

多值

  1. #{}

    使用MyBatis默认值arg0、arg1、arg2…或param1、param2、param3…
    多值
    多值
    使用自定义参数名,前提:在映射器接口方法的参数前加注释@Param("")
    多值
    多值

  2. ${}

    使用MyBatis默认值arg0、arg1、arg2…或param1、param2、param3…
    多值
    多值
    使用自定义参数名,前提:在映射器接口方法的参数前加注释@Param("")
    多值
    多值
    :@Param("")是@Param(value="")的简写

使用技巧与建议

  1. 不论是单个参数,还是多个参数,一律都建议使用注解@Param("")
  2. 能用#{}的地方就用#{},不用或少用${}
  3. 数据库对象(表名、字段名)做参数时,必须用${}。如:select * from ${tableName}
  4. order by时,必须用${}。如:select * from user order by ${columnName}
  5. 使用${}时,要注意何时加或不加单引号,即${}和’${}’
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值