mybatis中的mapper.xml文件中#,$的区别

从零搭建一个虚拟ECU:手把手用Autosar CP模块模拟汽车灯控系统(基于Vector工具链) 本文详细介绍了如何使用Vector工具链从零搭建一个基于Autosar CP架构的虚拟ECU系统,模拟汽车灯光控制功能。通过环境搭建、模块配置、通信栈设置到灯光控制逻辑实现的全流程指导,帮助开发者掌握Autosar CP模块术语的实际应用,并提供了系统集成与测试的实用方案。 阅读详情

首先说明,mybatis默认情况下会将所有的sql进行预编译。

1.什么是预编译

sql预编译指的是数据库驱动在发送sql语句和参数给DBMS(Database Management System)之前,JDBC使用PreparedStatement对象来抽象预编译语句,使用预编译。预编译后产生的PreparedStatement对象会缓存下来,这样DBMS在执行语句相同而参数不同的sql时,可以直接使用PreparedStatement对象,不需要进行重新编译。


2. # 和 $ 的区别

mybatis在对sql语句进行预编译之前,会对sql进行动态解析,解析为一个BoundSql对象,对动态sql中的 # 和 $处理也在此处

#{ } :解析为一个JDBC预编译语句的菜蔬标识符

select * from user where name = #{name}        解析为      select * from user where name =?

一个#{ } 解析为一个占位符 ?

${ } : 仅仅为一个纯粹的String替换,在动态sql解析阶段会进行变量替换

select * from user where name = ${name}        解析为      select * from user where name = "帅哥"  

可见使用${name},预编译之前name已经不是变量了,而是一个常量"帅哥"  

ps:${ }变量替换在动态sql解析阶段    #{ }变量替换在DBMS中


3.能使用#{ }的地方就用#{ }

预编译的sql可以重复利用,性能比${ }好。

${}在预编译钱已经被变量替换,会造成sql注入问题

select * from ${tabelname} where name = #{name}

假设我们的参数tablename为“user;delete user;--”   那么在sql动态解析阶段,预编译之前的sql就变为了

select * from user;delete user;-- where name = ?

--之后的语句作为注释,不起作用。而前半部分的语句偷偷包含了一个删除表数据的sql!!!!


4.表名作为变量时,必须使用${ }

表名是一个字符串,使用#{}时占位符替换参数时会带上单引号‘’,这会导致sql错误

select * from #{tabelname} where name = #{name} 变为

select * from ‘user’ where name = '帅哥' 

sql语法表名加单引号是错误的,需要反引号




Kubernetes(K8s)从入门到精通系列之一:一篇文章了解K8s全部核心知识点 阅读详情

相关推荐

ArcMap对遥感图像进行语义分割标注

使用arcmap对遥感图像进行语义分割标注

qq_41708916的博客 4045

Mybatis的mapper文件中$和#的区别

一般来说,我们使用mybatis generator来生成mapper.xml文件时,会生成一些增删改查的文件,这些文件中需要传入一些参数,传参数的时候,我们会注意到,参数的大括号外面,有两种符号,一种是#,一种是$。这两种符号有什么区别呢? SELECT * FROM employee WHERE name=#{name} SELECT * FROM employee ORDER BY ${s...

weixin_30871905的博客 226

SAP Fiori Launchpad 自定义层文本翻译实战:精准修正 Tile、Catalog 与 Group 标题

SAP Fiori 项目中,入口层(tile/catalog/group)的翻译问题常被忽视,但其直接影响用户体验。与前端i18n不同,这些文本属于平台配置数据,需通过ABAP标准翻译流程(SE63)处理。关键步骤包括:使用/UI2/FLC定位Text ID和Configuration ID,根据前缀区分Main/Property WD Config Key,在SE63中锁定WDY_CONF_USERT2表对象进行翻译。操作时需注意使用系统源语言环境,翻译完成后可能需要清理缓存。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 170

MyBatis Mapper.xml文件中 $和#的区别

网上有很多,总之,简略的写一下,作为备忘。例子中假设参数名为 paramName,类型为 VARCHAR 。 1.优先使用#{paramName,jdbcType=VARCHAR} 写法,除了可以防止sql注入以外,它还能在参数里含有单引号的时候自动转义, 而${paramName}由于是类似于拼接sql的写法,不具备此功能。 2.注意,使用 #{paramName,jdbcType=VAR...

weixin_30898109的博客 192

