Mybatis中#{}和${}的区别以及使用过程中要注意的地方。

    在写公司云平台重构版本的时候遇到#{}和${},随即上网查询了一下两者的区别以及使用方法。

1.Mybatis使用#{}时会将传入的参数自动解析为字符串。例如:elect count(1) from t_user where user_name = #{admin}。此时Mybatis会将其自动转为elect count(1) from t_user where user_name = “admin”。相当于jdbc的预编译,这个方法是安全的。

2.使用${}时,Mybatis不会对参数有任何处理。例如:select count(1) from t_user where user_name = ${admin}。此时,Mybatis生成的语句为select count(1) from t_user where user_name = admin。不会对${}传入的参数做任何处理。

    在使用过程中,我们使用#{},而不使用${}。因为使用${}会引起sql注入。

3.什么是sql注入?

    SQL注入就是利用现有应用程序,将(恶意)的SQL命令注入到后台数据库执行一些恶意的操作。比如说,在  

登录过程中,利用上面的语句到数据库中查找用户名/密码是否存在,如果存在就登录成功。而如果不存在就登录

失败,如果说你后台使用的是${},恶意用户在表单中的用户名文本框中输入的是'admin',密码框中输入的是

' ' or 1 = 1 加了一引号和一个恒成立的条件,那么,传到数据库中的sql就是:select count(1) from t_user where

 user_name = 'admin' and user_password = ' ' or 1=1。此时,如果程序没有做其他校验的话,该恶意用户是可以

登录系统的! 这就是SQL注入,恶意攻击。

    而如果使用#{}是不会出现这种情况的,#{}默认会给输入的值加上引号,但是使用#{}在其他场景下并不适用。比如

要使用到排序 order by #{} 传入的参数应是表对应字段名,但是加上引号后就会解析成order by ‘age’。这样就达不

到排序的目的,而此时如果使用${}就可以达到排序的目的。即,sql解析成order by age,根据age排序。



猜你喜欢

转载自blog.csdn.net/ty0903csdn/article/details/80830087