本文转载自https://blog.csdn.net/u010502101/article/details/79055198

#{}${} 都可以从接口输入中的map对象或者pojo对象中获取输入的参数值。例如:

<mapper namespace="com.lzj.mybatis.dao.UserDao"><select id="getUser" resultType="com.lzj.mybaits.bean.User">select * from users where name=#{name} and password=#{password}</select>
</mapper>

或者

<mapper namespace="com.lzj.mybatis.dao.UserDao"><select id="getUser" resultType="com.lzj.mybaits.bean.User">select * from users where name=${name} and password=${password}</select>
</mapper>

上面两种形式都可以通过name和pssword条件查询用户的信息。但是上面两种形式是有本质区别的:Mybatis在处理形式时,会直接把形式时,会直接把{name}的值为”lzj”,${password}的值为”123456”,即mybatis直接处理sql语句为:

select * from users where name='lzj'and password='123456'

mybatis在处理#{}形式时,会通过jdbc中的PreparedStatement先预编译sql语句为下列形式:

select * from users where name=? and password=?

然后在用PreparedStatement把对应占位符处的值代替占位符。

#{}比${}的优势


name和name和{password}获取到值为”XXXX”。mybatis会拼接sql为:

select * from users where name='lzj'# and password='XXXX'

由于sql中# 表示注释的意思,所以mybatis就把上面的语句翻译成了

select * from users where name='lzj'

执行此条语句,根本不再用关系password的值是什么了,因此会有安全问题。

但是用#{}的形式就不会出现这种情况,对于#{}的形式,mybatis会先提前预编译sql语句,然后在将参数设置到sql语句中,防止sql注入。

${}比#{}的优势

大多数情况下,我们应使用#{}的形式,但在有些地方确不成立。原生jdbc不支持占位符的地方我们就可以使用${}进行取值。
比如表的名字处不可以使用占位符,下面是不可以的

select * from #{users}

表名字处不能使用占位符,此时要用下面的形式:

select * from ${users}

例如order by 排序的地方不可以用,下面的形式不可以用

select * from users order by #{name} 

应该使用

select * from users order by ${name} 

#{}其它丰富用法


在mybatis用#{}处理获取输入的参数时,还可以指定其它属性,例如#{name, javaType=String, jdbcType=null}, 如#{amount, javaType=Double, jdbcType=NUMERIC,numericScale=3} 下面介绍常用的属性

  1. javaType :表明传入参数的类型
  2. jdbcType:表明对应数据库中的类型,一般用来处理传入的参数为空的情况。例如:
    <select id="getUser" resultType="com.lzj.mybaits.bean.User">select * from users where name=#{name}</select>

当name参数传入的值为null时,mybatis会默认传入的name值的类型为数据库other类型 ,对于oracle数据库,不能处理other类型的字段,因此会报不能识别的错误。此时就可以用jdbcType属性指定类型,如

    <select id="getUser" resultType="com.lzj.mybaits.bean.User">select * from users where name=#{name, jdbcType=null}</select>

当传入的name值的类型为null时,在oracle数据库中会把name字段的值当空来处理。

当name参数传入的值为null时,mybatis会默认传入的name值的类型为数据库other类型 对于mysql数据库,会自动把other类型当做null类型来处理,因此对于mysql数据库中可不用指定jdbcType=null属性,当然也可以指定。

另外,由于在mybatis中默认配置把传入的NULL值类型映射到数据中的other类型,也可以在mybatis的配置文件中指定全局的把传入的NULL类型的参数映射到数据库中指定的类型。例如:

    <settings><setting name="jdbcTypeForNull" value="NULL"/></settings>

本文中在conf.xml配置文件中,加上如上配置,当传入的参数为NULL时,mybatis默认映射到数据库中的类型就是NULL类型。

  1. numericScale:对于java中浮点类型,当传入数据库时可能有若干小数,通过指定numericScale=3,可以指定传入数据库的字段为数值类型,并且只有小数点数后三位。

关于sql注入的问题,参考http://blog.csdn.net/javy_codercoder/article/details/49276653

本文转载自https://blog.csdn.net/u010502101/article/details/79055198

