Mybista ${} 和 #{} 的区别

爱思考的程序员

最近在开始思考MyBatis中的一些细节,遇到不会的就找博客,发现这部分内容有所欠缺。
虽然在这条路上我还是个新手,但每次遇到问题最常帮助我的都是这些陌生人的博客,
这次就由我来吧。欢迎转载,请标明出处。有名字就更好了

他俩能干什么

#{}${}的使用
#{}是占位符填充,如下当我们执行sql语句时会将sql语句中的 #{id}替换成 ?号

UserDao.java 接口文件:User queryUserByUsername(@Param("username") String username);
UserDaoMapper.xml 映射文件:
 <select id="queryUserByUsername" resultMap="user_resultMap">select id,username,password,gender,regist_timefrom t_userwhere username=#{username}</select>

执行后的sql语句:

	select id,username,password,gender,regist_timefrom t_userwhere username=?

${}是字符串拼接,多数情况下使用与#{}没区别,但是有下面几点要注意:

注意点

如果这个列是字符类型,我们要加引号,如where username=' u s e r n a m e ′ 如果传入参数是简单类型像是数字、字符串等要在 U s e r D a o . j a v a 中加 @ P a r a m ( " u s e r n a m e " ) 否则 {username}' 如果传入参数是简单类型像是数字、字符串等要在UserDao.java中加@Param("username")否则 username如果传入参数是简单类型像是数字、字符串等要在UserDao.java中加@Param("username")否则{}取值会有问题
如果是一个引用类型的实例对象参数,那我们可以不加,如:
User queryUserByUsername(@Param (“username”) User user);
存在问题

sql注入风险

使用${}当拼接sql片段时,有sql注入风险,外界参数会改变原有sql的语义,如:

 //sql注入String username = "zhangsan' or '1'='1";

注入后的sql语句:

 select id,username,password,gender,regist_timefrom t_userwhere username='zhangsan' or '1'='1'

这就导致了哪怕你数据库中没有这个用户名也能成功查询到数据。而使用 #{ } 它会将sql语义过滤,将 zhangsan’ or ‘1’='1 当成一个普通字符串,可以规避sql注入的风险。所以原则上能不用sql拼接就不用sql拼接,那为什么还要有 ${ } 的存在呢?是因为在有些场景中 #{ } 不能使用,如我们要给查询到的数据进行排序

 String rule="desc";String sql="select * from t_user order by id ?";

当我们在占位符上填充desc时,会导致sql语句语法出错,这就涉及了占位符的使用原则

 //原则:填充数据,要和列相关select * from t_user where id=?inseret into t_user values(?,?,?)update t_user set username?,password=?

显然desc与列无关,就会导致报错

小技巧

