mybatis select语句会默认带排序吗_MyBatis中#和$的区别详解
区别
1.#将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。如:order by #user_id#,如果传入的值是111,那么解析成sql时的值为order by "111", 如果传入的值是id,则解析成的sql为order by "id".
2.将传入的数据直接显示生成在中。如:将传入的数据直接显示生成在sql中。如:orderbyuser_id$,如果传入的值是111,那么解析成sql时的值为order by user_id, 如果传入的值是id,则解析成的sql为order by id.
3.#方式能够很大程度防止sql注入。
4.$方式无法防止Sql注入。
5.$方式一般用于传入数据库对象,例如传入表名. 6.一般能用#的就别用$.
MyBatis排序时使用order by 动态参数时需要注意,用$而不是#
实例讲解:
动态 sql 是 mybatis 的主要特性之一,在 mapper 中定义的参数传到 xml 中之后,在查询之前 mybatis 会对其进行动态解析。mybatis 为我们提供了两种支持动态 sql 的语法:#{} 以及 ${}。
在下面的语句中,如果 name 的值为 zhangsan,则两种方式无任何区别:
select * from user where name = #{name};
select * from user where name = ${name};
其解析之后的结果均为
select * from user where name = 'zhangsan';
但是 #{} 和 ${} 在预编译中的处理是不一样的。
#{} 在预处理时,会把参数部分用一个占位符 ? 代替,变成如下的 sql 语句:
select * from user where name = ?;
而 ${} 则只是简单的字符串替换,在动态解析阶段,该 sql 语句会被解析成
select * from user where name = 'zhangsan';
以上,#{} 的参数替换是发生在 DBMS 中,而 ${} 则发生在动态解析过程中。
那么,在使用过程中我们应该使用哪种方式呢?
答案是:优先使用 #{}。因为 ${} 会导致 sql 注入的问题。
看下面的例子:
select * from ${tableName} where name = #{name}
在这个例子中,如果表名为
user; delete user; --
则动态解析之后 sql 如下:
select * from user; delete user; -- where name = ?;
--之后的语句被注释掉,而原本查询用户的语句变成了查询所有用户信息+删除用户表的语句,会对数据库造成重大损伤,极大可能导致服务器宕机。
但是表名用参数传递进来的时候,只能使用 ${} 。这也提醒我们在这种用法中要小心sql注入的问题。
mybatis select语句会默认带排序吗_MyBatis中#和$的区别详解相关推荐
- mybatis select语句会默认带排序吗_10月阿里最新38道Java面试题解析(MyBatis+消息队列+Redis)...
MyBatis面试题 一.谈谈你对 MyBatis 的理解? 1. Mybatis是一个半ORM(对象关系映射)框架,它内部封装了 JDBC,开发时只需要关注 SQL 语句本身,不需要花费精力去处理加 ...
- mybatis date类型映射_Mybatis中类型映射处理器详解
上一篇梳理了Configuration初始化分析,今天继续typeHandlers部分. 数据库厂商标识 接上一篇文章分析,下一个解析的是databaseIdProvider节点,这个节点好理解,从字 ...
- latex中if语句怎么用_如果 (If) | Python 中的条件控制语句详解
点击上方"可乐python说"关注公众号,点击右上角 "..."选择"设为星标"第一时间获取最新分享! 前言 Hi,大家好,我是可乐,生活中 ...
- SpringBoot默认包扫描机制及@ComponentScan指定扫描路径详解
SpringBoot默认包扫描机制及@ComponentScan指定扫描路径详解 SpringBoot默认包扫描机制 标注了@Component和@Component的衍生注解如@Controller ...
- MySql基础篇---002 SQL之SELECT使用篇: 基本的SELECT语句,运算符,排序与分页,多表查询,单行函数,聚合函数,子查询
第03章_基本的SELECT语句 讲师:尚硅谷-宋红康(江湖人称:康师傅) 官网:http://www.atguigu.com 1. SQL概述 1.1 SQL背景知识 1946 年,世界上第一台电脑 ...
- mybatis 鉴别其_MyBatis之Mapper XML 文件详解(四)-JDBC 类型和嵌套查询
MyBatis之Mapper XML 文件详解(四)-JDBC 类型和嵌套查询 白玉 IT哈哈 支持的 JDBC 类型 为了未来的参考,MyBatis 通过包含的 jdbcType 枚举型,支持下面的 ...
- Hive中的四种排序方式(order by,sort by,distribute by,cluster by)使用与区别详解
在平时的Hive数仓开发工作中经常会用到排序,而Hive中支持的排序方式有四种,这里结合具体的案例详细介绍一下他们的使用与区别: order by sort by distribute by clus ...
- 一、MySQL查询学习笔记(基础查询、条件查询、排序查询、常见函数、分组查询 详解)
DQL语言的学习 一.基础查询 语法: **SELECT 要查询的东西 [FROM 表名];**类似于Java中 :System.out.println(要打印的东西); 特点: ①通过select查 ...
- 一文带你理解云原生 | 云原生全景图详解
关注「开源Linux」,选择"设为星标"回复「学习」,有我为您特别筛选的学习资料~ 1带你了解云原生技术图谱 如果你研究过云原生应用程序和相关技术,大概率你遇到过 CNCF 的云原 ...
最新文章
- linux 信号signal和sigaction理解
- 人人想健康!但,健康的,最主要因素,是什么?
- 计算机教室布线施工方案,最新计算机教室施工方案.docx
- Java实现网页滑动验证与短信验证码案例精析
- MacBook苹果系统下安装Windows XP双系统多分区问题解决
- Tomcat虚拟主机配置示例
- Mecanim动画系统学习笔记
- android+清除循环动画,android自定义View之(4)-一键清除动画
- Licheepi zero SPI Flash 系统编译
- chorme vue中使用audio自动播放问题
- 微信无法连接到服务器的原因
- C语言基础-函数的概念
- 据说,年薪百万的程序员,都是这么开悟的
- java 获取星期_java中如何获取日期时间中的星期几?
- 【电磁场计算】磁偶极子在外磁场中的受力
- mysql数据库 mdf 文件_如何连接到MDF数据库文件?
- 大数据 Hadoop 生态体系介绍
- OpenCV二值化后 按面积选区域 填充孔洞 排序
- Flink1.14提交任务报错classloader.check-leaked-classloader问题解决
- Elasticsearch 设置用户名密码认证(亲测)
热门文章
- 项目: 图片放大缩小。
- 简单易懂的多线程(通过实现Runnable接口实现多线程)
- 奖客富翁系统python_作业 2018-12-28 20.1 奖客富翁
- 【Git】本地仓库上传到github免密操作
- 别再用 httpClient了,快试试这款优雅的 HTTP 客户端工具!
- mybatis教程--映射之一对一查询
- 13-MySQL面向对象设计:数据表与Java对象对应关系
- oracle导出表格式csv,Oracle数据库文件导出为CSV格式的方法
- 爬虫实现csdn文章一键(批量)更换阅读类型(全部可见、粉丝可见、vip可见)
- 设置Eclipse中的Courier New字体