我是靠谱客的博主 机智戒指,最近开发中收集的这篇文章主要介绍Mybatis中的#{}和#{}区别,及以模糊查询为例,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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中的#{}和#{}区别,及以模糊查询为例所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(34)

评论列表共有 0 条评论

立即
投稿
返回
顶部