• 1、数据类型匹配

    • #:会进行预编译,而且进行类型匹配(自动确定数据类型);
    • $:不进行数据类型匹配。
  • 2、实现方式:
    • # 用于变量替换(先生成一个占位符,然后替换)

      • select * from users  where name = #name#
      • 等效于
      • prepareStement=stmt.createPrepareStement("select * from users where name = ?")
      • prepareStement.setString (1,' 张三 ');
    • $ 的作用实际上是字符串拼接()
      • select * from users where name= $name$
      • 等效于
      • StringBuffer sb = newStringBuffer(256);
      • sb.append("select * from userswhere name=").append(name);
      • sb.toString();
  • 3、使用场景
    • -#主要用于变量的传递。# 是用 prepareStement,提升效率。#方式一般用于传入添加 / 修改的值或查询 / 删除的 where 条件
    • $ 只是简单的字符拼接而已,对于非变量部分, 只能使用 $。$ 方式一般用于传入数据库对象。例如传入表名,select  * from  $tableName$  对于不同的表执行统一的查询
  • 4、为什么会出现SQL注入?
    • $没有预编译,只是字符串替换,所以语句可能被注入,传给数据库时是多条语句;
    • 而#会先预编译,验证SQL语句,预防了问题的出现。
  • 5、关于预编译的理解:
    • 为什么需要预编译

      • JDBC 中使用对象 PreparedStatement 来抽象预编译语句,使用预编译
      • 预编译阶段可以优化 sql 的执行。
        • 预编译之后的 sql 多数情况下可以直接执行,DBMS 不需要再次编译,越复杂的 sql,编译的复杂度将越大,预编译阶段可以合并多次操作为一个操作。
      • 预编译语句对象可以重复利用。
        • 把一个 sql 预编译后产生的 PreparedStatement 对象缓存下来,下次对于同一个 sql,可以直接使用这个缓存的 PreparedState 对象。
      • mybatis 默认情况下,将对所有的 sql 进行预编译。
    • 参考附录:
      • 说明下,就是$时传给DBMS的时一个Statement对象,该对象会被DBMS先编译后执行;
      • 而#时传给DBMS的时一个PrepareStatement 对象,该对象会直接传给DBMS进行编译,DBMS执行时会直接执行编译后的语句。
  • 6、参考:
 
 
 
 

ibatis 中#和 $ 符号的区别的更多相关文章

  1. ibatis中的符号#跟$区别

    昨天一个项目中在写ibatis中的sql语句时,order by #field#, 运行时总是报错,后来上网查了查,才知道这里不该用#,而应该用$,随即查了下#与$的区别.  总结如下:  1.#是把 ...

  2. ibatis中的$和#的区别

    介绍 在Ibatis中我们使用SqlMap进行Sql查询时需要引用参数,在参数引用中遇到的符号#和$之间的区分为,#可以进行与编译,进行类型匹配,而$不进行数据类型匹配,例如: select * fr ...

  3. ibatis2.3中#和$符号的区别(转)

    在Ibatis中我们使用SqlMap进行Sql查询时需要引用参数,在参数引用中遇到的符号#和$之间的区分为,#可以进行与编译,进行类型匹配,而$不进行数据类型匹配,例如: select * from ...

  4. ibatis 中的 $和#的区别

    在sql配置中比如in(#rewr#) 与in ($rewr$) 在Ibatis中我们使用SqlMap进行Sql查询时需要引用参数,在参数引用中遇到的符号#和$之间的区分为,#可以进行与编译,进行类型 ...

  5. mybatis中#和$符号的区别

    mybatis做为一个轻量级ORM框架在许多项目中使用,因其简单的入门受到了广大开发者的热爱.在近期项目中再做一个相关的开发,碰到了#.$符号这样的问题,之前没怎么注意过,通过学习之后,有了点感悟,分 ...

  6. mybatis中#和$符号的区别(转)

    mybatis做为一个轻量级ORM框架在许多项目中使用,因其简单的入门受到了广大开发者的热爱.在近期项目中再做一个相关的开发,碰到了#.$符号这样的问题,之前没怎么注意过,通过学习之后,有了点感悟,分 ...

  7. mybatis.xml文件中#与$符号的区别以及数学符号的处理

    1.#{}表示一个占位符号,通过#{}可以实现preparedStatement向占位符中设置值,自动进行java类型和jdbc类型转换,#{}可以有效防止sql注入. #{}可以接收简单类型值或po ...

  8. MyBatis 中#和$符号的区别

    #相当于对数据 加上 双引号,$相当于直接显示数据 1. #将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号.如:order by #user_id#,如果传入的值是111,那么解析成sq ...

  9. ibatis中isNotNull与isNotEmpty区别

    isNotNull:参数不能为null,空的可以的 isNotEmpty:参数不能为null和空 那什么是空?比如String类型 String a = ""; a就是空

随机推荐

  1. Ubuntu之音效调节

    sudo add-apt-repository ppa:nilarimogard/webupd8 sudo apt-get update sudo apt-get install pulseaudio ...

  2. VC dimension(Vapnik-Chervonenkis dimension)

    二维平面的线性分类器的VC维讨论:http://www.tuicool.com/articles/JjaMfe VC维介绍:http://blog.csdn.net/lucylove3943/arti ...

  3. C++之程序时间统计类实现

    /********** TimeCounter.h huangsy13@gmail.com **********/ #ifndef TIMECOUNTER #define TIMECOUNTER #i ...

  4. JVM基础知识与配置

    1 怎样设置JVM内存设置 本文向大家简介一下进行JVM内存设置几种方法.安装Java开发软件时.默认安装包括两个目录,一个JDK(Java开发工具箱).一个JRE(Java执行环境,内含JVM),当 ...

  5. 【Java集合的详细研究3】Arrays类常用方法

    1.void sort(array)对数组array的元素进行升序排序 2.int binarySearch(array,val):查询元素值val在数组array中的下标 3.String toSt ...

  6. IOS 命令行编译

    转自:简书 IOS 命令行编译   发表于 IOS2013-08-17 07:07 字数: 583 阅读量: 61 This document will note about the ios comm ...

  7. 将android程序中的数据库导出到SD卡

    private void copyDBToSDcrad() { String DATABASE_NAME = "数据库文件名"; String oldPath = "da ...

  8. 【Mongo】数据备份与还原

    http://blog.51yip.com/nosql/1573.html mongorestore -d 数据库名 -c 集合名 --drop **.bson

  9. html5实现刮刮卡效果

    通过Canvas实现的可刮涂层效果. 修改img.src时涂层也会自动适应新图片的尺寸. 修改layer函数可更改涂层样式. 涂层: 可刮效果: 以下是HTML源代码(已增加移动设备支持): 1 2 ...

  10. The content of element type "struts" must match "((package|include|bean|constant)*,unknown-handler-s

    <struts> <!-- 配置为开发模式 -->     <constant name="struts.devMode" value="t ...