Mybatis中的mapper.xml里面${} 和 #{}区别与用法

Mybatis——半自动化的ORM框架 Mybatis自己的知识梳理 阅读详情

Mybatis 的Mapper.xml语句中parameterType向SQL语句传参有两种方式:#{}和${}

  • #{}方式能够很大程度防止sql注入。
  • $方式无法防止Sql注入。
  • $方式一般用于传入数据库对象,例如传入表名.
  • 一般能用#的就别用$.

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

${}可以将parameterType 传入的内容拼接在sql中且不进行jdbc类型转换。 
${}可以接收简单类型值或pojo属性值,如果传入简单类型值,${}括号中名称只能是value。

select * from goods 

<if test="orderArgs!=null">

    order by #{orderArgs}

</if>

结果没有任何效果。最后把 #{} 改成 ${},结果正确。

动态 SQL 是 mybatis 的强大特性之一,也是它优于其他 ORM 框架的一个重要原因。mybatis 在对 sql 语句进行预编译之前,会对 sql 进行动态解析,解析为一个 BoundSql 对象,也是在此处对动态 SQL 进行处理的。在动态 SQL 解析阶段, #{ } 和 ${ } 会有不同的表现。
select * from goods order by  #{orderArgs}; 
#{} 在动态解析的时候, 会解析成一个参数标记符。就是解析之后的语句是:

select * from goods order by ?;  #{}在代入参数时,自动在参数前后加上字符串,最终形成的SQL语句就成了:

select * from goods order by "price",参数本来是列名,现在变成了一个字符串,结果自然不正确了。

那么我们使用 ${}的时候

select * from goods order by ${orderArgs}; 

${}在动态解析的时候,会将我们传入的参数当做String字符串填充到我们的语句中,就会变成下面的语句
selecxt * from goods order by price
预编译之前的 SQL 语句已经不包含变量了,完全已经是常量数据了。相当于我们普通没有变量的sql了,加了双引号,参数变成了一个字符串。
综上所得, ${ } 变量的替换阶段是在动态 SQL 解析阶段,而 #{ }变量的替换是在 DBMS 中。

对于order by排序,使用#{}将无法实现功能,应该写成如下形式:

ORDER BY ${columnName}

  另外,对于mybatis逆向工程生成的代码中,进行模糊查询调用andXxxLike()方法时,需要手动加%,如下:

CustomerExample customerExample=new CustomerExample();
        customerExample.or().andNameLike("%"+name+"%");
MyBatis mapper.xml深度解析:从基础语法到高级实战技巧 在Java持久层框架中,SQL映射是连接应用程序与数据库的核心桥梁。MyBatis通过其独特的mapper.xml配置文件,实现了SQL语句与Java方法的解耦,提供了灵活的参数传递和结果映射机制。其技术价值在于既保留了原生SQL的精确控制能力,又通过动态SQL标签简化了复杂查询逻辑的构建,有效防止了SQL注入风险。在实际应用场景中,mapper.xml常用于处理多表关联查询、分页优化、批量操作等数据访问需求。本文聚焦于mapper.xml的实战应用,深入探讨了动态SQL的编写技巧和结果映射的配置细节,特别 阅读详情

相关推荐

海康VisionMaster图形定位实战:十字形Mark点精准匹配技巧

本文深入解析了海康VisionMaster图形定位模块在工业自动化中实现十字形Mark点精准匹配的实战技巧。文章从ROI设置、核心参数调优(如定位方式、尺度模式、对比度阈值)到工业场景应用与避坑指南,系统性地分享了提升匹配成功率和稳定性的关键步骤,帮助工程师应对复杂现场环境,实现高效、可靠的视觉定位。

weixin_29285605的博客 258

XML转义字符

编写XML代码经常遗漏的常识:   原文:http://jaenson.iteye.com/blog/945469 XML实体中不允许出现"&",""等特殊字符,否则XML语法检查时将出错,如果编写的XML文件必须包含这些字符,则必须分别写成"&","<",">"再写入文件中。例如,如果在XML文档中使用类似"  Java代码    age 30

superbigcupid的专栏 984

bcftools学习笔记(一)

欢迎关注&#34;生信修炼手册&#34;!本篇主要介绍index, view, query, sort, reheader这五个命令。1. indexindex命令用于对VCF文件建立索...

庐州月光的博客 6010

mybatis #{}和${}的区别、传参、基本语法

1 #{}和${}的区别、及注入问题 (1) 区别: 首先清楚一点,动态 SQL 是 mybatis 的强大特性之一,在 mapper 中定义的参数传到 xml 中之后,在查询之前 mybatis 会对其进行动态解析,#{} 和 ${} 在预编译中的处理是不一样的: 例如:select * from t_user where userName = #{name}; #{...

