Mybatis中#与$的区别

Mybatis中#与$的区别

Mybatis中的#{}用于传递查询的参数,用于从dao层传递一个string参数过来(也可以是其他参数),select * from 表名 order by age=#{age}

Mybatis会把这个参数转换成一个字符串。select * from 表名 order by age="age" 相当于jdbc中的预编译,安全。

而 ${} 一般用于order by的后面,Mybatis不会对这个参数进行任何的处理,直接生成了sql语句。例:传入一个年龄age的参数,select * from 表名 order by ${age}

Mybatis生成的语句为 select * from 表名 order by age Mybatis不会对$传递的参数做任何处理,相当于jdbc中的另外一种编译方式。

一般我们使用#{},不使用${},原因:

会引起sql注入,${}会直接参与sql编译。会影响sql语句的预编译。
最后,对于mybatis中#和$绑定参数的区别做个总结,避免以后类似的问题发生。

1.#{}将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。如:order by #{id},如果传入的值是111,那么解析成sql时的值为order by “111”, 如果传入的值是id,则解析成的sql为order by “id”。

2.${}将传入的数据直接显示生成在sql中。如:order by 
${id},如果传入的值是111,那么解析成sql时的值为order by 111, 如果传入的值是id,则解析成的sql为order 
by id。

3.#方式能够很大程度防止sql注入。

4.$方式无法防止Sql注入。

5.$方式一般用于传入数据库对象,例如传入表名.

6.一般能用#的就别用$.

ps:在使用mybatis中还遇到<![CDATA[]]>的用法,在该符号内的语句,将不会被当成字符串来处理,而是直接当成sql语句,比如要执行一个存储过程。

猜你喜欢

转载自blog.csdn.net/lvjingwn/article/details/78728970