首页 > 其他分享 > MyBatis中的#和$有什么区别

MyBatis中的#和$有什么区别

时间:2023-02-08 13:34:58浏览次数:36  
标签:JDBC 区别 什么 使用 拼接 SQL MyBatis 单引号

什么是MyBatis

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

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

`#` 和 `$`的区别:

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

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

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

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

基本用法

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

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

select * from t_user where name = #{param}

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

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

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

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

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

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

相比于 $ ,#有一个重要的作用,那就是可以防止SQL注入!

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

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

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

标签:JDBC,区别,什么,使用,拼接,SQL,MyBatis,单引号
From: https://www.cnblogs.com/qian-fen/p/17101405.html

相关文章

  • 解决mybatis resultMap根据type找不到对应的包问题
    目录mybatisresultMap根据type找不到对应的包mybatisresultMap根据type找不到对应的包这里需要配置typeAliasesPackage自动配置别名typeAliasesPackage定义多个时......
  • 什么时候会有多态?
    因为Java的引用变量有两个类型:一个是编译时类型,一个是运行时类型。编译时类型由声明该变量时使用的类型决定,编译和声明有关。运行时类型由实际赋给该变量的对象决定,也就是......
  • 告诉你数据库的稳定性都在测试什么
    中国信通院给定的稳定性测试的思想如下:保障分布式数据库系统的稳定运行,就先要有测试其稳定性的工具和方法。混沌测试是一种新兴的对分布式系统的稳定性进行测试的技术。其......
  • 关于mybatis resulttype 返回值异常的问题
    目录mybatisresulttype返回值异常例如:resulttype="student"但是当中有些字段为空例如:数据库字段为:s_name实体类字段为namemybatisresultType="map"的常见问题一、......
  • MyBatis-Plus——saveOrUpdate方法如何确定主键
    saveOrUpdate方法:先更新,更新失败返回0;发起查找,查找失败返回0,最后进行插入操作有三种执行情况1.插入的数据不带id插入成功。同时MyBatis-Plus会自动生成一个19位的id,默认主......
  • 我希望写什么样的文章
    不为流量,不为眼球。经过思考、复盘而留下的东西,能给读者带来些收获。能在自己需要的时候,或者想看的时候,回过头看看,或点头、或微笑,但绝不是看不下去想删掉。不管好坏,都......
  • 在 Asp.Net Core 中什么是认证和授权
    认证(Authentication)和授权(Authorization)在Asp.Netcore充当了两个不同的职责。有的老伙计在理解的时候还存在误解。本文我们将会通过一些简单的例子来说明这两个概念。......
  • vite 和webpack的区别
    答:vite打包要比webpack快webpack:先解析入口文件=》在解析路由=》在解析模块=》在打包=》开起服务vite:先开起服务=》在解析路由=》在解析模块......
  • JS中? ?和?. 和||的区别
    1、??与||的区别1)相同点:??和||的用法相同,都是前后是值,中间用符号连接,根据前面的值来判断最终是返回前面的值还是后面的值。One??TwoOne||Two2)不同点:判断的......
  • 整合MyBatis
      创建实现类的目的,sqlsession私有sqlsession通过在配置文件中的构造方法注入到实现类的私有属性中,test方法只做一件事,就是通过getbean生成实现类对象,然后调用方法输......