当前位置: 首页 > news >正文

mybatis中#与$的区别

文章目录

    • 区别
    • 详细讲解
    • ${}sql注入案例

区别

#会进行预编译,安全,通过#{}传入的参数 mybatis会认为是一个字符串,自动加上引号“”

$ 不会进行预编译,通过$ 传入的参数会直接取出来使用,可能会产生sql注入风险,只有当传入的是表名时必须用$传入,其他的都建议用#{}传入

详细讲解

MyBatis中使用parameterType向SQL语句传参,parameterType支持的类型可以是基本类型int,String,HashMap和java自定义类型。
在SQL中引用这些参数的时候,可以使用两种方式:

#{parameterName}
${parameterName}

首先,我们说一下这两种引用参数时的区别,使用#{parameterName}引用参数的时候,Mybatis会把这个参数认为是一个字符串,并自动加上引号’ ',例如传入参数是“tom”,那么在下面SQL中:

Select * from user where name = #{name}

使用的时候就会转换为:

Select * from user where name = 'tom'; 

同时使用${parameterName}的时候在下面SQL中

Select * from user where name = ${name}

就会直接转换为:

Select * from user  where name = tom

简单说#{}是经过预编译的,是安全的。
而${}是未经过预编译的,仅仅是取变量的值,是非安全的,存在SQL注入。

#{} 这种取值是编译好SQL语句再取值
${} 这种是取值以后再去编译SQL语句

${}sql注入案例

以下用一个示例来看一下$传参sql注入的问题

UserMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.springboot.store.mapper.UserMapper"><select id="selectByUsername">select *  from t_user where username = ${username}</select>
</mapper>

在单元测试中传入参数如下:

@Test
public void reg1(){userService.selectByUsername("tom or phone = 123");}

日志打印sql如下:

select * from t_user where username = tom or phone = 123

可以看到,我们只是想通过username字段查询,但是条件里面却被拼接了phone字段的条件。

接着我们把UserMapper.xml中的$替换为#
UserMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.springboot.store.mapper.UserMapper"><select id="selectByUsername">select *  from t_user where username = ${username}</select>
</mapper>

日志打印sql如下:

select * from t_user where username = 'tom or phone = 123'

此时只会根据username条件进行查询。

http://www.lryc.cn/news/60826.html

相关文章:

  • CVPR2023论文整理
  • RK3399平台开发系列讲解(中断篇)掌握信号处理
  • 业余爱好者想入门编程,一定远离那些只会说No的家伙,尤其程序员
  • DHCP及中继(UOS)
  • 【Linux】进程的概念
  • 奇舞周刊第490期:WebAssembly 多语言/宿主环境中的使用
  • 【css】使用css实现提示框各种弹出效果。
  • 1685_Excel的几种脚本处理方式
  • Unity中使用struct和class来存储数据的注意事项
  • 共阳(共阴)LED数码管编码交互演示
  • 如何在 TensorFlow 中使用 GPU 加速深度学习计算?
  • RK3568平台开发系列讲解(Linux系统篇)线程 pthread 详解
  • hspJAVA
  • OpenAI-ChatGPT最新官方接口《嵌入向量式文本转换》全网最详细中英文实用指南和教程,助你零基础快速轻松掌握全新技术(五)(附源码)
  • 1042. 不邻接植花
  • Linux FTP服务
  • JavaScript基础入门全解析(下)
  • 【C++初阶】(入门)输入输出
  • 初识Linux+Linux基本指令(一)
  • 部署架构 因为单体架构痛点 升级到微服务架构
  • mapreduce打包提交执行wordcount案例
  • MyBatis(十六)MyBatis使用PageHelper
  • 铁路轨道不平顺数据分析与预测
  • 好家伙,9:00面试,9:06就出来了,问的实在是太...
  • 【MySQL】数据库约束和聚合函数的使用
  • SpringMvcFoundation
  • 从零学习SDK(7)如何打包SDK
  • Python OpenCV 3.x 示例:1~5
  • 葵铭智能面经4.18
  • MyBatis 03 -MyBatis动态SQL与分页插件