wutongyuWxc的博客 4554

鸿蒙平板PC应用开发:在termux中安装ubuntu

打开AVNC点击右上角的设置图标,然后点击 输入 , 点击手势栏目中的 单指轻扫 ,选择滚动远程内容

DMZDAMS的博客 5200

如何根据芯片手册时序图编写驱动程序

如何根据芯片手册时序图编写驱动程序 对于电子开发者来说,刚刚拿到一个芯片,常用的芯片可以参考网上的例程来做深入了解,对于一个不常用的芯片来说,Datasheet几乎是使用芯片的唯一的资料,所以根据Datasheet时序图写出对应的驱动程序就尤为重要。 本文根据一个简单的例子来阐述根据时序图来编写对应的程序过程。旨在讲解对于初学者应该怎么利用芯片的时序图编写符合要求的底层驱动程序(老鸟请跳过)。 下载芯片的Datasheet,(个人常用http://www.21icsearch.com/)如..

weixin_36447711的博客 1万+

XML文件中“&“、“>“、“<“符号需要转义

在XML文件中,jdbc的url中的‘&’符号会报有红色错误,通常需要 转义成 &amp;来使用 <property name="url" value="jdbc:mysql://localhost:3306/mybatis?serverTimezone=UTC&amp;useUnicode=true&amp;characterEncoding=utf8&amp;useSSl=false"/> ...

键盘烫手的博客 9330

数据结构之栈(Stack)的实现详解

堆栈是一种线性数据结构,其插入新元素和删除现有元素都发生在堆栈的顶部。栈(Stack)按照"后进先出"(Last-In-First-Out,LIFO)的原则存储和访问数据。栈类似于现实生活中的堆叠物体,比如一摞书或者一堆盘子。

swadian2008的博客 3812

xml中${}的含义

在applicationContext.xml文件中,使用 ${xxx} 表示的是:调用某个变量,该变量的名称就是{xxx}里面的"xxx"。

qiangruixin5584的博客 5434

【PCL点云配准】位姿估计

本文介绍了PCL(Point Cloud Library)中TransformationEstimation模块的核心算法原理和实现方法。该模块通过多种子类(如SVD、LM、双四元数等)提供点云配准功能,支持2D/3D刚性变换估计。主要内容包括:1)各类变换估计算法的数学原理和实现细节;2)点对点/点对面两种误差度量方法;3)线性闭式解和非线性迭代两种求解方式;4)变换验证机制;5)基于三点法的完整代码示例。该模块广泛应用于SLAM、三维重建等领域,为点云配准提供了高效可靠的解决方案。

yijiujiusan的博客 241

分布式训练中All-Reduce、All-Gather、Reduce-Scatter原理

