首页 > 其他分享 >mybatis #{} 和 ${} 的区别

mybatis #{} 和 ${} 的区别

时间:2024-06-30 18:23:13浏览次数:1  
标签:语句 区别 变量值 编译 参数 SQL mybatis 替换

在 MyBatis 中,#{} ${} 是两种不同的参数处理方式,它们在 SQL 语句的动态生成和预编译语句的参数绑定中扮演着不同角色。

#{}

#{} 主要用于预编译语句(Prepared Statement)的参数绑定,它具有以下几个特点:

  1. 防止 SQL 注入:#{} 能够自动进行字符串的转义,将特殊字符转为 SQL 字符串,从而有效地防止 SQL 注入攻击。

  2. 参数类型匹配:MyBatis 会根据参数的实际类型,将合适的 JDBC 类型传递给数据库,这对于处理日期、布尔值等非字符串类型特别有用。

  3. 命名参数:#{} 支持命名参数,这提高了 SQL 语句的可读性,例如 #{username}

  4. 占位符绑定:在预编译语句中,#{} 会被替换为一个问号(?)占位符,实际参数值在执行 SQL 语句时通过 PreparedStatement 的 setParameter 方法传入,提高了 SQL 执行效率和安全性。

${}

${} 主要用于文本替换,它将直接替换为变量的值,适用于以下情况:

  1. 动态 SQL:在需要拼接 SQL 语句的场景下,${} 可以直接将变量值插入到 SQL 语句中,例如在 WHERE 子句中动态添加条件。

  2. 表名或列名动态化:当需要动态指定表名或列名时,可以使用 ${} 来实现。

但是,使用 ${} 有以下几点需要注意:

  1. SQL 注入风险:直接使用变量值拼接 SQL 语句,如果没有适当的过滤,容易受到 SQL 注入攻击。

  2. 不支持预编译语句:${} 不会被替换为预编译语句的占位符,而是直接替换为变量值,这意味着每次执行 SQL 语句时都会解析和优化 SQL,降低了性能。

标签:语句,区别,变量值,编译,参数,SQL,mybatis,替换
From: https://www.cnblogs.com/use-D/p/18276740

相关文章

  • mybatis一级缓存、二级缓存的原理
    MyBatis的缓存机制分为两个级别:一级缓存和二级缓存。这两种缓存机制都有助于提高数据访问效率,减少对数据库的直接请求次数,但它们的工作原理和适用场景有所不同。一级缓存(Per-ExecutorTransactionalCaches)一级缓存也被称为“事务范围内的缓存”或者“执行器级别的缓存”。它是......
  • HDLBits练习Shift18 Verilog逻辑右移和算数右移的区别
    算术右移时,移入的是移位寄存器中数字(本例中为q[63])的符号位,而不是逻辑右移时的零。右移n位,即加入n位符号位。即若符号位为1,在左边补1;若符号位为0,就补0。算术右移的另一种思路是,它假定被移位的数字是带符号的,并保留符号,因此算术右移是右移n位将带符号的数字除以2的n次幂。......
  • let和var的区别
    let 和 var 在JavaScript中都是用来声明变量的关键字,但它们在作用域、变量提升和重复声明方面有显著的区别:作用域:var:变量声明时,它被绑定到包含它的函数作用域。如果 var 在函数外部声明,它将是全局变量。let:变量声明时,它被绑定到包含它的块作用域(任何代码块,如 {} 内)。......
  • sdk测试和app测试区别
    测试对象、内容和方法SDK测试和APP测试的主要区别在于测试对象、内容和方法。12测试对象不同:SDK测试的对象主要是软件开发工具包(SDK),这是为帮助开发者实现特定功能而提供的一组软件开发工具、文档、示例代码等。相比之下,APP测试的对象是完整的手机应用程序,包......
  • MyBatis针对String类型的数字<if>标签失效问题
    需求描述:大致场景是订单模块去接受流程模块发送的MQ消息,针对MQ消息发送的是一个实体类,该实体类中有一个String类型的字段,用于判断当前业务状态,1表示审核中2表示已审核等。订单模块根据这个状态去修改自身状态的信息可以看到这里有一个If标签,用于判断这个eventType的值......
  • RNN 和 Transformer 架构 之间的区别和联系
    递归神经网络(RNN)和Transformer是两种广泛应用于序列数据处理的神经网络架构,它们在设计原理、应用场景以及性能表现上有显著的区别和联系。RNN(RecurrentNeuralNetwork)基本概念RNN是一种能够处理序列数据的神经网络,每个时刻的输出依赖于当前输入和前一个时刻的隐藏状态。RNN通......
  • localhost 和 127.0.0.1 有什么区别?
    当前端开发人员在本地调试时,他们经常与 localhost 互动,只需运行npmrun命令就可以在浏览器中打开他们的网页,地址栏显示类似于 http://localhost:xxx/index.html的内容。许多人在使用它时可能没有思考两者之间的区别。考虑到我过去与开发人员合作时他们也缺乏对这两者区别......
  • Spring框架集成Mybatis
    本例演示转账操作准备数据库表t_act(账户表)创建maven模块,引入依赖<dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>6.1.8</......
  • js 微任务 宏任务区别
    微任务和宏任务是与事件循环相关的概念,用于管理异步操作的执行顺序。宏任务(macrotask)通常包括整体代码块、setTimeout、setInterval、I/O、UI渲染等,它们会被放入宏任务队列中,等待事件循环执行。微任务(microtask)包括Promise、process.nextTick、Object.observe、MutationObs......
  • Mybatis 系列全解(1)——全网免费最细最全,手把手教,学完就可做项目!
    Mybatis系列全解(1)1.第一个小程序2.CURD增删改查3.模糊查询4.配置解析4.1核心配置文件4.2环境配置4.3属性4.4类型别名4.5设置4.6映射器mappers1.第一个小程序1)创建一个数据库,一个表,填入一些数据。(这里不做演示,可以参考我前面写的数据库文章有具体介绍:......