MyBatis中${} 和 #{} 有什么区别?

这篇具有很好参考价值的文章主要介绍了MyBatis中${} 和 #{} 有什么区别?。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

${} 和 #{} 都是 MyBatis 中用来替换参数的,它们都可以将用户传递过来的参数,替换到 MyBatis 最终生成的 SQL 中,但它们区别却是很大的,接下来我们一起来看。

1.功能不同

${} 是将参数直接替换到 SQL 中,比如以下代码:

在 mybatis 中,${} 和 #{} 的区别是什么,Java框架系列,java,经验分享
最终生成的执行 SQL 如下: 

在 mybatis 中,${} 和 #{} 的区别是什么,Java框架系列,java,经验分享
从上图可以看出,之前的参数 ${id} 被直接替换成具体的参数值 1 了。 而 #{} 则是使用占位符的方式,用预处理的方式来执行业务,我们将上面的案例改造为 #{} 的形式,实现代码如下: 

在 mybatis 中,${} 和 #{} 的区别是什么,Java框架系列,java,经验分享
最终生成的 SQL 如下: 

在 mybatis 中,${} 和 #{} 的区别是什么,Java框架系列,java,经验分享 

${} 的问题

当参数为数值类型时(在不考虑安全问题的前提下),${} 和 #{} 的执行效果都是一样的,然而当参数的类型为字符时,再使用 ${} 就有问题了,如下代码所示:

在 mybatis 中,${} 和 #{} 的区别是什么,Java框架系列,java,经验分享
以上程序执行时,生成的 SQL 语句如下: 

在 mybatis 中,${} 和 #{} 的区别是什么,Java框架系列,java,经验分享
这样就会导致程序报错,因为传递的参数是字符类型的,而在 SQL 的语法中,如果是字符类型需要给值添加单引号,否则就会报错,而 ${} 是直接替换,不会自动添加单引号,所以执行就报错了。 而使用 #{} 采用的是占位符预执行的,所以不存在任何问题,它的实现代码如下: 

在 mybatis 中,${} 和 #{} 的区别是什么,Java框架系列,java,经验分享
以上程序最终生成的执行 SQL 如下: 

在 mybatis 中,${} 和 #{} 的区别是什么,Java框架系列,java,经验分享 

2.使用场景不同

虽然使用 #{} 的方式可以处理任意类型的参数,然而当传递的参数是一个 SQL 命令或 SQL 关键字时 #{} 就会出问题了。比如,当我们要根据价格从高到低(倒序)、或从低到高(正序)查询时,如下图所示:

在 mybatis 中,${} 和 #{} 的区别是什么,Java框架系列,java,经验分享
此时我们要传递的排序的关键字,desc 倒序(价格从高到低)或者是 asc 正序(价格从低到高),此时我们使用 ${} 的实现代码瑞安: 

在 mybatis 中,${} 和 #{} 的区别是什么,Java框架系列,java,经验分享
以上代码生成的执行 SQL 和运行结果如下: 

在 mybatis 中,${} 和 #{} 的区别是什么,Java框架系列,java,经验分享
但是,如果将代码中的 ${} 改为 #{},那么程序执行就会报错,#{} 的实现代码如下: 

在 mybatis 中,${} 和 #{} 的区别是什么,Java框架系列,java,经验分享
以上代码生成的执行 SQL 和运行结果如下: 

在 mybatis 中,${} 和 #{} 的区别是什么,Java框架系列,java,经验分享
从上述的执行结果我们可以看出:当传递的是普通参数时,需要使用 #{} 的方式,而当传递的是 SQL 命令或 SQL 关键字时,需要使用 ${} 来对 SQL 中的参数进行直接替换并执行。 

3.安全性不同

${} 和 #{} 最主要的区别体现在安全方面,当使用 ${} 会出现安全问题,也就是 SQL 注入的问题,而使用 #{} 因为是预处理的,所以不会存在安全问题,我们通过下面的登录功能来观察一下二者的区别。

3.1 使用 ${} 实现用户登录

UserMapper.xml 中的实现代码如下:

在 mybatis 中,${} 和 #{} 的区别是什么,Java框架系列,java,经验分享
单元测试代码如下: 

在 mybatis 中,${} 和 #{} 的区别是什么,Java框架系列,java,经验分享
以上代码生成的执行 SQL 和运行结果如下: 

在 mybatis 中,${} 和 #{} 的区别是什么,Java框架系列,java,经验分享
从结果可以看出,当我们传入了正确的用户名和密码时,能成功的查询到数据。但是,在我们使用 ${} 时,当我们在不知道正确密码的情况下,使用 SQL 注入语句也能用户的私人信息,SQL 注入的实现代码如下: 

在 mybatis 中,${} 和 #{} 的区别是什么,Java框架系列,java,经验分享
以上代码生成的执行 SQL 和运行结果如下: 

在 mybatis 中,${} 和 #{} 的区别是什么,Java框架系列,java,经验分享
从上述结果可以看出,当使用 ${} 时,在不知道正确密码的情况下也能得到用户的私人数据,这就像一个小偷在没有你们家钥匙的情况下,也能轻松的打开你们家大门一样,这是何其恐怖的事情。那使用 #{} 有没有安全问题呢?接下来我们来测试一下。 

3.2 使用 #{} 实现用户登录

首先将 UserMapper.xml 中的代码改成以下内容:

在 mybatis 中,${} 和 #{} 的区别是什么,Java框架系列,java,经验分享
接着我们使用上面的 SQL 注入来测试登录功能: 

在 mybatis 中,${} 和 #{} 的区别是什么,Java框架系列,java,经验分享
最终生成的 SQL 和执行结果如下: 