Reduce-Scatter = 先对所有进程的数据做 Reduce(如 sum / mean),再把结果“切分”分发给各进程。(是 Reduce + Scatter 的融合操作。

comli_cn的博客 340

xml 中的转义字符

普通表达式 OGNL表达式 < &lt; > &gt; & amp; ’ &apos; " &quot xml可以直接使用 <![CDATA[内容]]> 来转换普通表达式,例如 < 可以写成 <![CDATA[<]]>

Kurumi 401

2024年游戏策划最新面试题及答案

1. **游戏策划**:负责游戏设计和开发的创意和技术过程。2. **主要职责**:设计游戏玩法、故事、角色、世界等。4. **游戏机制**:定义玩家如何与游戏世界互动的规则。13. **引人入胜的角色**:深入的背景故事、个性特征。3. **游戏平衡**:确保游戏公平、有趣且具有挑战性。7. **RPG特点**:角色发展、故事驱动、玩家选择。12. **关卡设计技巧**:挑战性、流动性、视觉引导。11. **游戏关卡设计**:创建游戏世界的不同阶段。5. **游戏循环**:玩家在游戏中重复的行为模式。

guo162308的博客 2320

mybatis mapper.xml中#{} 与${}用法区别

1、能使用 #{ } 的地方就用 #{ } 首先这是为了性能考虑的,相同的预编译 sql 可以重复利用。其次,${ } 在预编译之前已经被变量替换了,这会存在 sql 注入问题。例如,如下的 sql: [java] view plain copy   select * from ${tableName} where name = #{name}  

默默无闻的码农 5129

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Mybatis mapper.xml里面${} 和 #{}区别与用法

Mybatis 的Mapper.xml语句中parameterType向SQL语句传参有两种方式:#{}和${} #{}方式能够很大程度防止sql注入。 $方式无法防止Sql注入。 $方式一般用于传入数据库对象,例如传入表名. 一般能用#的就别用$. #{}表示一个占位符即?,可以有效防止sql注入。在使用时不需要关心参数值的类型,mybatis会自动进行java类型和jdbc类型的转换。 #{}可以接收简单类型值或pojo属性值,如果传入简单类型值,#{}括号中可以是任意名称。 ${}可以将param

qq_43589143的博客 3600

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

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

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

kezhou的博客 794

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

SpringBoot中Mapper.xml的入参方式

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

IT飞牛 2126

java $和$$的区别_Mabitis中的#与$符号区别及用法介绍

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

weixin_34748612的博客 522

在mapper的xml文件中,#{}和${}的区别,resultMap和resultType的区别

总结,当是参数时,使用#{},可防止sql注入,当要动态生成sql时,用${}使用#{}的本质是将参数进行预编译,而非以字符串直接与sql语句拼接。当字段名与类属性名一至时,直接resultType。假设column为name,value为john。resultMap和resultType的区别。mybatis会进行编译处理,把他当成参数。否则自定义一个resultMap。

m0_53972481的博客 386

一、MyBatis 基础概念相关

MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作,使得开发人员能够更专注于 SQL 语句本身以及业务逻辑,通过简单的 XML 配置文件或者注解就能将 Java 对象与数据库表中的记录进行映射关联。

SOS5418818845的博客 626

web——【MyBatis&Others】

MyBatis是一款半自动的ORM持久层框架,具有较高的SQL灵活性,支持高级映射(一对一、一对多),动态SQL,延迟加载和缓存等特性,但数据库无关性较低对象关系映射(在Java对象和数据库的关系模型之间建立一种对应关系)半自动的ORM框架: 需要手动编写SQL语言,具有较高的灵活性,也因此切换数据库时,SQL语句可能就需要重写。但相较于JDBC,提供了输入映射和输出映射,设置SQL参数,结果封装、关联查询和动态SQL功能,提高了开发效率.

weixin_44274319的博客 222

Day_58_Mybatis_02

一、常用标签介绍 1.配置属性 properties(属性) property settings(全局配置参数) setting typeAliases(类型别名) typeAliase package typeHandlers(类型处理器) objectFactory(对象工厂) plugins(插件) environments(环境集合属性对象) environment(环境子属性对象) transactionManager(事务管理) dataSource(数据源) m

DuckBuBi 952

Spring+SpringMVC+MyBatis框架原理及其使用 || MyBatis篇

MyBatis简介: MyBatis是一个优秀的持久层框架,它对jdbc的操作数据库的过程进行封装,使开发者只需要关注 SQL 本身,而不需要花费精力去处理例如注册驱动、创建connection、创建statement、手动设置参数、结果集检索等jdbc繁杂的过程代码。 Mybatis通过xml或注解的方式将要执行的各种statement(statement、preparedStatemn...

qq_41166135的博客 886

MyBatis最简单讲解

首先对MyBatis框架做一个简单的介绍,mybatis就是一个持久层的框架,对JDBC进行的封装,用于操作数据库的框架,是一个ORM(对象关系映射)框架的一种。

cxyzhaosi的博客 806

spring练习——构建项目时候的注意点+Mapper理解+MyBatis学习点总结+报错学习

如果你的 MySQL 版本是8.0+,且url中没加会报时区错误,你现在的配置里有,这点做得很好,不需要动。改完之后启动项目,如果报连不上,优先检查密码和数据库名(springboot-vue / demo_db)是否真实存在。你可以先在命令行用试试能不能登进去。😊看日志的先后顺序:先看异常类型 → 找→ 找指向你自己代码的第一个at行。at行里带文件名+行号直接点过去看。跳过噪音这些框架内部的行一般不用管,重点看你项目包名()下的行。陌生英文别慌:抓住异常类型名 + 最后一句描述。

2501_93775482的博客 269

Java-MyBatis学习笔记

MyBatis是一款简化数据库操作的持久层框架,需要自行编写SQL语句。通过Mapper接口和XML文件实现数据操作,基本使用流程包括导入依赖、准备实体类、创建Mapper接口和配置文件等。支持多种参数传递方式(简单类型、实体对象、Map等)和结果映射(单个对象、List、Map等)。提供动态SQL功能,包括if/where/set/trim/choose等标签。支持多表映射(对一、对多关系)、批量操作和逆向工程等高级特性,可通过插件扩展功能。MyBatis在简化JDBC操作的同时保留了SQL灵活性,是轻量

suibianlou的博客 683
上一篇: 多线程的状态流转
下一篇: SpringMVC
GoldWashing
博客等级 码龄8年 18粉丝 22原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值