概述
Mybatis中的#{}和#{}区别,及以模糊查询为案例
- 1.#{}与${}可以干什么
- 2.区别
- 1>
- 2>
- 3>
- 为什么呢?
- 4>
- 3.总结
- 4.模糊查询案例
- 1.使用#{ }进行模糊查询
- 2.使用${ }进行模糊查询
1.#{}与${}可以干什么
Mybatis的Mapper.xml语句中parameterType向SQL语句传参有两种方式:
1:#{ }: 可以接收简单类型值或者pojo对象属性的值;
2:${ }: 可以接收简单类型值或者pojo对象属性的值;
2.区别
1>
#{ }: 是以预编译的形式,将参数设置到sql语句中(把#{ }中间的参数转义成字符串,预编译后,动态解析成参数标记符);可以防止sql注入。
${ }: 取出的值直接拼装在sql语句中;会有安全问题 ,所以大多情况下,我们取参数的值都应该去使用#{ },原生jdbc不支持占位符的地方,我们再使用${ }进行取值。
2>
#{ }: 相当于PreparedStatement的参数占位符,设置值会自动进行 java 类型和 jdbc 类型转换,也会对自动传入的数据加引号。
${ }: 相当于Statement对象的字符串拼接符,通过${}可以将传入的内容拼接在 sql 中且不进行 jdbc 类型转换,${ }将传入的数据直接显示生成在sql中;${ }方式一般用于传入数据库的对象,例如传入表名.
eg:
使用#{ }时,控制台输出的信息
使用${ }时,控制台输出的信息
3>
{ } 里面写的是属性名称。但如果传入的参数只有一个参数并且是简单类型(基本类型及其包装类,字符串,Date)时:
#{ }括号中可以是属性名称或其它名称。
${ }括号中只能写value,不能是其它名称(Mybatis3.4 里存在这种现象,3.5后修改没有了)
为什么呢?
我们一起来看 TextSqlNode 类的源码:
看 if 判断处理中context.getBindings().put的方法,原来它在处理的时候使用了"value"做为替代符的缓存的key,所以在ONGL查找中是查找"value"的值的,所以我们在使用${ }绑定参数时就只能是value
4>
MyBatis排序时使用order by 动态参数时需要注意,用${ } 而不是#{ }
3.总结
1. 能用#{ }的就别用${ }
2. #{ }防止sql注入;${ }不能,有安全问题
3.#{}:相当于参数占位符,且会对自动传入的数据加一个双引号;
${}:相当于字符串拼接符
4. 如果 parameterType 传输单个简单类型值时,${ }括号中只能是 value,而#{ }可以是参数名也可以随便取名。
5. 排序使用order by时,用${ }
4.模糊查询案例
1.使用#{ }进行模糊查询
注意的点:1.% 要写在传入参数时,否则报错。
2.在映射配置文件里写sql语句时,参数这里不加单引号
(原因以上均已写明)
2.使用${ }进行模糊查询
注意的点:1. 传入参数时不写%,%写在sql语句内。
2.在映射配置文件里写sql语句时,加单引号;
3.${ }里面要写value而不能写属性名或者是其他
(原因以上均已写明)
PS:初学者一枚,如有错误,望请指正
最后
以上就是机智戒指为你收集整理的Mybatis中的#{}和#{}区别,及以模糊查询为例的全部内容,希望文章能够帮你解决Mybatis中的#{}和#{}区别,及以模糊查询为例所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复