Mybatis中#{}和${}传参的区别及#和$的区别小结

 更新时间:2016年07月06日 10:53:32   投稿:mrr  
这篇文章主要介绍了Mybatis中#{}和${}传参的区别及#和$的区别小结 的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下

最近在用mybatis,之前用过ibatis,总体来说差不多,不过还是遇到了不少问题,再次记录下,

比如说用#{},和 ${}传参的区别,

使用#传入参数是,sql语句解析是会加上"",比如 select * from table where name = #{name} ,传入的name为小李,那么最后打印出来的就是

select * from table where name = ‘小李',就是会当成字符串来解析,这样相比于$的好处是比较明显对的吧,#{}传参能防止sql注入,如果你传入的参数为 单引号',那么如果使用${},这种方式 那么是会报错的,

另外一种场景是,如果你要做动态的排序,比如 order by column,这个时候务必要用${},因为如果你使用了#{},那么打印出来的将会是

select * from table order by 'name' ,这样是没用,

目前来看,能用#就不要用$,

mybatis中的#和$的区别

1. #将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。如:order by #user_id#,如果传入的值是111,那么解析成sql时的值为order by "111", 如果传入的值是id,则解析成的sql为order by "id".

2. $将传入的数据直接显示生成在sql中。如:order by $user_id$,如果传入的值是111,那么解析成sql时的值为order by user_id, 如果传入的值是id,则解析成的sql为order by id.

3. #方式能够很大程度防止sql注入。 

4.$方式无法防止Sql注入。

5.$方式一般用于传入数据库对象,例如传入表名. 

6.一般能用#的就别用$.

MyBatis排序时使用order by 动态参数时需要注意,用$而不是#

字符串替换

默认情况下,使用#{}格式的语法会导致MyBatis创建预处理语句属性并以它为背景设置安全的值(比如?)。这样做很安全,很迅速也是首选做法,有时你只是想直接在SQL语句中插入一个不改变的字符串。比如,像ORDER BY,你可以这样来使用:

ORDER BY ${columnName}

这里MyBatis不会修改或转义字符串。

重要:接受从用户输出的内容并提供给语句中不变的字符串,这样做是不安全的。这会导致潜在的SQL注入攻击,因此你不应该允许用户输入这些字段,或者通常自行转义并检查。

Mybatis中$和#的区别简单小结

前不久,有人来我们公司面试,我们的经理问道了这个问题,我也是一知半解,所以就去百度了一番。

其实区别很简单的,举个例子大家就会明白的。写一句SQL-例如:select * from user_role where user_code = "100";

这句话而言,需要写成 select * from ${tableName} where user_code = #{userCode}

所以,$符是直接拼成sql的 ,#符则会以字符串的形式 与sql进行拼接。

相关文章

  • JAVA中的数组和List转换方法场景分析

    JAVA中的数组和List转换方法场景分析

    文章介绍了Java中List与数组之间的转换方法,包括List转数组和数组转List,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧
    2026-01-01
  • SpringBoot中实现数据脱敏的六种常用方案

    SpringBoot中实现数据脱敏的六种常用方案

    在日常的开发开发工作中,我相信各位老铁肯定遇到过这种需求手机号中间四位得用*显示等,既要展示部分数据,又要保证敏感信息不泄露,这就是所谓的数据脱敏,所以今天给大家分享6种我在项目中常用的脱敏方案,需要的朋友可以参考下
    2025-09-09
  • SpringBoot项目中公共字段填充的实现

    SpringBoot项目中公共字段填充的实现

    本文主要介绍了SpringBoot项目中公共字段填充的实现,利用SpringBoot的Aop思想和自定义注解和反射机制的方法来实现,具有一定的参考价值,感兴趣的可以了解一下
    2023-10-10
  • 使用MyBatis快速生成代码的几种方法

    使用MyBatis快速生成代码的几种方法

    本文主要介绍了如何使用MyBatis快速生成代码的几种方法,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2023-12-12
  • JAVA实现微信APPV3支付保姆级教程

    JAVA实现微信APPV3支付保姆级教程

    微信实现支付功能与支付宝实现支付功能是相似的,这篇文章主要介绍了JAVA实现微信APPV3支付的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-01-01
  • 纯Java类配置与@Configuration实战指南

    纯Java类配置与@Configuration实战指南

    本文介绍@Configuration的核心用法,实战@Bean定义Bean、@ComponentScan扫描组件、@Import组合配置类,带大家体验“无XML”的Spring配置新方式,感兴趣的朋友跟随小编一起看看吧
    2025-09-09
  • Java实现word转pdf并在关键字位置插入图片

    Java实现word转pdf并在关键字位置插入图片

    这篇文章主要为大家详细介绍了如何利用Java实现word转pdf,并在word中关键字位置插入图片,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-11-11
  • SpringBoot的10个参数验证技巧分享

    SpringBoot的10个参数验证技巧分享

    参数验证很重要,是平时开发环节中不可少的一部分,但是我想很多后端同事会偷懒,干脆不错,这样很可能给系统的稳定性和安全性带来严重的危害,那么在Spring Boot应用中如何做好参数校验工作呢,本文提供了10个小技巧,需要的朋友可以参考下
    2023-09-09
  • IDEA中解决 git pull 冲突的方法

    IDEA中解决 git pull 冲突的方法

    这篇文章主要介绍了IDEA中解决 git pull 冲突的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07
  • 深入理解Java对象的序列化与反序列化的应用

    深入理解Java对象的序列化与反序列化的应用

    本篇文章是对Java中对象的序列化与反序列化进行了详细的分析介绍,需要的朋友参考下
    2013-05-05

最新评论