一篇文章弄懂Mybatis中#和$的区别

目录
  • 前言
  • 一:下面我们写个关于“#”的个sql,看能不能注入。
    • 1.正常传参
    • 2.拼接传参
  • 二:下面我们写个关于“$”的个sql,看能不能注入。
    • 1.正常传参
    • 2.拼接传参
  • 总结

前言

在学校的时候,想必大家肯定听老师讲过,在mybatis中,配置参数要用#,不要用$符号。因为$不安全,容易被sql注入。讲是这么讲,但是如何注入的,大家一起来看看吧。

一:下面我们写个关于“#”的个sql,看能不能注入。

 <select id="selectUser" resultMap="BaseResultMap">
    SELECT
    	acc.user_name FROM dfws_sys_user_account AS acc
    WHERE
        acc.user_name like #{userName}
  </select>

1.正常传参

DfwsSysUserAccount user = new DfwsSysUserAccount();
user.setUserName("wanglingzhi");
List<DfwsSysUserAccount> list = userAccountService.selectUser(user);
if(list!=null && list.size()>0){
    for (DfwsSysUserAccount u:list) {
    	System.out.println("用户名:"+u.getUserName());
    }
}else{
        System.out.println("暂无数据");
}

sql打印:

Preparing: SELECT acc.user_name FROM dfws_sys_user_account AS acc WHERE acc.user_name = ? 

Parameters: wanglingzhi(String)

2.拼接传参

DfwsSysUserAccount user = new DfwsSysUserAccount();
user.setUserName("'wanglingzhi' or acc.user_name = 'shuizhong'");
List<DfwsSysUserAccount> list = userAccountService.selectUser(user);
if(list!=null && list.size()>0){
    for (DfwsSysUserAccount u:list) {
    	System.out.println("用户名:"+u.getUserName());
    }
}else{
        System.out.println("暂无数据");
}

sql打印:

Preparing: SELECT acc.user_name FROM dfws_sys_user_account AS acc WHERE acc.user_name = ? 

Parameters: wanglingzhi or acc.user_name = shuizhong(String)

二:下面我们写个关于“$”的个sql,看能不能注入。

<select id="selectUser" resultMap="BaseResultMap">
    SELECT
    	acc.user_name FROM dfws_sys_user_account AS acc
    WHERE
        acc.user_name like ${userName}
  </select>

1.正常传参

DfwsSysUserAccount user = new DfwsSysUserAccount();
user.setUserName("'wanglingzhi'");
List<DfwsSysUserAccount> list = userAccountService.selectUser(user);
if(list!=null && list.size()>0){
    for (DfwsSysUserAccount u:list) {
    	System.out.println("用户名:"+u.getUserName());
    }
}else{
        System.out.println("暂无数据");
}

打印sql:

SELECT acc.user_name FROM dfws_sys_user_account AS acc WHERE acc.user_name = 'wanglingzhi'

2.拼接传参

DfwsSysUserAccount user = new DfwsSysUserAccount();
user.setUserName("'wanglingzhi' or acc.user_name = 'shuizhong'");
List<DfwsSysUserAccount> list = userAccountService.selectUser(user);
if(list!=null && list.size()>0){
    for (DfwsSysUserAccount u:list) {
    	System.out.println("用户名:"+u.getUserName());
    }
}else{
        System.out.println("暂无数据");
}

打印sql:

SELECT acc.user_name FROM dfws_sys_user_account AS acc WHERE acc.user_name = 'wanglingzhi' or acc.user_name = 'shuizhong' 

很显然,这里已经sql注入了。

总结下,一般说来,二者的区别可总结为以下6点:

(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)一般能用#的就别用$。

ps:在使用mybatis中还遇到<![CDATA[]]>的用法,在该符号内的语句,将不会被当成字符串来处理,而是直接当成sql语句,比如要执行一个存储过程。

总结

