MyBatis中的#和$有什么区别

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

一. 什么是MyBatis

MyBatis是一款优秀的持久层框架,特别是在国内(国外据说还是 Hibernate 的天下)非常的流行,我们常说的SSM组合中的M指的就是MyBatis。

MyBatis支持定制化SQL、存储过程以及高级映射等多种特性,单纯从代码上来看,MyBatis避免了几乎所有的JDBC代码和手动设置参数以及手动处理结果集。而且MyBatis的使用也非常方便,可以通过简单的XML或注解来配置和映射数据信息。

对MyBatis不熟悉的小伙伴,可以私信百泽老师,我们有免费的MyBatis手把手教学视频送给你哦~

二. 什么是动态 SQL

MyBatis的强大特性之一便是它的动态SQL,凡是使用过JDBC或其他类似框架,如DBUtils、JdbcTemplate等数据库操作工具的同学,都能体会到根据不同条件拼接SQL语句是有多么的痛苦!我们不仅要拼接SQL,还要拼接参数,特别费事,而且拼接的时候还要确保不能忘了必要的空格,还要注意省略掉列名列表最后的逗号.......操作过这样代码的小伙伴应该都明白这里的弊端。然而利用MyBatis的动态SQL特性,就可以彻底摆脱这种痛苦。

MyBatis 支持使用 ${} 和 #{}两种符号来进行动态SQL的拼接,可能有些人没有留意到,认为 ${} 和 #{} 的作用是差不多的,其实这两者的功能虽然相似,但区别是比较大的!而且,关于这两者的区别,也是Mybatis面试时的一个高频问题,今天百泽老师就带各位一起来看看两者的区别到底有哪些。

三. `#` 和 `$`

  1. 基本用法

我们先来了解一下 `#`和 `$` 的基本用法。这两个都可以进行动态 SQL 的拼接,但用法上略微有一些差异。

我们先来看 `#` 的用法:

select * from t_user where name = #{param}

如果想执行相同的 SQL,用 $ 写法如下:

select * from t_user where name = '${param}'

眼尖的小伙伴可能已经发现,使用 `$` 比使用 `#` 多了一对单引号,为什么要这样呢?这里就涉及到了两者的第一个区别了:

  1. # 会进行预编译,而且会进行类型匹配,参数是在编译之后填充进去的,所以不需要加上单引号;

  1. $ 不会进行数据类型的匹配,只是单纯地进行字符串的拼接,所以要自己手动加上单引号,否则最终拼接出来的SQL语句就不对了。

用过JDBC的小伙伴可能会知道,这就跟JDBC中的PrepareStatement和Statement的区别是一样的,使用 `#` 就相当于使用 PrepareStatement,而使用 `$` 就相当于使用 Statement。

好啦,这就是两者的第一个区别!那么还有其他的区别吗?在讲第二个区别之前,百泽老师先给小伙伴们介绍一下什么是SQL注入。

2. 什么是SQL注入

在我们的日常开发中,对于网页上的操作,归根结底无外乎就是增删改查,所以有很多同行都自嘲自己是CURD工程师。

在CURD的过程中,以SQL查询为例,假设我们想根据用户名和密码查询某一个用户是否存在,现在要让用户在前端根据用户名和密码进行查询。

现在假设我们后台的SQL语句如下:

select * from user where username='${username}' and password='${password}'

前端网页有两个输入框,一个是用户名输入框,另一个是密码输入框。假设用户老老实实地输入用户名为zhangsan,密码为123,那么最终生成的SQL语句如下:

select * from user where username='zhangsan' and password='123'

以上过程似乎很完美!

但是!!!要是有人不老实呢?

假设用户输入的用户名是 `zhangsan' or 1=1 #`,密码则随意给了个值 111,那么最终生成的 SQL语句可能就是下面这样了:

select * from user where username='zhangsan' or 1=1 #' and password='123'

大家知道,# 在 SQL语句中的含义是注释,#后面的SQL内容是不执行的。所以这个SQL无论怎么执行,最终都会返回true。这就是所谓的SQL注入了。

如果我们想要防止SQL注入,其实有很多解决办法,其中最直接的一种,就是不要使用$符号来拼接 SQL语句!

3. `#`和`$`的区别

看了上面的例子,现在大家就明白了,相比于 $ ,#有一个重要的作用,那就是可以防止SQL注入!

  1. 变量传递时,必须使用#。使用 #{} 就等于使用了JDBC 中 PrepareStatement 这种占位符的形式,既可以提高SQL的执行效率,又可以防止SQL注入等问题。

  1. $ 只是一种简单的字符串拼接,要特别小心 SQL注入的问题。如果我们在项目中使用了$,那么可以自定义过滤器或者通过Druid等工具,来防止SQL注入。

  1. 如果在一个场景中,既能使用 # 又能使用 $,那么建议首选 #。

四. 什么情况下只能用$

另外有一个特殊场景只能用$!那就是将数据库对象作为参数传递,其中最常见的就是 group by了。设我们现在想要对某个表进行排序查询,但参与排序的字段并不确定,而是要通过前端参数传递过来,那么此时就必须使用 $ 了!因为 # 预处理之后,会把数据库中的字段名识别为字符串,进而会出错,如下所示:

select count(*) from user group by ${param}

当然,上面这只是其中的一个例子,实际情况是,只要遇到将数据库的字段名作为参数传递的情况,都得用 $!

五. 小结

