From: https://www.cnblogs.com/blazeZzz/p/9295634.html

#{}的用法:

我们发现,在Mapper.xml映射文件中,经常使用#{属性名} 来作为SQL语句的占位符,来映射Sql需要的实际参数

如果只有一个参数

    <select id="getUserById" parameterType="int" resultType="User">
select * from users where id=#{id}
</select>

也就是说:#{}就是一个预编译的占位符作用,运行的时候会编译成 ? ;但这只适用于只有一个参数的情况,而且这种情况#{id}中的id可以写成任何字符串,比如#{abc}

但是如果我们有多个参数呢?

如果有多个参数

解决方案一:按照顺序用 0 1 来标志

    <select id="getUserByNameAndAge" resultType="User">
select * from users where username=#{0} and age=#{1}
</select>

解决方案二:按照顺序用param1 param2 来标志

    <select id="getUserByNameAndAge" resultType="User">
select * from users where username=#{param1} and age=#{param2}
</select>

解决方案三:利用参数

    <select id="getUserByNameAndAge" resultType="User">
select * from users where username=#{username123} and age=#{age233}
</select>
public interface UserMapper {
public User getUserByNameAndAge(@Param("username123") String username, @Param("age233") int age);
}

这种方式是推荐方式,不过我们需要注意的是xml和interface中的参数名称需要对应。

${}的用法:

${}的用法和#{}的用法不同在于: #{}会被编译成?,而${}则会被原样输出(用在参数上,需要用param注解)

    <select id="getUserById" parameterType="int" resultType="User">
select * from users where id=${id}
</select>
public interface UserMapper {
public User getUserById(@Param("id") int id);
}

运行的时候 会直接原样输出,不能解决sql注入问题,但是这种情况如果参数是字符串或者日期类型的话 需要手动加单引号 不然会报错;

由于是直接输出的,所以我们在配置mybatis-config.xml的时候 可以用${}来可以配置一些东西,比如:

    <!--加载外部属性-->
<properties resource="jdbc.properties"/> <!--运行环境可以配置多个, default指定默认使用哪个-->
<environments default="development">
<!--配置环境, id是这个环境的唯一标识-->
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driverClassName}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>

总结:

  #是占位符, 会对SQL进行预编译,相当于?; $是做sql拼接, 有SQL注入的隐患 2. #不需要关注数据类型, MyBatis自动实现数据类型转换; ${} 必须自己判断数据类型

​   两者都支持@param注解, 指定参数名称, 获取参数值. 推荐这种方式

  一般做参数传递,都会使用#{}

  如果不是做预编译,而是做拼接sql, 会使用${}, 例如表名称的变化,或者用在其他配置文件中

