你们在使用Mybatis的过程当中可能都会本身去写SQL语句,而且须要向SQL语句传入参数。java
可是在Mybatis中,传参的语法有两种,#{name} 和 ${name},二者有什么区别呢?一块儿来看看吧。sql
最近印度比较嚣张,频繁挑起边境冲突,那么印度是否是这么有底气呢?数据库
咱们看一下印度的兵力分布表:mybatis
其实印度军队仍是挺强大的,是南亚的顶级军事强国。他拥有世界第三规模的现役部队,而且其陆军规模是世界第二。oop
印度是世界最大的武器进口国,进口固然有利有弊,弊端就是本国的武器研发实力不强。固然印度是世界上少数拥有核武器的国家。spa
好了,有了印度的兵力分布表以后,咱们怎么在mybatis中编写sql语句经过编号来查询印度的兵力分布呢?code
<select id="getIndiaTroopsById" resultType="com.flydean.IndiaTroop">
select * from troops t
where t.id =#{id}
</select>
复制代码
你们通常都会像上面那样编写查询sql语句。cdn
上面咱们使用了#{id}做为传递的参数。那么#{id}有什么特色呢?xml
首先,#{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}不会进行预编译,传入是什么就被替换成什么。因此有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
复制代码
第二,${id}是取值以后再进行编译,没法防止SQL注入。
咱们总结一下这两个传参的不一样使用场景:
${id}般用于传入数据库对象,例如传入表名。
能用#的时候就不要用$。
本文做者:flydean程序那些事
本文连接:www.flydean.com/difference-…
本文来源:flydean的博客
欢迎关注个人公众号:程序那些事,更多精彩等着您!