${}和#{}用于替换MyBatis中的参数。它们可以将用户传递的参数替换成MyBatis最终生成的SQL,但是它们有很大的区别。接下来我们一起来看看吧。1.作用不同${}是直接将参数替换成SQL,比如下面的代码:select*fromuserinfowhereid=${id}最终生成的执行SQL如下:从上图可以看出,前面的参数${id}直接替换为具体的参数值1。而#{}使用占位符以预处理的方式执行业务。我们将上面的案例转化为#{}的形式,实现代码如下:select*fromuserinfowhereid=#{id}最终生成的SQL如下:参数为数值类型时${}的问题(下面不考虑安全问题),${}和#{}的执行效果是一样的,但是当参数的类型为字符时,使用${}就会出现问题,如下代码所示:select*fromuserinfowherename=${name}上面的程序执行时,生成的SQL语句如下:这会导致程序报错,因为传递的参数是字符型的,但是在SQL语法中,如果是字符类型,需要给值加上单引号,否则会报错,而${}是直接替换,不会自动加上单引号,所以报错执行时会报错。但是,使用#{}使用占位符预执行,所以没有问题。其实现代码如下:select*fromuserinfowherename=#{name}最后生成的执行SQL上面的程序如下:2.不同的使用场景虽然#{}可以用来处理任何类型的参数,但是当传递的参数是SQL命令或者SQL关键字时#{}就会出现问题。例如,当我们要按照价格从高到低(倒序),或者从低到高(正序)进行查询时,如下图所示:这时,我们需要传递排序关键字,desc逆序(价格从高到高Low)或者asc正序(价格从低到高),这时候我们使用${}实现代码Ryan:select*fromgoodsorderbyprice${sort}上述代码生成的执行SQL和运行结果如下:但是如果将代码中的${}改为#{},那么程序执行会报错,#{}实现代码如下:select*fromgoodsorderbyprice#{sort}上述代码生成的执行SQL及运行结果如下:从上面的执行结果可以看出:传递普通参数时,需要使用#{},传递SQL命令时或者SQL关键字,需要使用${}来将参数直接替换执行。3.安全性不同。${}和#{}之间的主要区别体现在安全性上。使用${}时会存在安全问题,即SQL注入的问题,而使用#{}是经过预处理的,所以不会有安全问题。我们通过下面的登录函数来观察一下两者的区别。3.1使用${}实现用户登录UserMapper.xml中的实现代码如下:select*fromuserinfowherename='${name}'andpassword='${password}'单元测试代码如下:@Testvoidlogin(){UserInfouserInfo=userMapper.login("java","java");System.out.println(用户信息);}以上代码生成的执行SQL和运行结果如下:从结果可以看出,当我们传入正确的用户名和密码时,可以成功查询到数据。但是,当我们使用${}时,当我们不知道正确的密码时,我们也可以使用SQL注入语句来获取用户的隐私信息。SQL注入的实现代码如下:@Testvoidlogin(){UserInfouserInfo=userMapper.登录(“java”,“'或1='1”);System.out.println(userInfo);}上面代码生成的执行SQL和运行结果如下:从上面的结果我们可以看出,在使用${}的时候,可以在不知道正确的密码,就像小偷不用你的钥匙就可以轻易打开你家的门,这是多么可怕的事情。使用#{}是否存在任何安全问题?接下来我们测试一下。3.2使用#{}实现用户登录首先将UserMapper.xml中的代码改成如下:select*fromuserinfowherename=#{name}andpassword=#{password}然后我们使用上面的SQL注入来测试登录功能:@Testvoidlogin(){UserInfouserInfo=userMapper.login("java","'or1='1");System.out.println(userInfo);}最终生成的SQL和执行结果如下:从上面的代码可以看出,使用SQL注入无法突破#{}的“闸门”,可以使用有信心。总结${}和#{}在MyBatis中都是用来代替参数的。它们之间的区别主要体现在:1、功能不同:${}是直接替换,而#{}是预处理;2.使用场景不同:普通参数使用#{},如果传递SQL命令或SQL关键字,需要使用${},但使用前必须做安全验证;3.安全性不同:使用${}是安全问题,而#{}不是安全问题。判断是非在自己,名誉在别人,得失在人数。公众号:Java面试真题分析面试合集:https://gitee.com/mydb/interview