技术文摘
Mybatis 中 #{} 与 ${} 的区别
Mybatis 中 #{} 与 ${} 的区别
在 MyBatis 框架的使用过程中,#{} 与 ${} 是两个非常重要且容易混淆的概念。深入了解它们之间的区别,对于编写高效、安全且优化的 SQL 语句至关重要。
从语法功能层面来看。#{} 是 MyBatis 提供的预编译处理方式。它会将传入的数据当作一个字符串,在 SQL 语句中用占位符 “?” 进行替换,然后通过 PreparedStatement 来执行 SQL。例如:“SELECT * FROM user WHERE username = #{username}”,MyBatis 会自动处理数据类型转换等问题。而 ${} 则是简单的字符串替换,它会直接将参数值替换到 SQL 语句中。比如 “SELECT * FROM user WHERE username = '${username}'”,这种方式不会进行预编译。
安全性方面,二者差异明显。#{} 由于采用预编译处理,能有效防止 SQL 注入攻击。因为它将参数作为独立部分处理,数据库会把占位符当作普通数据,而非 SQL 语句的一部分。而 ${} 直接进行字符串替换,如果参数值来自外部不可信源,很容易被恶意用户利用,构造恶意 SQL 语句,导致数据泄露或数据库被破坏等严重后果。
性能表现上,#{} 每次执行都会使用 PreparedStatement,在有大量相同结构 SQL 语句执行时,数据库会缓存执行计划,从而提高性能。而 ${} 由于是字符串替换,每次执行都会生成不同的 SQL 语句,数据库无法缓存执行计划,性能相对较差。
适用场景也有所不同。#{} 适用于大多数需要传递参数的场景,特别是涉及用户输入的参数,如登录验证、数据查询等。而 ${} 一般用于表名、列名等无法使用占位符的情况,或者在某些需要动态生成 SQL 语句的特定场景下。
MyBatis 中的 #{} 和 ${} 各有特点。在实际开发中,我们要根据具体需求和场景合理选择使用,以确保系统的安全性、性能和稳定性。
- 全面洞悉 BiLSTM 与 CRF 算法
- Gartner 有关建设数据中台的建议
- 在终端执行 Python 代码的 6 种方式,令人涨见识!
- 增强现实与室内地理位置导航的未来体验
- JavaScript 实现用户网络连接的检查
- 五年 Python 经验,凝练十大开发技巧
- Python 的十大神奇技巧
- 掌握此套路回答 Java GC 相关面试问题必过
- 浅析设计模式中的结构型模式
- 掌握容器编排构建块,让 Kubernetes 入门变轻松
- 一个可执行文件所包含的海量信息令人惊叹!
- Visual Studio 2019 v16.7 Preview 2 已发布
- JavaScript 重构的数组、类名与条件技巧
- 《红警 1》源码公布 唤起满满回忆
- Arthas 使用正常,写 Lambda 表达式却出问题,如何解决?