你知道Mybatis的这个小细节吗

今天的一天枯燥的复制粘贴,工具人的工作一点也不含糊。但是好学的我还是发现了有意思的东西。

Mybatis应该是国内码农用的最频繁的框架,毕竟一套技术栈走天下。那么今天来讲讲参数绑定#{}和${}的区别。

#与$的区别

当你用${}传递参数时,idea还会出现警告。提示可能存在sql注入漏洞。没错,#{}与${}最大的区别就是${}存在sql注入风险。下面这两种方式,如果入参name是个正常参数,那么结果是一致的。

select*fromuserwherename=#{name};

select*fromuserwherename=${name};

Mybatis在动态解析sql时,会将#{}参数替换为占位符,例如:

select*fromuserwherename=?;

而${}仅仅是做字符串的替换,例如:

select*fromuserwherename=Jay;

这时如果入参是不怀好意的字符串就可能导致SQL注入,例如:

入参为:Jay;deletefromuser,SQL就会解析成:

select*fromuserwherename=Jay;deletefromuser;Mybatis是怎么实现的呢?

Mybatis是对JDBC封装的持久层框架,动态sql解析成BoundSql对象,使用#{}时解析成JDBC的PreparStatement预编译SQL,后面对于同一个SQL还能直接使用。

ONEMORETHING

如果#{}无法满足使用场景,必须得用${}那怎么办呀,例如动态传入表名查询。

select*from${tableName}where`year`;

这种情况使用#{}解析的sql是错误的无法执行。

如果必须要使用${},那么只能在代码上做文章,确保执行sql的入参是安全的。

平凡打工人

点赞在看走一波预览时标签不可点收录于话题#个上一篇下一篇


转载请注明:http://www.kelongbinga.com/klss/7013.html

  • 上一篇文章:
  •   
  • 下一篇文章: