区别

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中#和$的区别详解相关推荐

  1. mybatis select语句会默认带排序吗_10月阿里最新38道Java面试题解析(MyBatis+消息队列+Redis)...

    MyBatis面试题 一.谈谈你对 MyBatis 的理解? 1. Mybatis是一个半ORM(对象关系映射)框架,它内部封装了 JDBC,开发时只需要关注 SQL 语句本身,不需要花费精力去处理加 ...

  2. mybatis date类型映射_Mybatis中类型映射处理器详解

    上一篇梳理了Configuration初始化分析,今天继续typeHandlers部分. 数据库厂商标识 接上一篇文章分析,下一个解析的是databaseIdProvider节点,这个节点好理解,从字 ...

  3. latex中if语句怎么用_如果 (If) | Python 中的条件控制语句详解

    点击上方"可乐python说"关注公众号,点击右上角 "..."选择"设为星标"第一时间获取最新分享! 前言 Hi,大家好,我是可乐,生活中 ...

  4. SpringBoot默认包扫描机制及@ComponentScan指定扫描路径详解

    SpringBoot默认包扫描机制及@ComponentScan指定扫描路径详解 SpringBoot默认包扫描机制 标注了@Component和@Component的衍生注解如@Controller ...

  5. MySql基础篇---002 SQL之SELECT使用篇: 基本的SELECT语句,运算符,排序与分页,多表查询,单行函数,聚合函数,子查询

    第03章_基本的SELECT语句 讲师:尚硅谷-宋红康(江湖人称:康师傅) 官网:http://www.atguigu.com 1. SQL概述 1.1 SQL背景知识 1946 年,世界上第一台电脑 ...

  6. mybatis 鉴别其_MyBatis之Mapper XML 文件详解(四)-JDBC 类型和嵌套查询

    MyBatis之Mapper XML 文件详解(四)-JDBC 类型和嵌套查询 白玉 IT哈哈 支持的 JDBC 类型 为了未来的参考,MyBatis 通过包含的 jdbcType 枚举型,支持下面的 ...

  7. Hive中的四种排序方式(order by,sort by,distribute by,cluster by)使用与区别详解

    在平时的Hive数仓开发工作中经常会用到排序,而Hive中支持的排序方式有四种,这里结合具体的案例详细介绍一下他们的使用与区别: order by sort by distribute by clus ...

  8. 一、MySQL查询学习笔记(基础查询、条件查询、排序查询、常见函数、分组查询 详解)

    DQL语言的学习 一.基础查询 语法: **SELECT 要查询的东西 [FROM 表名];**类似于Java中 :System.out.println(要打印的东西); 特点: ①通过select查 ...

  9. 一文带你理解云原生 | 云原生全景图详解

    关注「开源Linux」,选择"设为星标"回复「学习」,有我为您特别筛选的学习资料~ 1带你了解云原生技术图谱 如果你研究过云原生应用程序和相关技术,大概率你遇到过 CNCF 的云原 ...

最新文章

  1. linux 信号signal和sigaction理解
  2. 人人想健康!但,健康的,最主要因素,是什么?
  3. 计算机教室布线施工方案,最新计算机教室施工方案.docx
  4. Java实现网页滑动验证与短信验证码案例精析
  5. MacBook苹果系统下安装Windows XP双系统多分区问题解决
  6. Tomcat虚拟主机配置示例
  7. Mecanim动画系统学习笔记
  8. android+清除循环动画,android自定义View之(4)-一键清除动画
  9. Licheepi zero SPI Flash 系统编译
  10. chorme vue中使用audio自动播放问题
  11. 微信无法连接到服务器的原因
  12. C语言基础-函数的概念
  13. 据说,年薪百万的程序员,都是这么开悟的
  14. java 获取星期_java中如何获取日期时间中的星期几?
  15. 【电磁场计算】磁偶极子在外磁场中的受力
  16. mysql数据库 mdf 文件_如何连接到MDF数据库文件?
  17. 大数据 Hadoop 生态体系介绍
  18. OpenCV二值化后 按面积选区域 填充孔洞 排序
  19. Flink1.14提交任务报错classloader.check-leaked-classloader问题解决
  20. Elasticsearch 设置用户名密码认证(亲测)

热门文章

  1. 项目: 图片放大缩小。
  2. 简单易懂的多线程(通过实现Runnable接口实现多线程)
  3. 奖客富翁系统python_作业 2018-12-28 20.1 奖客富翁
  4. 【Git】本地仓库上传到github免密操作
  5. 别再用 httpClient了,快试试这款优雅的 HTTP 客户端工具!
  6. mybatis教程--映射之一对一查询
  7. 13-MySQL面向对象设计:数据表与Java对象对应关系
  8. oracle导出表格式csv,Oracle数据库文件导出为CSV格式的方法
  9. 爬虫实现csdn文章一键(批量)更换阅读类型(全部可见、粉丝可见、vip可见)
  10. 设置Eclipse中的Courier New字体