写点什么

从印度兵力分布聊聊 Mybatis 中#和 $ 的区别

发布于: 2020 年 06 月 21 日
从印度兵力分布聊聊Mybatis中#和$的区别

简介

大家在使用Mybatis的过程中可能都会自己去写SQL语句,并且需要向SQL语句传入参数。



但是在Mybatis中,传参的语法有两种,#{name} 和 ${name},两者有什么区别呢?一起来看看吧。



举个例子

最近印度比较嚣张,频繁挑起边境冲突,那么印度是不是这么有底气呢?



我们看一下印度的兵力分布表:





其实印度军队还是挺强大的,是南亚的顶级军事强国。他拥有世界第三规模的现役部队,并且其陆军规模是世界第二。



印度是世界最大的武器进口国,进口当然有利有弊,弊端就是本国的武器研发实力不强。当然印度是世界上少数拥有核武器的国家。



查询举例

好了,有了印度的兵力分布表之后,我们怎么在mybatis中编写sql语句通过编号来查询印度的兵力分布呢?



<select id="getIndiaTroopsById" resultType="com.flydean.IndiaTroop">
select * from troops t
where t.id =#{id}
</select>




大家一般都会像上面那样编写查询sql语句。



上面我们使用了#{id}作为传递的参数。那么#{id}有什么特点呢?



#{id}的特点

首先,#{id}表示传递过来的id是String格式的,比如我传递过来的id=2,那么sql语句将会被解析为:



select * from troops t where t.id = '2'




第二,#{id}是会经过预编译的,也就是说上面的sql语句会会动态解析成一个参数标记符?:



select * from troops t where t.id = ?




然后才进行参数替换。预编译有什么好处呢?



预编译的好处就是可以防止SQL注入。



${id}的特点

首先${id}不会进行预编译,传入是什么就被替换成什么。所以有SQL注入的危险。



还是上面的例子,如果我们使用${id}:



<select id="getIndiaTroopsById" resultType="com.flydean.IndiaTroop">
select * from troops t
where t.id =${id}
</select>




如果我们传入参数2,那么相应的sql语句就是:



select * from troops t where t.id = 2




第二,$是取值之后再进行编译,无法防止SQL注入。



总结

我们总结一下这两个传参的不同使用场景:



$一般用于传入数据库对象,例如传入表名。



能用#的时候就不要用$



本文作者:flydean程序那些事

本文链接:http://www.flydean.com/difference-between-sharp-and-dollor/

本文来源:flydean的博客

欢迎关注我的公众号:程序那些事,更多精彩等着您!



发布于: 2020 年 06 月 21 日阅读数: 925
用户头像

关注公众号:程序那些事,更多精彩等着你! 2020.06.07 加入

最通俗的解读,最深刻的干货,最简洁的教程,众多你不知道的小技巧,尽在公众号:程序那些事!

评论 (5 条评论)

发布
用户头像
????
2020 年 08 月 05 日 17:36
回复
用户头像
给$不靠谱,#围栏才安全
2020 年 07 月 17 日 15:53
回复
用户头像
infoq的文章质量越来越不行了
2020 年 06 月 22 日 08:38
回复
用户头像
哈哈,这都能碰瓷
2020 年 06 月 21 日 11:47
回复
用户头像
优秀
2020 年 06 月 21 日 11:14
回复
没有更多了
从印度兵力分布聊聊Mybatis中#和$的区别