从Mybatis中#和$的区别到SQL预编译
#和$的区别
Mybatis中参数传递可以通过#和$设置。它们的区别是什么呢?
#
Mybatis在解析SQL语句时,sql语句中的参数会被预编译为占位符问号?
$
Mybatis在解析SQL语句时,SQL语句中的参数会被当做字符串拼接SQL。
使用#能够防止SQL注入攻击。
那么什么是预编译?
什么是预编译
通常,一条sql在db接收到最终执行完毕返回需要经历三个阶段:
- 词法和语义解析
- 优化sql语句,制定执行计划
- 执行并返回结果
但是如果同样一条SQL,如果只是参数值变了,不需要每次都语法语义解析、优化、制定执行计划,
所以可以将这类SQL语句中的值用占位符替代,不需要每次编译,可以直接执行
执行的时候,直接将每次请求的不同的值设置到占位符的位置。
可以视为将sql语句模板化或者说参数化。
如果觉得不好理解,可以看看MySQL的预编译功能
预编译的优势
预编译可以缓存SQL,重复利用,
可以优化SQL的执行
预编译的缺点(什么场景不适合)
传入表名等数据库对象时,无法使用#,因为使用#占位符,会将表名加上引号,无法执行。
其他场景,能使用#占位符就尽量使用
参考:
预编译语句(Prepared Statements)介绍,以MySQL为例
从Mybatis中#和$的区别到SQL预编译的更多相关文章
- mybatis深入理解之 # 与 $ 区别以及 sql 预编译
mybatis 中使用 sqlMap 进行 sql 查询时,经常需要动态传递参数,例如我们需要根据用户的姓名来筛选用户时,sql 如下: select * from user where name = ...
- mybatis之 # 与 $ 区别以及 sql 预编译
mybatis 中使用 sqlMap 进行 sql 查询时,经常需要动态传递参数,例如我们需要根据用户的姓名来筛选用户时,sql 如下: select * from user where name = ...
- mybatis深入理解(一)之 # 与 $ 区别以及 sql 预编译
mybatis 中使用 sqlMap 进行 sql 查询时,经常需要动态传递参数,例如我们需要根据用户的姓名来筛选用户时,sql 如下: select * from user where name = ...
- MyBatis中#{ }和${ }的区别,数据库优化遵循层次和查询方法
MyBatis中#{ }和${ }的区别详解 1.#将传入的数据当成一个字符串,会对自动传入的数据加一个 双引号. 例如order by #id#,如果传入的值是111,那么解析成sql时变为orde ...
- mybatis中的#{}和${}区别
mybatis中的#{}和${}区别 2017年05月19日 13:59:24 阅读数:16165 1. #将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号.如:order by #use ...
- Mybatis笔记八:MyBatis中#{}和${}的区别
先给大家介绍下MyBatis中#{}和${}的区别,具体介绍如下: 1. $将传入的数据直接显示生成在sql中 2. #方式能够很大程度防止sql注入. 3.$方式无法防止Sql注入. 4.$方式一般 ...
- mybatis中_parameter使用和常用sql
mybatis中_parameter使用和常用sql mybatis中_parameter使用和常用sql 在用自动生成工具生成的mybatis代码中,总是能看到这样的情况,如下: <sel ...
- 【#和$】MyBatis中#和$的区别
一.结论 #{}:占位符号,好处防止sql注入 ${}:sql拼接符号 二.具体分析 动态 SQL 是 mybatis 的强大特性之一,也是它优于其他 ORM 框架的一个重要原因.mybatis 在对 ...
- 你真的了解MyBatis中${}和#{}的区别吗?
动态sql是mybatis的主要特性之一.在mapper中定义的参数传到xml中之后,在查询之前mybatis会对其进行动态解析. mybatis提供了两种支持动态sql的语法:#{} 和 ${}. ...
随机推荐
- Mysql函数----控制流函数介绍
MySQL有4个函数用来进行条件操作的,可以实现SQL的条件逻辑,允许开发者将一些应用程序业务逻辑转换到数据库后台. MySQL控制流函数: 1.CASE WHEN[test1] THEN [re ...
- MySQL服务意外停止
先说一下,发现MySQL服务停了,启动就又好了,但是好奇服务意外停止的原因,所以看了一下MySQL的错误日志. 但是到底是哪个错误导致MySQL服务意外终止,还没有定论,故有了此篇文章,还望知道原因的 ...
- QT DBUS: Not connected to D-Bus server, 注意source /etc/profile
运行环境:ARM 运行如下代码: QDBusConnection bus = QDBusConnection::sessionBus(); if(!bus.registerService(" ...
- 01:django基础篇
Django其他篇 目录: 1.1 django初探 1.2 第一个django项目 1.3 django render/redirect/HttpResponse 和 request.GET req ...
- 03-Django-models
# Models 模型 - ORM - ObjectRelationMap : 把面向对象思想转换成关系数据库思想.操作上把类等价于表格 - 类对应表格 - 类中的属性对应表中的字段 - 在应用中的m ...
- C语言scanf的返回值
#include <stdio.h> int main(void) { long num; long sum = 0L; int status; printf("Please e ...
- win10常用的dos命令
1.calc:启动计算器 2.appwiz.cpl:程序和功能 3.certmgr.msc:证书管理实用程序 4.charmap:启动字符映射表 5.chkdsk.exe:Chkdsk磁盘检查(管理员 ...
- ES6中class的实现原理
一.在ES6以前实现类和继承 实现类的代码如下: function Person(name, age) { this.name = name; this.age = age; } Person.pro ...
- OneDrive网盘资源下载教程
目录 1. 本文地址 2. 下载流程 3. 打赏&支持 1. 本文地址 博客园:https://www.cnblogs.com/coco56/p/11161530.html CSDN:http ...
- PCA原理推导及其在数据降维中的应用
一个信号往往包含多个维度,各个维度之间可能包含较强的相关性.下图表示的是一组二维信号x=(x1,x2),可以看到数据点基本上分布在x2=x1这条直线上,二者存在很强的相关性(也就是确定x1之后,就能确 ...