MyBatisTest.java 测试方法@Testpublic void test(){UserDao mapper = MyBatisUtil.getMapper(UserDao.class);Integer sig=0;   //0:desc  1:ascif(sig==0){mapper.queryUserUsers("desc");}else{mapper.queryUserUsers("asc");	} }        

使用 ${}拼接sql片段的时候,用户传的内容只是一个依据,我们可以通过这个依据进行判断,这时我们就能拼接自己定义的内容,而不是用户输入的内容。这样即使我们拼接了语句也不会被注入,所以这是一个使用 ${ }时非常重要的小技巧

优势与劣势
优势 劣势
${ }字符串拼接 可以随意拼接 有sql注入的风险
{ }占位符 | 规避sql注入风险|要和列相关的位置才可以使用

总结

当我们想要去取值时,能用 #{ }就尽量用 #{ },什么时候不能用 #{ }呢?如果这个位置不是为某个列做值的相关,而是要在某些sql片段上进行动态填充,那我们必须用 ${ }来取值。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/27951.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring Cloud Stream整合RocketMQ

Spring Cloud Stream整合RocketMQ 这里书接上回&#xff0c;默认你已经搭建好了RocketMQ主从异步集群&#xff0c;前面文章已经介绍过搭建方法。 1、Spring Cloud Stream介绍 Spring Cloud Stream是一个框架&#xff0c;用于构建与共享消息系统连接的高度可扩展的事件驱动微服…

MapReduce Simplified Data Processing on Large Clusters 论文笔记

2003年USENIX&#xff0c;出自谷歌&#xff0c;开启分布式大数据时代的三篇论文之一&#xff0c;作者是 Jeffrey 和 Sanjay&#xff0c;两位谷歌巨头。 Abstract MapReduce 是一种变成模型&#xff0c;用于处理和生成大规模数据。用户指定 map 函数处理每一个 key/value 对来…

“论面向对象的建模及应用”必过范文,突击2024软考高项论文

论文真题 软件系统建模是软件开发中的重要环节&#xff0c;通过构建软件系统模型可以帮助系统开发人员理解系统&#xff0c;抽取业务过程和管理系统的复杂性&#xff0c;也可以方便各类人员之间的交流。软件系统建模是在系统需求分析和系统实现之间架起的一座桥梁&#xff0c;…

C#操作MySQL从入门到精通(15)——分组数据

前言 我们有时候需要对数据库中查询的数据进行分组,所谓分组就是将相同的数据分为一组,本次测试使用的数据库数据如下: 1、分组 分组使用group by关键词,下面的代码的意思是对查询的结果按照student_age进行分组,student_age相同的划分为同一组 string sql = string.E…

vue3-sfc-loader动态加载一个异步vue组件生成cesium画面

在 Vue.js 3 中&#xff0c;使用 vue3-sfc-loader 可以动态加载异步的 Vue 单文件组件&#xff08;.vue 文件&#xff09;。这个工具允许你在运行时根据需要加载和解析 .vue 文件&#xff0c;使得组件的加载变得更加灵活和动态。 下面是一个简单的示例&#xff0c;演示如何使用…

没有学历,没有基础,是否能成为一个嵌入式工程师?

在开始前刚好我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「嵌入式的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01; 嵌入式其实涵盖的知识非常…

day32贪心算法part02| 122.买卖股票的最佳时机II 55. 跳跃游戏 45.跳跃游戏II

122.买卖股票的最佳时机II 本题解法很巧妙&#xff0c;大家可以看题思考一下&#xff0c;在看题解。 题目讲解 | 题目链接 class Solution { public:int maxProfit(vector<int>& prices) {int result 0;for (int i 1; i < prices.size(); i) {// 直接看两天之…

CSS期末复习速览(一)

1.标签选择器&#xff0c;格式&#xff1a;标签{ …… }&#xff0c;例如div{ color&#xff1a;pink&#xff1b; }&#xff0c;代表全部div中的字都是pink色 2.类选择器&#xff0c;格式&#xff1a;.类名{……}&#xff0c;通过class"类名"调用&#xff0c;例如.…

Adobe Illustrator 基础学习

基本工具栏 T 为文字状态&#xff0c;用于输入文本&#xff0c;默认填充符是 滚滚长江东逝水xxx。 空心箭头是拖动&#xff0c;要移动任何东西的位置都需要这个工具&#xff0c;快捷键是英文的 v 上方纯色填充的矩形为图形绘制工具&#xff0c;右键点击可以展开折叠的多边形、…

Asp.Net Core 读取配置接口 IOptions、IOptionsMonitor以及IOptionsSnapshot

&#x1f340;简介 Options是.net Core Web api框架自带的功能&#xff0c;Options模式通过定义强类型的类来表示相关配置设置的集合&#xff0c;使得配置管理更为结构化和类型安全。 IOptions、IOptionsMonitor和IOptionsSnapshot是用于处理配置的依赖注入接口。这些接口允许…

微服务SpringCloud ES分布式全文搜索引擎简介 下载安装及简单操作入门

Elasticsearch ES简介 分布式全文搜索引擎 我们天天在用ES 搜索的时候 要与多个信息进行匹配查找 然后返回给用户 首先 ES会将数据库中的信息 先进行一个拆分 这个叫做分词 是按照词语关键词拆的 然后就能进行搜索的时候匹配对应的id 每一个关键字对应若干id 每一个…

flink standalone部署模式

standalone模式可以在单台机器以不同进程方式启动&#xff0c;也可以以多机器分布式方式启动。 任务的提交模式有三种&#xff1a;application mode、session model、per-job mode&#xff08;1.4x版本后过时&#xff09;。 注意区分任务的提交模式与集群的部署模式区别。 以…

C++ 18 之 函数的重载

c18函数的重载.cpp #include <iostream> #include <string.h> using namespace std;void fun4(int a) {cout << "int a: "<< a << endl; } void fun4(double a) {cout << "double a: " << a << endl; }v…

后端|压缩Base64图片的两种方式

Base64是一种将二进制数据编码为ASCII字符串的方法。它通过将3个字节的二进制数据转换为4个可打印字符的ASCII字符&#xff0c;从而将二进制数据转换为可传输的文本格式。Base64编码常用于传输图片或音频文件。Base64编码可以保证数据在传输过程中不丢失&#xff0c;同时可以避…

24年河北自考报名流程详细教程汇总

2024年河北自考本科报名马上就要开始了&#xff0c;想要参加考试报名的同学&#xff0c;提前看一下&#xff0c;了解一下报名流程&#xff0c;准备一些报名材料。 报名时间&#xff1a;2024年1月5日—10日8:00—22:00 考试时间&#xff1a;2024年4月13日—14日 报名照要求&…

ControlNet作者新作Omost 一句话将LLM的编码能力转化为图像生成能力,秒变构图小作文,再也不用为不会写提示词担心了!

近日&#xff0c;ControlNet的作者推出了一个全新的项目—Omost。Omost是一个将LLM的编码能力转化为图像生成能力的项目。对现有图像模型的提示词理解有着巨大的帮助。通过很短的提示词&#xff0c;就可以生成非常详细并且空间表现很准确的图片。 完美解决新手小白不会写提示词…

[数据集][目标检测]减速带检测数据集VOC+YOLO格式5400张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;5400 标注数量(xml文件个数)&#xff1a;5400 标注数量(txt文件个数)&#xff1a;5400 标注…

运营必看!精细化运营的四个通用策略

在当今竞争激烈的市场环境中&#xff0c;精细化运营是企业取得成功的关键。 接下来&#xff0c;就和大家聊聊精细化运营的四个通用策略&#xff0c;帮助大家更好地满足不同群体的需求&#xff0c;提高用户满意度。 1、心智差异 由于每个人的背景、经历和价值观都不同&#x…

使用docker构建java应用

1、docker简介 Docker是一个开源的容器化平台&#xff0c;可以帮助开发人员将应用程序及其依赖项打包成一个可移植的容器。容器化是一种轻量级的虚拟化技术&#xff0c;可以使应用程序在不同的操作系统和环境中具有一致的运行方式。 使用Docker带来的好处包括&#xff1a; 简…

军事武器3D数字化交互展示创作平台大大降低成本

军事力量和装备是一个国家国防安全的重要支柱&#xff0c;这在全球范围内得到广泛认同&#xff0c;为了让入伍的新兵能快速熟悉和掌握武器装备操作流程&#xff0c;基于创新型的华锐3D云展平台工具&#xff0c;搭建的3D军事武器展示搭建编辑器&#xff0c;让部队的军事武器展示…