在 mybatis 中,${} 和 #{} 的区别是什么,Java框架系列,java,经验分享
从上述代码可以看出,使用 SQL 注入是无法攻破 #{} 的“大门”的,所以可以放心使用。 

总结

${} 和 #{} 都是 MyBatis 中用来替换参数的,它们二者的区别主要体现在:1、功能不同:${} 是直接替换,而 #{} 是预处理;2、使用场景不同:普通参数使用 #{},如果传递的是 SQL 命令或 SQL 关键字,需要使用 ${},但在使用前一定要做好安全验证;3、安全性不同:使用 ${} 存在安全问题,而 #{} 则不存在安全问题。文章来源地址https://www.toymoban.com/news/detail-705651.html

到了这里,关于MyBatis中${} 和 #{} 有什么区别?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 深入解析Mybatis-Plus框架:简化Java持久层开发(二)

    博客地址: CSDN :https://blog.csdn.net/powerbiubiu 本章节开始从实际的应用场景,来讲解Mybatis-Plus常用的一些操作,根据业务场景来进行增删改查的功能,首先先搭建一个项目。 1 搭建数据库 根据业务场景,设定了用户,角色,菜单三张表,同时还有用户与角色关联表,角色与菜

    2024年02月20日
    浏览(69)
  • 【MyBatis】MyBatis中#{}与${}的区别是什么?

    在开发中使用Mybatis经常使用到#{}与${},二者区别是?来总结一下。 在mybatis中动态 sql 是其主要特性之一,在 mapper 中定义的参数传到 xml 中之后,在执行操作之前 mybatis 会对其进行动态解析。mybatis 提供了两种支持动态 sql 的语法:#{} 以及 $ {},其 最大的区别则是#{}方式能够

    2024年02月07日
    浏览(38)
  • Java开发之框架(spring、springmvc、springboot、mybatis)【面试篇 完结版】

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 本文主要记录spring的单例bean、切面编程AOP、spring事务、循环依赖、常见注解等 提示:以下是本篇文章正文内容,下面案例可供参考 ① 问题引入 Spring框架中的bean是单例的 singleton :bean在每个Spring IOC容

    2024年02月07日
    浏览(54)
  • SSM框架的学习与应用(Spring + Spring MVC + MyBatis)-Java EE企业级应用开发学习记录(第一天)Mybatis的学习

    一、当前的主流框架介绍(这就是后期我会发出来的框架学习) Spring框架 ​ Spring是一个开源框架,是为了解决企业应用程序开发复杂性而创建的 ,其主要优势之一就是分层架构。 Spring提供了更完善的开发环境,可以为POJO(Plain Ordinary Java Object,普通Java对象 )对象提供企业级

    2024年02月12日
    浏览(58)
  • MyBatis中${} 和 #{} 有什么区别?

    ${} 和 #{} 都是 MyBatis 中用来替换参数的,它们都可以将用户传递过来的参数,替换到 MyBatis 最终生成的 SQL 中,但它们区别却是很大的,接下来我们一起来看。 1.功能不同 ${} 是将参数直接替换到 SQL 中,比如以下代码: 最终生成的执行 SQL 如下:  从上图可以看出,之前的参

    2024年02月09日
    浏览(33)
  • MyBatis中的#和$有什么区别

    MyBatis是一款优秀的持久层框架,特别是在国内(国外据说还是 Hibernate 的天下)非常的流行,我们常说的SSM组合中的M指的就是MyBatis。 MyBatis支持定制化SQL、存储过程以及高级映射等多种特性,单纯从代码上来看,MyBatis避免了几乎所有的JDBC代码和手动设置参数以及手动处理结果

    2024年02月11日
    浏览(35)
  • SSM框架的学习与应用(Spring + Spring MVC + MyBatis)-Java EE企业级应用开发学习记录(第二天)Mybatis的深入学习

    上一篇我们的项目搭建好了,也写了简答的Junit测试类进行测试,可以正确映射到数据库中。 那么这篇文章来深入学习一下以下几个点: 了解 MyBatis的核心对象SqlSessionFactoryBuilder 以及它的作用 掌握MyBatis核心配置文件以及元素的使用 。 掌握MyBatis映射文件及其元素的使用 。

    2024年02月11日
    浏览(68)
  • SSM框架的学习与应用(Spring + Spring MVC + MyBatis)-Java EE企业级应用开发学习记录(第五天)MyBatis的注解开发

    ​ 昨天我们深入学习了 MyBatis多表之间的关联映射,了解掌握了一对一关联映射,一对多关联映射,嵌套查询方式以及嵌套结果方式,掌握了缓存机制的一级缓存,二级缓存等概念,也使用了代码进行复现理解 。但是都是基于XML配置文件的方式来实现的,现在我们要学习一下

    2024年02月11日
    浏览(64)
  • 探索Java中最常用的框架:Spring、Spring MVC、Spring Boot、MyBatis和Netty

    🎉欢迎来到Java面试技巧专栏~探索Java中最常用的框架:Spring、Spring MVC、Spring Boot、MyBatis和Netty ☆* o(≧▽≦)o *☆嗨~我是IT·陈寒🍹 ✨博客主页:IT·陈寒的博客 🎈该系列文章专栏:Java面试技巧 📜其他专栏:Java学习路线 Java面试技巧 Java实战项目 AIGC人工智能 数据结构学习

    2024年02月08日
    浏览(59)
  • 实战系列(三)| Mybatis和MybatisPlus区别,包含详细代码

    MyBatis 和 MyBatisPlus 都是基于 MyBatis 的扩展库,用于简化 MyBatis 的开发。MyBatisPlus 是在 MyBatis 的基础上进行封装,提供了一套通用的 CRUD 操作接口,而 MyBatis 是一个底层的持久层框架。 MyBatis 是一个持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有

    2024年02月09日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包