Flink Gauss CDC:深度剖析存量与增量同步的创新设计

开发Flink Gauss CDC是为了适配华为自研GaussDB的特殊日志格式和逻辑复制机制,解决Flink CDC无法直接支持的问题,同时优化存量与增量同步的效率和一体化读取能力,满足GaussDB复合主键处理、数据落库等定制化需求,以实现高效、准确的数据同步。

数据与算法架构提升之路专栏 1985

2026.2.3:OpenClaw国内安装教程,国内网络使用,服务器部署,对接飞书

本文介绍了如何创建飞书应用并接入OpenClaw机器人的完整流程。主要内容包括:1)在飞书开放平台创建企业自建应用,添加机器人能力并开通相关权限;2)在Windows11系统上安装OpenClaw,完成配置文件的修改(需将bind改为"lan");3)配置MiniMax国内接口地址,重启gateway服务。整个过程涵盖了应用创建、权限设置、软件安装、服务配置等关键步骤,为开发者提供了详细的飞书机器人接入指南。

拥抱具身智能,昇腾Ascend C 3993

写给即将正在找工作的Java攻城狮,高级Java开发必看

Java基础 1.Java语言的三大特性 2.Java语言主要特性 3. JDK和JRE有什么区别 4.Java基本数据类型及其封装类 5.如果main方法被声明为private会怎样? 6.说明- -下public static void main(String argsQ])这段声明里每个关键字的作用 7.==与equals的区别 8.Object有哪些公用方法 9.为什么Java里没有全局变量? 10.while循环和do循环有什么不同? 11.char型变量中能不能存储一个中文汉字?为什么? 12

jixuczy的博客 186

DeepSeek揭秘:构建高效反洗钱智能监控系统的全流程与代码实例

在金融领域,反洗钱(AML)是一项至关重要的任务。随着金融交易的复杂性和规模不断增长,传统的手工监控方法已无法满足现代金融系统的需求。因此,开发一个智能监控系统来自动识别和报告可疑交易变得尤为重要。本文将详细介绍如何使用DeepSeek技术构建一个高效的反洗钱智能监控系统,并提供相关的代码实例。

理论都是虚的,代码才是王道。 884

$# $0 $1 $n $* $@ $?的区别

linux里面的位置参数变量: $0与$1其实可以归纳为$n,n是一个正整数,表示的是调用shell脚本的时候出入的第几个参数,$0特殊一点,表示的是被执行脚本的名字,而$1或者是$2.....直到$n(n是一个正整数),表示的都是传给执行脚本的参数。 $#:传给被执行shell脚本的参数个数 $*与$@:两者基本一样,表示的都是传给被执行shell脚本的所有...

xiaozhuangyumaotao的博客 485

yolov8涨点系列之替换幽灵卷积GhostConv

yolov8涨点系列之替换幽灵卷积GhostConv

zhang1379的博客 3564

手把手教你在飞牛 NAS 上部署自有图床,含Python调用接口

📸 想在飞牛 NAS 上部署图床?这篇教程超适合小白!从安装到使用,步骤清晰~

XiaoqiangClub的博客 2345

Mybatis映射文件Mapper.xml中#和$的区别

关于Mapper.xml映射语句中什么时候用"#"什么时候用"$",已经有很多人做过总结,我最近在写项目时仍然遇到了一点问题,所以在这里结合项目文档和案例,再做一下总结,也作为个人的笔记,在这里再总结下。 一、先看一下在mybatis api中关于"#"和"$"的描述 1、"#" 图 1来自于mybatis api “Mapper XML文件”章节,   简单来说"#"在编译时使用&

a1257427517的专栏 9303

基于STM32的DS1302电子时钟电路与程序设计

这个示例代码中,我们使用DS1302_GetTime函数从DS1302芯片获取当前时间,并使用DS1302_GetDate函数获取当前日期。在本文中,我们将介绍如何使用STM32微控制器和DS1302实时时钟芯片来构建一个基于STM32的DS1302电子时钟,并提供相应的程序设计。请注意,以上示例代码仅供参考,具体的实现细节可能会根据使用的开发环境和硬件组件有所差异。在实际应用中,你可能需要根据自己的需求进行适当的调整和修改。为了完整实现电子时钟的功能,你还可以添加其他功能,例如闹钟设置、温度显示等。

UbiSqlserver的博客 1324

java mapper xml if_浅谈mybatis mapper.xml文件中$和#的区别