到此这篇关于Mybatis中#和$区别的文章就介绍到这了,更多相关Mybatis #和$区别内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 浅谈mybatis中的#和$的区别 以及防止sql注入的方法

    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,  如果传入的

  • Java Mybatis中的 ${ } 和 #{ }的区别使用详解

    好了,真正做开发也差不多一年了.一直都是看别人的博客,自己懒得写,而且也不会写博客,今天就开始慢慢的练习一下写博客吧.前段时间刚好在公司遇到这样的问题. 一.举例说明 select * from user where name = "dato"; select * from user where name = #{name}; select * from user where name = '${name}'; 一般情况下,我们都不会注意到这里面有什么不一样的地方.因为这些sql都可以

  • 浅谈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为ord

  • Mybatis中#{}与${}的区别详解

    前言 在开发中使用Mybatis经常使用到#{}与${},依旧有很多开发者对二者的使用不是很清晰,正所谓好记性不如烂笔头,特此总结一下. 在mybatis中动态 sql 是其主要特性之一,在 mapper 中定义的参数传到 xml 中之后,在执行操作之前 mybatis 会对其进行动态解析.mybatis 提供了两种支持动态 sql 的语法:#{} 以及 $ { }, 其最大的区别则是前者方式能够很大程度防止sql注入(安全),后者方式无法防止Sql注入 .什么??不懂什么是Sql注入?额...

  • MyBatis中#{}和${}的区别详解

    最近在用mybatis,之前用过ibatis,总体来说差不多,不过还是遇到了不少问题,再次记录下. 先给大家介绍下MyBatis中#{}和${}的区别,具体介绍如下: 1. #将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号.如:order by #user_id#,如果传入的值是111,那么解析成sql时的值为order by "111", 如果传入的值是id,则解析成的sql为order by "id". 2. $将传入的数据直接显示生成在sql中.

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

    最近在用mybatis,之前用过ibatis,总体来说差不多,不过还是遇到了不少问题,再次记录下, 比如说用#{},和 ${}传参的区别, 使用#传入参数是,sql语句解析是会加上"",比如 select * from table where name = #{name} ,传入的name为小李,那么最后打印出来的就是 select * from table where name = '小李',就是会当成字符串来解析,这样相比于$的好处是比较明显对的吧,#{}传参能防止sql注入,如果

  • Mybatis下动态sql中##和$$的区别讲解

    一.介绍 mybatis 中使用 Mapper.xml里面的配置进行 sql 查询,经常需要动态传递参数,例如我们需要根据用户的姓名来筛选用户时,sql 如下: select * from user where name = "Jack"; 上述 sql 中,我们希望 name 后的参数 "Jack" 是动态可变的,即不同的时刻根据不同的姓名来查询用户.在 Mapper.xml文件中使用如下的 sql 可以实现动态传递参数 name: select * from u

  • 一篇文章弄懂Mybatis中#和$的区别

    目录 前言 一:下面我们写个关于"#"的个sql,看能不能注入. 1.正常传参 2.拼接传参 二:下面我们写个关于"$"的个sql,看能不能注入. 1.正常传参 2.拼接传参 总结 前言 在学校的时候,想必大家肯定听老师讲过,在mybatis中,配置参数要用#,不要用$符号.因为$不安全,容易被sql注入.讲是这么讲,但是如何注入的,大家一起来看看吧. 一:下面我们写个关于"#"的个sql,看能不能注入. <select id="

  • 一篇文章弄懂javascript中的执行栈与执行上下文

    前言 作为一个前端开发人员,弄清楚JavaScript的执行上下文有助于我们理解js中一些晦涩的概念,比如闭包,作用域,变量提升等等. 执行栈 执行栈用于存储代码执行期间创建的所有执行上下文.具有FILO接口,也被称为调用栈. 当JavaScript代码被运行的时候,会创建一个全局上下文,并push到当前执行栈.之后当发生函数调用的时候,引擎会为函数创建一个函数执行上下文并push到栈顶.引擎会先执行调用栈顶部的函数,当函数执行完成后,当前函数的执行上下文会被移除当前执行栈.并移动到下一个上下文

  • 一篇文章弄懂C#中的async和await

    目录 前言 async await 从以往知识推导 创建异步任务 创建异步任务并返回Task 异步改同步 说说 await Task 说说 async Task<TResult> 同步异步? Task封装异步任务 关于跳到 await 变异步 为什么出现一层层的 await 总结 前言 本文介绍async/Task.在学习该知识点过程中,一定要按照每一个示例,去写代码.执行.输出结果,自己尝试分析思路. async 微软文档:使用 async 修饰符可将方法.lambda 表达式或匿名方法指定

  • 一篇文章弄懂Python中所有数组数据类型

    前言 数组类型是各种编程语言中基本的数组结构了,本文来盘点下Python中各种"数组"类型的实现. list tuple array.array str bytes bytearray 其实把以上类型都说成是数组是不准确的.这里把数组当作一个广义的概念,即把列表.序列.数组都当作array-like数据类型来理解. 注意本文所有代码都是在Python3.7中跑的^_^ 0x00 可变的动态列表list list应该是Python最常用到的数组类型了.它的特点是可变的.能动态扩容,可存储

  • 一篇文章弄懂Python中的可迭代对象、迭代器和生成器

    我们都知道,序列可以迭代.但是,你知道为什么吗? 本文来探讨一下迭代背后的原理. 序列可以迭代的原因:iter 函数.解释器需要迭代对象 x 时,会自动调用 iter(x).内置的 iter 函数有以下作用: (1) 检查对象是否实现了 iter 方法,如果实现了就调用它,获取一个迭代器. (2) 如果没有实现 iter 方法,但是实现了 getitem 方法,而且其参数是从零开始的索引,Python 会创建一个迭代器,尝试按顺序(从索引 0 开始)获取元素. (3) 如果前面两步都失败,Pyt

  • 一篇文章弄懂ECMAScript中的操作符

    目录 一元操作符 布尔操作符 乘性操作符 加性操作符 关系操作符 相等操作符 条件操作符 赋值操作符 逗号操作符 总结 一元操作符 只能操作一个值的操作符叫做一元操作符 递增和递减.递增和递减操作符借鉴自C,而且有两个版本:前置型和后置型 前置型:操作符位于要操作的变量之前.执行前置型递增和递减操作时,变量的值都是在语句被求值以前改变的 var age = 29; var anotherAge = --age + 2 console.log(age) // 28 console.log(anot

  • 一篇文章弄懂Python中的内建函数

    目录 前言 A类 B类 C类 D类 E类 F类 G类 H类 I类 L类 M类 R类 S类 T类 总结 前言 python内建函数指的是python自带的函数,这种函数不需要定义,并且不同的内建函数具有不同的功能,可以直接使用. A类 abs() 函数,返回数字的绝对值. 语法:abs(x) 参数 x - 数值表达式 函数返回 x(数字)的绝对值; 例子1: all() 函数,判断给定的可迭代参数 ble 中的元素是否都为 True,若是返回 True,反之返回 False; 元素除了是 0.空.

  • 一篇文章弄懂js中的typeof用法

    目录 基础 返回类型 string 和 boolean number 和 bigint symbol undefined function object 其他 常见问题 引用错误 typeof null typeof 的局限性 扩展:BigInt 类型 总结 基础 typeof 运算符是 javascript 的基础知识点,尽管它存在一定的局限性(见下文),但在前端js的实际编码过程中,仍然是使用比较多的类型判断方式. 因此,掌握该运算符的特点,对于写出好的代码,就会起到很大的帮助作用. typ

  • 一篇文章弄懂Java8中的时间处理

    目录 前言 LocalDateTime ZonedDateTime Instant 总结 前言 java8借鉴了第三方日期库joda很多的优点 java.time包 类名 描述 Instant 时间戳 Duration 持续时间,时间差 LocalDate 只包含日期,比如:2020-05-20 LocalTime 只包含时间,比如:13:14:00 LocalDateTime 包含日期和时间,比如:2020-05-20 13:14:00 Period 时间段 ZoneOffset 时区偏移量,

  • 一篇文章弄懂MySQL查询语句的执行过程

    前言 需要从数据库检索某些符合要求的数据,我们很容易写出 Select A B C FROM T WHERE ID = XX  这样的SQL,那么当我们向数据库发送这样一个请求时,数据库到底做了什么? 我们今天以MYSQL为例,揭示一下MySQL数据库的查询过程,并让大家对数据库里的一些零件有所了解. MYSQL架构 mysql架构 MySQL 主要可以分为 Server 层和存储引擎层. Server层 包括连接器.查询缓存.分析器.优化器.执行器等,所有跨存储引擎的功能都在这一层实现,比如存

随机推荐