$和#为什么$会发生sql注入?

本文探讨了MyBatis中动态SQL的使用技巧,包括#与$符号的区别及应用场景,特别是在排序和模糊查询中的作用。同时,深入解析了数据库索引的工作原理,如何通过合理设置索引来提升查询效率,以及索引过多可能带来的负面影响。
  1. “#” 将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号

  2. “$” 将传入的数据直接显示生成在sql中

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

#{ } 用于CRUD

${ } 则用于模糊查询(记得加%%)

DB执行一条SQL语句的时候,默认的方式是根据搜索条件进行全表扫描,遇到匹配条件的就加入搜索集合。如果对某一字段添加索引,查询时就会先去索引列表中一次定位到特定值的行数,大大减少遍历匹配的行数,索引能增加查询的速度。

---------有索引的话,首先去索引列表中查询,而索引列表是B类树的数据结构,定位到特定值的行就会非常快,所以其查询的速度就很快

是否将所有的字段都添加索引,来加快查询?

------不行的

1.索引会占用存储空间,索引越多,使用的存储空间越多

2.插入数据,存储索引也会消耗时间,索引越多,插入数据的速度越慢

### SQL中 `$` `#` 的作用 在SQL语句编写过程中,特别是在框架如MyBatis中的应用,`$` `#` 是两种不同的占位符符号,它们各自有不同的用途意义。 #### 1. 符号 `$` 的含义与用法 符号 `$` 主要用于直接嵌入字符串到SQL语句中。这种方式适用于那些无法通过预编译处理的部分,例如表名、列名或其他固定的SQL语法结构[^1]。由于 `$` 将参数作为纯文本插入到SQL语句中,因此它存在潜在的安全风险——容易受到SQL注入攻击。如果输入数据未经过严格验证,则可能导致恶意代码被执行。因此,在使用 `$` 时需格外谨慎[^4]。 示例代码如下: ```xml <select id="selectExistByUsernameOrPhoneOrEmail" resultType="int"> select count(*) from ums_user where ${type}=#{value} </select> ``` 在此例子中 `${type}` 被替换成了实际查询条件字段名称(如username),而该操作并未被转义或绑定成安全形式,故可能引发安全隐患。 #### 2. 符号 `#` 的含义与用法 相比之下,符号 `#` 则代表一种更安全的方式去传递变量值给SQL语句。当采用此方法时,MyBatis会自动将这些值视为参数并加以预处理,从而有效防止SQL注入发生。通常情况下推荐优先选用这种机制来构建动态SQL表达式。 举例来说: ```xml <select id="findUserById" parameterType="int" resultType="map"> SELECT * FROM userinfo WHERE id = #{userId} </select> ``` 这里 `#{userId}` 表达的是一个具体的数值型或者字符型的数据项,而非整个子串的一部分;这样既简化了编码逻辑又增强了系统的健壮性安全性。 综上所述,虽然两者都能实现向SQL语句填充值的功能,但在具体应用场景下各有侧重:前者适合于固定不变的元数据定义场景下的简单替代需求,后者则更适合涉及敏感业务数据交互场合下的复杂运算要求。 ### 注意事项 - 使用 `$` 进行动态SQL组装时务必警惕SQL注入威胁,并采取适当措施予以规避。 - 对于绝大多数情况而言,应尽可能利用 `#` 来完成相应任务以保障程序运行期间的信息保密性及整体稳定性。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值