#{}表示一个占位符即?,可以有效防止sql注入。在使用时不需要关心参数值的类型,mybatis会自动进行java类型和jdbc类型的转换。#{}可以接收简单类型值或pojo属性值,如果传入简单类型值,#{}括号中可以是任意名称。select * from user where username like CONCAT(CONCAT('%', #{name}), '%')${}可以将paramet...

weixin_42493313的博客 436

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

MyBatis的mapper.xml文件中$和#的区别

#将传入的值当做一个字符串,自动添加双引号例如: where id=#id# ,此时传递的值为10 的话会解析成 where id="10"$将传递的值原封不动的显示在SQL中,例如 order by $ode$ ,此时传递的值为 time 那么会解析成order by time#方式能够很大程度防止sql注入 $方式无法防止Sql注入 动态sql中使用排序的时候注意用$而不是#,这边还是会存

Daniel的博客 463

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

mybatis mapper.xml文件中$和#的使用区别

#{}表示一个占位符即?,可以有效防止sql注入。在使用时不需要关心参数值的类型,mybatis会自动进行java类型和jdbc类型的转换。 #{}可以接收简单类型值或pojo属性值,如果传入简单类型值,#{}括号中可以是任意名称。<!-- 根据名称模糊查询用户信息 --> <select id="findUserById" parameterType="String" resultTyp

xingxinghann的博客 6935

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

mybatis中xml格式的mapper文件中接收入参时#和$的区别?

用#将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。(如下图) 用$将传入的数据直接显示生成在sql中。(如下图) 综上所述,如果用#接收参数,可以做到防sql注入的功效。

liudezhicsdn的博客 2124

mybatis中Mapper.xml文件sql语句中#{ }和${ }的区别

1.#{ }是把传入的值当作字符串的形式 select id,name,age from student where id =#{id}, 当id传入的值是1时,传入后台就相当于select id,name,age from student where id ='1'。 2.${ } 是传入的数据直接显示生成sql语句, select id,name,age from student where id =${id}, 当前端把id值1,传入到后台的时候,就相当于select id,nam...

qq_31102445的博客 1331

mybatis:#{}和${}区别,mysql自增主键返回,mybatis与hibernate的区别,原始dao开发方法与mapper代理方法区别,SqlMapConfig.xml文件元素(一)

mybatis:#{}和${}区别,mysql自增主键返回,mybatis与hibernate的区别,原始dao开发方法与mapper代理方法区别,SqlMapConfig.xml文件元素(一)

qq_30021219的博客 671

01. MyBatis中 #{} 和 ${} 区别

在使用 SQL 语句进行数据库操作时,如果对入参没有校验,那么攻击者就可以构造特殊的 SQL 语句,直接获取或修改数据库中的数据。例如,我们有一个需求,给定了一个用户的姓名和密码,要求从用户表(user)中查询出该用户的信息。如果我们使用${}的方式实现,即我们正常传入一组数据:username=“pual”、password=“123456” 当然不会有问题。

kezhou的博客 794

SpringBoot中Mapper.xml的入参方式

在SpringBoot开发过程中,我们使用来封装对数据库表的CURD操作,正常每张表会有一组对应的文件。

IT飞牛 2126

Mybatis框架 mapper.xml文件中parameterType传递参数常用的几种方式

文章目录Mybatis框架 mapper.xml文件中parameterType传递参数常用的几种方式1、使用依次顺序传参2、使用@Param注解传参3、使用HashMap传参4、使用Java Bean传参5、使用List传参6、使用数组传参7、mybatis中的#和$的区别 Mybatis框架 mapper.xml文件中parameterType传递参数常用的几种方式 1、使用依次顺序传参 //#{}里面的数字代表传入参数的顺序 public User queryUser(String userName,

hlli86的博客 989

mybatis中获取当前时间_mybatis 在xml文件中获取当前时间的sql

在Service等地方获取当前时间:SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//设置日期格式 注意大写HH是24小时制//小写hh是12小时制df.format(new Date()) ;//当前时间XML界面实体类获取上面的时间,然后如下格式就能不报错的插入数据库了显示界面的代码:注意的是 select语...

weixin_40005454的博客 6384
上一篇: 使用JYaml实现Java对象与Yaml间的序列化与反序列化
下一篇: java8新的时间日期库及使用示例
Tracyclock
博客等级 码龄10年 14粉丝 41原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值