#和$的区别

Mybatis中参数传递可以通过#和$设置。它们的区别是什么呢?

#

Mybatis在解析SQL语句时,sql语句中的参数会被预编译为占位符问号?

$

Mybatis在解析SQL语句时,SQL语句中的参数会被当做字符串拼接SQL。

使用#能够防止SQL注入攻击。

那么什么是预编译?

什么是预编译

通常,一条sql在db接收到最终执行完毕返回需要经历三个阶段:

  1. 词法和语义解析
  2. 优化sql语句,制定执行计划
  3. 执行并返回结果

但是如果同样一条SQL,如果只是参数值变了,不需要每次都语法语义解析、优化、制定执行计划,

所以可以将这类SQL语句中的值用占位符替代,不需要每次编译,可以直接执行

执行的时候,直接将每次请求的不同的值设置到占位符的位置。

可以视为将sql语句模板化或者说参数化。

如果觉得不好理解,可以看看MySQL的预编译功能

预编译的优势

预编译可以缓存SQL,重复利用,

可以优化SQL的执行

预编译的缺点(什么场景不适合)

传入表名等数据库对象时,无法使用#,因为使用#占位符,会将表名加上引号,无法执行。

其他场景,能使用#占位符就尽量使用

参考:

预编译语句(Prepared Statements)介绍,以MySQL为例

# 与 $ 区别以及 sql 预编译

从Mybatis中#和$的区别到SQL预编译的更多相关文章

  1. mybatis深入理解之 # 与 $ 区别以及 sql 预编译

    mybatis 中使用 sqlMap 进行 sql 查询时,经常需要动态传递参数,例如我们需要根据用户的姓名来筛选用户时,sql 如下: select * from user where name = ...

  2. mybatis之 # 与 $ 区别以及 sql 预编译

    mybatis 中使用 sqlMap 进行 sql 查询时,经常需要动态传递参数,例如我们需要根据用户的姓名来筛选用户时,sql 如下: select * from user where name = ...

  3. mybatis深入理解(一)之 # 与 $ 区别以及 sql 预编译

    mybatis 中使用 sqlMap 进行 sql 查询时,经常需要动态传递参数,例如我们需要根据用户的姓名来筛选用户时,sql 如下: select * from user where name = ...

  4. MyBatis中#{ }和${ }的区别,数据库优化遵循层次和查询方法

    MyBatis中#{ }和${ }的区别详解 1.#将传入的数据当成一个字符串,会对自动传入的数据加一个 双引号. 例如order by #id#,如果传入的值是111,那么解析成sql时变为orde ...

  5. mybatis中的#{}和${}区别

    mybatis中的#{}和${}区别 2017年05月19日 13:59:24 阅读数:16165 1. #将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号.如:order by #use ...

  6. Mybatis笔记八:MyBatis中#{}和${}的区别

    先给大家介绍下MyBatis中#{}和${}的区别,具体介绍如下: 1. $将传入的数据直接显示生成在sql中 2. #方式能够很大程度防止sql注入. 3.$方式无法防止Sql注入. 4.$方式一般 ...

  7. mybatis中_parameter使用和常用sql

    mybatis中_parameter使用和常用sql   mybatis中_parameter使用和常用sql 在用自动生成工具生成的mybatis代码中,总是能看到这样的情况,如下: <sel ...

  8. 【#和$】MyBatis中#和$的区别

    一.结论 #{}:占位符号,好处防止sql注入 ${}:sql拼接符号 二.具体分析 动态 SQL 是 mybatis 的强大特性之一,也是它优于其他 ORM 框架的一个重要原因.mybatis 在对 ...

  9. 你真的了解MyBatis中${}和#{}的区别吗?

    动态sql是mybatis的主要特性之一.在mapper中定义的参数传到xml中之后,在查询之前mybatis会对其进行动态解析. mybatis提供了两种支持动态sql的语法:#{} 和 ${}. ...

随机推荐

  1. selectnodes和selectSingleNode

    selectnodes: selectNodes和ChildNodes获取XML内容数组的差异性 我们在使用XML进行查询或者变更数据的时候,需要注意两个很相近但结果相差很大的用法,如下: 1: Xm ...

  2. java 异常体系详细介绍

    一.异常概述与异常体系结构 异常:在Java语言中,将程序执行中发生的不正常情况称为"异常".(开发过程中的语法错误和逻辑错误不是异常). Java把异常当作对象来处理,并定义一个 ...

  3. SSM框架之AOP、动态代理、事务处理相关随笔

    AOP: 原理:底层利用动态代理(两种动态代理技术都使用了) 两种实现方案: 第一种:JDK动态代理技术 实现的InvocationHandler接口,要想实现某个类的动态代理对象,必须有接口有实现类 ...

  4. C++ 线性表实现

    List.h #pragma once #include "targetver.h" #include <stdio.h> #include <tchar.h&g ...

  5. 01.AutoMapper 之约定(Conventions)

    转载(https://www.jianshu.com/p/d4c472d95da4)   约定(Conventions) 条件对象映射器 条件对象映射器根据源类型和目标类型之间的条件生成新类型映射. ...

  6. 梯度下降算法(Gradient descent)GD

    1.我们之前已经定义了代价函数J,可以将代价函数J最小化的方法,梯度下降是最常用的算法,它不仅仅用在线性回归上,还被应用在机器学习的众多领域中,在后续的课程中,我们将使用梯度下降算法最小化其他函数,而 ...

  7. UITextView学习笔记

    =================================== UITextView =================================== 1.UITextView常用属性 ...

  8. i3wm 配置刷新生效 和 使用mod快捷打开 ranger 小贴士

    在某处学习到了如何配置i3wm后,对其极感兴趣. 学习到的经验总结: Linux中的各种命令操作其实都要首先查阅 man command  或者  command -h  或者  command -- ...

  9. Django中间件拦截未登录url

    1.利用装饰器在视图中拦截未登录的url @login_required(login_url='/user/login/') def homepage(request): pass 这种方法适合于程序 ...

  10. 一、ASP.NET Iframework_SignalR集线器类(v2)

    一.新建项目,选MVC项目默认 添加mvc文件夹和核心引用 二.添加SignaIR包 SignalR的准备:NuGet包管理器搜索:工具——>库程序包管理器——>Microsoft.Asp ...