Mybatis中用#{}和${}获取输入参数的区别相关推荐

  1. python 输入参数获取_python获取输入参数

    自定义view实现水波纹效果 水波纹效果: 1.标准正余弦水波纹: 2.非标准圆形液柱水波纹: 虽说都是水波纹,但两者在实现上差异是比较大的,一个通过正余弦函数模拟水波纹效果,另外一个会运用到图像的混 ...

  2. jsp中用js获取url参数

    一个参数的: var url = location.href; var para= url.substring(url.indexOf("?")+1,url.length).spl ...

  3. openresty获取请求参数

    获取url参数 ngx.var.arg_xx与ngx.req.get_uri_args["xx"]两者都是为了获取请求uri中的参数,例如 ?strider=1 为了获取输入参数s ...

  4. ServletRequest HttpServletRequest 请求方法 获取请求参数 请求转发 请求包含 请求转发与重定向区别 获取请求头字段...

    原文地址:ServletRequest HttpServletRequest 请求方法 获取请求参数 请求转发 请求包含 请求转发与重定向区别 获取请求头字段 ServletRequest 基本概念 ...

  5. mybatis当输入参数有多个时的解决方案,Map类型,索引引用输入参数,map输出

    Map类型在映射文件中的使用 当输入参数有多个时的解决方案 通过输入参数的索引引用输入参数 需求:通过姓名和地址查询用户信息 输入参数: 姓名 地址 开发: [1]编写接口 [2]映射文件的编写 [3 ...

  6. 【Android RTMP】音频数据采集编码 ( FAAC 音频编码参数设置 | FAAC 编码器创建 | 获取编码器参数 | 设置 AAC 编码规格 | 设置编码器输入输出参数 )

    文章目录 一. 头文件.成员变量准备 二. 创建 FAAC 编码器 三. 获取并设置 FAAC 编码器参数 四. 设置 FAAC 编码器编码标准 五. 设置 FAAC 编码器 AAC 编码规格 六. ...

  7. python获取输入框内容长度_python3 tkinter 获取输入字符串长度

    python 3  获取输入字符长度 #-*- coding:utf-8 -*- from tkinter import * from tkinter import messagebox def ge ...

  8. springboot中的拦截器interceptor和过滤器filter,多次获取request参数

    大家好,我是烤鸭:     这是一篇关于springboot的拦截器(interceptor)和过滤器(Filter). 先说一下过滤器和拦截器. 区别: 1. servlet请求,顺序:Filter ...

  9. mybatis foreach map_重学Mybatis(六)-------输入映射(含面试题)

    博主将会针对Java面试题写一组文章,包括J2ee,SQL,主流Web框架,中间件等面试过程中面试官经常问的问题,欢迎大家关注.一起学习,一起成长,文章底部有面试题. 入参映射关键字说明 图中para ...

  10. REUSE_ALV_GRID_DISPLAY_LVC函数输入参数属性的应用

    REUSE_ALV_GRID_DISPLAY_LVC函数输入参数属性的应用 前面我们讲过,ALV Grid 函数的输出有两个:REUSE_ALV_GRID_DISPLAY 和 REUSE_ALV_GR ...

最新文章

  1. js 的数值限制可能引起的问题
  2. java题目不会做那么解答_有几道JAVA的题目不会做 哪位高手来解答一下!谢
  3. [置顶] 我的程序员之路(4)---C语言课程设计
  4. C#合并文件夹图片列表 自定义排版顺序
  5. Azure Table storage 基本用法 -- Azure Storage 之 Table
  6. 模拟器不全屏_puNES 适用于 Windows 和 Linux 的开源 NES 模拟器
  7. java数据结构图_java总结数据结构和算法
  8. 解决VS中注释乱码的问题
  9. 基于UCenter关联第三方网站与Discuz用户
  10. python编程语言-为什么Java、Python会成为程序员最害怕的编程语言?
  11. python框架漏洞_注意!Python中的10个常见安全漏洞及修复方法
  12. 云智慧获 D 轮数 2500 万美元投资:全力推动智能运维落地
  13. 反编译那些事儿(四)—序列化问题
  14. python新式类中的__new__方法与__init__方法
  15. element ui表单必填_详解element-ui设置下拉选择切换必填和非必填
  16. 静态网页—制作“人人网首页”页面
  17. zabbix_sender安装和使用
  18. Python中__main__.py文件的作用
  19. 微信的隐藏功能竟然可以一秒获取好友位置!这到底是神马操作
  20. Network 之十 BIOS + MBR、UEFI + GPT、GRUB、BOOTMGR、SYSLINUX、Option ROM

热门文章

  1. 基于javaweb+SpringBoot的网上商城水果超市水果商城(java+SSM+springboot+redis)
  2. 【图像去噪】基于中值、均值、维纳、小波多种滤波实现图像去噪含Matlab源码
  3. 巢湖学院计算机专业录取分数线,巢湖学院2020年录取分数线(附2017-2020年分数线)...
  4. 想用数据分析结论,与竞争对手PK?这篇实用战术拿走不谢
  5. 免备案服务器会影响网站排名和权重吗?
  6. 【第15天】MYSQL进阶-查询优化-慢查询日志(SQL 小虚竹)
  7. ElasticSearch多字段查询best_fields、most_fields和cross_fields理解
  8. Windows Phone 7将胜出的五条论据
  9. 评论:银行凭什么让副部级以上干部透支300万
  10. 自从盘古开天地 中国一共有多少神仙?