?\#{}表示一个占位符号,#{}接收输入参数,类型可以是简单类型,pojo、hashmap。
如果接收简单类型,#{}中可以写成value或其它名称。
\#{}接收pojo对象值,通过OGNL读取对象中的属性值,通过属性.属性.属性...的方式获取对象属性值。
`${}`表示一个拼接符号,会引用sql注入,所以不建议使用${}。
${}接收输入参数,类型可以是简单类型,pojo、hashmap。
如果接收简单类型,#{}中可以写成value或其它名称。
${}接收pojo对象值,通过OGNL读取对象中的属性值,通过属性.属性.属性...的方式获取对象属性值。
在mybatis中,#和$占位符都是实现动态SQL的一种方式,通过这两种方式把参数传递到xml文件中,在执行操作前,mybatis会对两种站位符进行解析,
\#占位符等同于JDBC中的?占位符,相当于PreparedStatement中预处理语句中设置的参数,且其SQL语句是预编译的,使用占位符规定了SQL的结构,且在设置参数时,若出现特殊字符,会自动转义,有效的防止了SQL注入
而$的方式是传参,相当于把参数直接拼接到原始SQL里面,mybatis不会对它进行特殊处理,
所以$和#最大的区别在于前者是动态参数,后者是占位符,动态参数无法防止SQl注入,在实际应用中会尽可能的使用#。