MyBatis总结五:#{}和${}的用法和区别的更多相关文章

  1. JavaScript中typeof,instanceof,hasOwnProperty,in的用法和区别

    一. typeof操作符 typeof操作符用于返回正在使用值的类型. // 使用原始值 let mNull = null; let mUndefined = undefined; let mStri ...

  2. set和enum类型的用法和区别

    mysql中的set和enum类型的用法和区别 mysql中的enum和set其实都是string类型的而且只能在指定的集合里取值, 不同的是set可以取多个值,enum只能取一个值.   1 2 3 ...

  3. MyBatis Mapper.xml文件中 $和#的区别

    MyBatis Mapper.xml文件中 $和#的区别   网上有很多,总之,简略的写一下,作为备忘.例子中假设参数名为 paramName,类型为 VARCHAR . 1.优先使用#{paramN ...

  4. OC #import和@class的用法和区别

    OC #import和@class的用法和区别 import会包含这个类的所有信息,包括实体变量和方法,而@class只是告诉编译器,其后面声明的名称是类的名称,至于这些类是如何定义的,暂时不用考虑, ...

  5. HashMap、HashTable、LinkedHashMap和TreeMap用法和区别

    Java为数据结构中的映射定义了一个接口java.util.Map,它有四个实现类,分别是HashMap.HashTable.LinkedHashMap和TreeMap.本节实例主要介绍这4中实例的用 ...

  6. 脚本引用中的defer和async的用法和区别

    之前的博客漫谈前端优化中的引用资源优化曾经提到过脚本引用异步设置defer.async,没有细说,这里展开一下,谈谈它们的作用和区别,先上张图来个针对没用过的小伙伴有个初始印象: 是的,就是在页面脚本 ...

  7. spring 后置处理器BeanFactoryPostProcessor和BeanPostProcessor的用法和区别

    主要区别就是: BeanFactoryPostProcessor可以修改BEAN的配置信息而BeanPostProcessor不能,下面举个例子说明 BEAN类: package com.spring ...

  8. $.extend()和$.fn.extend()用法和区别

    $.extend()和$.fn.extend()用法和区别: 在自己制作插件的时候会经常用到$.extend()和$.fn.extend()两个函数,无论从外观还是作用都非常的类似,但是实际上它们的区 ...

  9. kmalloc/kfree,vmalloc/vfree函数用法和区别

    http://blog.csdn.net/tigerjibo/article/details/6412881 kmalloc/kfree,vmalloc/vfree函数用法和区别 1.kmalloc ...

  10. for,foreach,iterator的用法和区别

    for,foreach,iterator的用法和区别 相同点:   三个都可以用来遍历数组和集合不同点:1.形式差别 for的形式是for(int i=0;i<arr.size();i++){. ...

随机推荐

  1. Mac使用Xcode配置openGL

    Mac使用Xcode配置openGL 博主这学期有图形学课要用到OpenGL,于是首先就开始配置开发环境了.应该说网上Windows上配置OpenGL教程比较多,Mac版的比较少.博主特来分享配置过程 ...

  2. JS_高程3.基本概念(5)语句

    1.if语句 2.do-while语句:后测循环语句,循环体内的代码至少执行一次. 3.while语句:前测循环语句. 4.for语句:前测循环语句. 注意:在ECMAScript中不存在块级作用域, ...

  3. django之模型层(model)--建表、查询、删除基础

    要说一个项目最重要的部分是什么那铁定数据了,也就是数据库,这篇就开始带大家走进django关于模型层model的使用,model主要就是操纵数据库不使用sql语句的情况下完成数据库的增删改查.本篇仅带 ...

  4. CiscoIOUKeygen

    python CiscoIOUKeygen.py | grep -A 1 ‘license’ > iourc

  5. 前端工程化系列[06]-Yeoman脚手架核心机制

    在前端工程化系列[05] Yeoman脚手架使用入门这边文章中,对Yeoman的使用做了简单的入门介绍,这篇文章我们将接着探讨Yeoman这个脚手架工具内部的核心机制,主要包括以下内容 ❏ Yeoma ...

  6. java文章标题及文章相似度计算hash算法实现

    参看了 https://github.com/awnuxkjy/recommend-system 对方用了 余弦 函数实现相似度计算,我则用的是 hanlp+hash 算法(Hash算法总结) 再看服 ...

  7. SharePoint 配置PowerShell任务计划

    前言 最近,有这么个需求,需要定时为SharePoint更新内容,所以,就想到了PowerShell命令和任务计划(Windows自带的功能,英文叫Task Schedule,在开始菜单里就能找到), ...

  8. SpringCloud无废话入门03:Feign声明式服务调用

    1.Feign概述 在上一篇的HelloService这个类中,我们有这样一行代码: return restTemplate.getForObject("http://hello-servi ...

  9. 如何确定Isilon cluster的网卡类型是40GbE的还是10GbE的

    可以使用isi upgrade cluster firmware devices命令. 从命令行输出可以看到,当前的cluster使用的是40G的前端网卡. 如果是10G网卡,输出结果应当是如下的样子 ...

  10. iOS10使用SecKeyCreateWithData读取公钥私钥

    在使用openssl命令生成RSA公钥私钥以后,当后端人员把密钥的字符串发给你: 首先要问清公钥私钥的密钥格式(PKCS1,PKCS8),密钥位数(1024,2048),然后在iOS10以后,使用苹果 ...