最后,百泽老师再来给大家简单总结一下两者的区别:

  1. # 会进行预编译,而且会进行类型匹配,参数是在编译之后填充进去的,所以不需要加上单引号;

  1. $ 不会进行数据类型匹配,只是一种单纯的字符串拼接,所以要自己手动加上单引号,否则最终拼接出来的 SQL语句会有问题。不过也要看具体的使用场景,如果参数是列名,就不用加单引号;

  1. `#` 能够预防 SQL 注入问题,$ 不能;

  1. 当需要遇到将数据库的字段名作为参数传递时,应该使用用 $。

现在,你知道Mybatis中的#与$有哪些区别了吗?文章来源地址https://www.toymoban.com/news/detail-514796.html

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

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

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

相关文章

  • Mybatis 一级缓存和二级缓存 与hibernate 一级缓存和二级缓存 有什么区别?

    MyBatis和Hibernate都是流行的持久化框架,它们都提供了一级缓存和二级缓存的功能,但在实现和使用上有一些区别。 一级缓存: - MyBatis的一级缓存是默认开启的,它是在SqlSession级别的缓存,也就是在同一个SqlSession中,如果多次查询同样的SQL语句,那么只会执行一次数据库查

    2024年02月15日
    浏览(9)
  • MyBatis中获取参数值的两种方式:${} 和 #{},以及它们之间区别是什么?

    ${}:的本质就是字符串拼接 #{}:的本质就是占位符赋值 ① 使用${}占位符,在字符串拼接的方式拼接sql,若为字符串类型或为日期类型的字段进行赋值时,需要手动加单引号 ② 使用#{}占位符赋值的方式拼接sql,此时为字符串类型或日期类型的字段进行赋值时,自动添加单引

    2024年02月04日
    浏览(11)
  • MyBatis中的ResultMap有什么作用

    MyBatis中的ResultMap有什么作用

    MyBatis是一款广泛使用的Java持久层框架,它简化了数据库访问和数据映射的工作。在MyBatis中,ResultMap是一个强大的工具,用于将数据库查询结果映射到Java对象上。本文将深入探讨MyBatis中的ResultMap,解释它的作用以及如何使用它来提高数据访问的效率和可维护性。 在开始之前

    2024年02月07日
    浏览(8)
  • 关于mybatis-plus中Ipage 、page 和pageUtils中的区别

         在使用人人开源框架的时候,通过逆向工程自动生成了分页功能,然而在使用的时候经常被关于Ipage和page等对象搞混,所以记录这篇文章用来介绍之间的区别 可以看见上面就是逆向工程帮忙生成的分页方法 里面出现了三个对象 pageUtils、page和Ipage 先来将pageUtils吧,pag

    2024年02月04日
    浏览(13)
  • Spring Boot 中的 MyBatis 是什么,如何使用

    Spring Boot 中的 MyBatis 是什么,如何使用

    MyBatis 是一种流行的 Java 持久化框架,可以将 SQL 查询映射到对象上,并提供了简单易用的 API 来执行 CRUD 操作。Spring Boot 可以与 MyBatis 集成,提供了简化配置和自动化配置的功能,使得使用 MyBatis 变得更加容易。 在本文中,我们将介绍 Spring Boot 中的 MyBatis,包括如何配置和使

    2024年02月16日
    浏览(7)
  • 我真的不想再用mybatis和其衍生框架了选择自研亦是一种解脱

    我真的不想再用mybatis和其衍生框架了选择自研亦是一种解脱

    文档地址 https://xuejm.gitee.io/easy-query-doc/ GITHUB地址 https://github.com/xuejmnet/easy-query GITEE地址 https://gitee.com/xuejm/easy-query 众所邹知orm的出现让本来以sql实现的复杂繁琐功能大大简化,对于大部分程序员而言一个框架的出现是为了生产力的提升.。dbc定义了交互数据库的规范,任何数据库

    2024年02月16日
    浏览(6)
  • MyBatis 中的动态 SQL 是什么? 如何使用动态 SQL?

    在 MyBatis 中,动态 SQL 是指能够根据条件动态生成 SQL 语句的功能。通过使用动态 SQL,可以根据不同的条件生成不同的 SQL 语句,从而实现灵活的查询和操作。 条件判断:通过 , , , 标签实现 SQL 语句中的条件逻辑,根据传入参数的值来决定是否包含某一部分 SQL 语句。 循环遍

    2024年04月15日
    浏览(10)
  • HTTP中的POST和PUT有什么区别?

    根据 RFC 2616, § 9.5,POST 用于创建一个资源: POST 方法用于请求源服务器接受请求中包含的实体,作为 Request-Line 中 Request-URI 标识的资源的新下级。 根据 RFC 2616, § 9.6,PUT 用于创建或替换资源: PUT 方法请求将封闭的实体存储在提供的 Request-URI 下。如果 Request-URI 引用了一个已

    2024年02月02日
    浏览(10)
  • Java 中的访问修饰符有什么区别?

    Java 中的访问修饰符用于控制类、类的成员变量和方法的访问权限,主要有以下四种: public:公共访问修饰符,可以被任何类访问。public 修饰的类、成员变量和方法可以在任何地方被访问到。 protected:受保护的访问修饰符,可以被类本身、子类和同一个包中的其他类访问。

    2024年02月04日
    浏览(8)
  • Linux中的Swap和Mem:有什么区别?

    在Linux系统中,内存管理是操作系统的重要部分。在内存管理方面,Swap和Mem是两种不同的内存类型,它们在Linux系统中发挥着不同的作用。本文将解释Swap和Mem的区别以及它们在Linux系统中的作用。 一、Swap Swap是Linux系统中的交换分区,它本质上是磁盘上的一个区域。当系统的

    2024年01月17日
    浏览(4)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包