文章目录
- ⭐专栏介绍
- 问题描述
- 问题答案
⭐专栏介绍
本专栏会持续更新各种关于JAVA的问题,包括面试题,JAVA入门到精通等。
更新速度保持在每天3—5篇
问题描述
mybatis #{} 和 ${} 的区别?
问题答案
Mybatis中的#{}和${}是用于动态SQL的两种不同的占位符语法。
#{}:这是Mybatis中的预编译语法,表示将参数值作为一个占位符来使用。使用#{}可以避免SQL注入的风险。在SQL被预编译之后,#{}中的参数值会通过JDBC的预编译机制进行占位符替换。即使参数是字符串类型,也可以自动添加引号,使得传入的参数值在SQL中被当作字符串处理。
例如,假设有一个查询语句:
SELECT * FROM users WHERE username = #{username}
当传入参数为"John"时,会被转化为:
SELECT * FROM users WHERE username = 'John'
{}时,传入的参数值会被直接替换到SQL语句中,没有任何额外的处理。这种写法可以用于表名、列名等无法使用预编译的场景。但是需要注意的是,使用${}时存在SQL注入的风险,因为参数值直接嵌入到SQL语句中,没有任何过滤或转义。
例如,假设有一个查询语句:
SELECT * FROM ${tableName}
当传入参数为"users"时,会被转化为:
SELECT * FROM users
总结:
使用#{}可以更安全地处理参数,并且能够自动处理类型转换和特殊字符的转义。
使用${}可以进行更灵活的SQL拼接,但需要注意防止SQL注入的风险。