前言html
还记得当初从北京回来的时候,跟着倪文杰师姐作Java ITOO的一卡通模块,我亲姐贾梦洁带着我一块作,期间,我遇到了一个特别奇葩的问题,就死我要实现Mybatis的模糊查询,根据当时亲姐教给我方法 select * from table where contions like #{something},就是解决不了问题,一点东西都查不出来,还报错。后来,我终于明白,世界上还有${}这个东西。只不过等到今天才去把它发出来,有点亡羊补牢的感受,但愿还能帮到一些像我同样的新手。java
#{}实现的是向prepareStatement中的预处理语句中设置参数值,sql语句中#{}表示一个占位符即?。 web
使用占位符#{}能够有效防止sql注入,在使用时不须要关心参数值的类型,mybatis会自动进行Java类型和jdbc类型的转换。#{}能够接收简单类型值或pojo属性值,若是parameterType传输单个简单类型值,#{}括号中能够是value或其它名称。说得再通俗一点,当咱们使用#{}的时候,发出的sql中,#{}表明的内容会自动被加上“”,而${}是直接把东西取出来直接用举个例子:sql
id="liweizhong",#{id}输出后是"liweizhong",而${value}输出是liweizhongmybatis
${}和#{}不一样,经过${}能够将parameterType传入的内容拼接在sql中且不进行jdbc类型转换, ${}能够接收简单类型值或pojo属性值,若是parameterType传输单个简单类型值,${}括号中只能是value。使用${}不能防止sql注入,可是有时用${}会很是方便,以下的例子:app
若是本例子使用#{}则传入的字符串中必须有%号,而%是人为拼接在参数中,显然有点麻烦,若是采用${}在sql中拼接为%的方式则在调用mapper接口传递参数就方便不少。oop
若是使用占位符号则必须人为在传参数中加%this
List<User> list =userMapper.selectUserByName("%管理员%");spa
若是使用${}原始符号则不用人为在参数中加%,直接在mapper配置文件里面接受这个参数就能够了,显得更加的方便,但是sql注入问题? .net
List<User>list = userMapper.selectUserByName("管理员");
再好比order by排序,若是将列名经过参数传入sql,根据传的列名进行排序,应该写为:
这样要执行的sql是:
若是使用#{}将没法实现此功能,由于若是这样的话,执行的sql就变成了
那样,你能够试一下,会报错的,无效列名,sql语句报错:
![]()