一、Mybatis中用#{}和${}获取输入参数的区别

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

 <mapper namespace="com.hh.dao.UserDao">
<select id="selectByIdList" resultType="com.hh.domain.SysUser">
select * from user where id=#{id} and username=#{username}
</select>
</mapper>
或者 <mapper namespace="com.hh.dao.UserDao">
<select id="selectByIdList" resultType="com.hh.domain.SysUser">
select * from user where id=${id} and username=${username}
</select>
</mapper>

2.用法区别

  mybatis在处理${}形式时,会直接把{id}和{username}获取的值拼接到sql中;如{id}值为“10”,{username}值为“张三”,即直接处理:

select * from user where id="10" and username="张三" 

  mybatis在处理#{}形式时,会通过jdbc中的PreparedStatement先预编译sql语句为一个参数占位符,如下列形式:

select * from user where id=? and username=? 

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

可简单理解:

  ${}传入值时,sql解析时,参数是不带引号的。

  #{} 传入值时,sql解析时,参数是带引号的,

如:name-->cy
eg:
  select id,name,age from student where name=#{name} -- name='cy' select id,name,age from student where name=${name} -- name=cy 

 3.#{}的形式,mybatis会先提前预编译sql语句,然后再将参数设置到sql语句中,防止sql注入。

 4.但是如果使用在order by 中就需要使用 $。

 5.在大多数情况下还是经常使用#,但在不同情况下必须使用$. 

二、Foreach用法

  SQL语法中有时会使用IN关键字,例如id in (1,2,3).可以使用${id}方式取值,但这种写法不能给你防止SQL注入,想避免SQL注入就需要用#{}的方式,这时就要配合使用foreach标签来满足需求。

    foreach的属性: 

      collection:必填,值为要迭代循环的属性名,这个属性值的情况有很多。
   item:变量名,值为从迭代对象中取出的每一个值。
   index:索引的属性名,在集合数组情况下值为当前索引值,当迭代循环的对象是Map类型时,这个值为Map的key(键值)。
   open:整个循环内容开头的字符串。
   close:整个循环内容结尾的字符串。
   separator:每次循环的分隔符。
  foreach可以对数组,Map或实现了Iterable接口(如List,Set)的对象进行遍历。数组在处理时会转换为List对象,因此foreach遍历的对象可以分为两大类:Iterable类型和Map类型。这两种类型在遍历时情况不一样。

  1.foreach实现in集合

    foreach实现in集合(或数组)是最简单和最常用的一种情况,下面介绍如何根据传入的用户id集合查询出所有符合条件的用户。

    1).UseMapper接口中增加如下方法:

/**
*根据用户id集合查询
*@param idList
*@return
/
List<SysUser> selectByIdList(List<Long> idList);

     2).在UserMapper.xml中添加如下SQL:  

<select id="selectByIdList" resultType="com.hh.domain.SysUser">
select id,username,password from user where id in
<foreach collection="list" open="(" close=")" separator="," item="id" index="i">
  #{id}
</foreach>
</select>

  2..foreach实现批量插入

   1).UseMapper接口中增加如下方法:

/**
*批量插入用户信息
*@param userList
*@return
*/
int insertList(List<SysUser> userList);

    2).在UserMapper.xml中添加如下SQL:

<insert id="insertList">
insert into user(id,username,password) values
<foreach collection="list" item="user" separator=",">
(
#{user.id},#{user.username},#{user.password}
)
</foreach>
</insert>

注:通过item指定了循环变量名后,在引用值得时候使用的是“属性.属性”的方式,如user.id。

  3.foreach实现动态UPDATE

        以参数类型为Map为例来讲解foreach如何实现动态UPDATE. 当参数是Map类型的时候,foreach标签的index属性值对应的不是索引值,而是Map中的key,利用这个key可以实现动态UPDATE.

    1).UseMapper接口中增加如下方法:

/**
*通过Map更新列
*@param map
*@return
*/
int updateByMap(Map<String,Object> map);

    2).在UserMapper.xml中添加如下SQL:

<update id="updateByMap">
update user set
<foreach collection="_parameter" item="val" index="key" separator=",">
${key} = #{val}
</foreach>
where id=#{id}
</update>

Mybatis 学习---${ }与#{ }获取输入参数的区别、Foreach的用法的更多相关文章

  1. python获取输入参数

    python获取输入参数 学习了:https://www.cnblogs.com/angelatian/p/5832448.html import sys模块: len(sys.argv)参数个数 s ...

  2. Mybatis框架四:输入参数、输出参数

    输入参数可以有三种:简单类型,POJO,包装类 关于前两种: http://www.cnblogs.com/xuyiqing/p/8600888.html 这里写一下传递包装类参数: 一个POJO:U ...

  3. 前端笔试题目小结--获取输入参数用户名;查询URL字符串参数

    编写一个JavaScript函数getSuffix,用于获得输入参数的后缀名.如输入abc.txt,返回txt. str1 = "abc.txt"; function getSuf ...

  4. Mybatis动态SQL——if,where,trim,choose,set.foreach的用法

    知识点:主要介绍mybatis中,动态sql中的if,where,trim,set,foreach的用法 自学谷粒学院mybatis学习视频,参考mybatis官方文档 java包:log4j.jar ...

  5. Controller中获取输入参数注解使用总结

    1.处理request的uri部分的参数(即restful访问方式):@PathVariable. 当使用restful访问方式时, 即 someUrl/{paramId}, 这时的参数可通过 @Pa ...

  6. mybatis框架中 #和$传递参数的区别 和注意

    #{}: 1.  是预编译 2.  编译成占位符 3.  可以防止sql注入 4.  自动判断数据类型 5.  一个参数时,可以使用任意参数名称进行接收 ${}: 1.  非预编译 2.  sql的直 ...

  7. mybatis中sql标签、where标签、foreach标签用法

    <sql id="query_user_where"> <!-- 如果 userQueryVo中传入查询条件,再进行sql拼接--> <!-- tes ...

  8. Mybatis 的输入参数学习

    mybatis 的输入参数: 指得就是parameterType的参数 这个参数就代表的sql语句中的输入参数 sql语句中的参数使用  有两种方式 : 使用#{} 获取:  8个基本数据类型 + S ...

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

      ServletRequest 基本概念 JavaWeb中的 "Request"对象  实际为   HttpServletRequest  或者  ServletRequest, ...

随机推荐

  1. SpringCloud入门之YAML格式文件规范学习

    1. 认识 YAML YAML(发音 /ˈjæməl/)是一个类似 XML.JSON 的数据序列化语言.其强调以数据为中心,旨在方便人类使用:并且适用于日常常见任务的现代编程语言.因而 YAML 本身 ...

  2. kubelet集群网络配置flannel(覆盖网络)

    kubernetes本身并不会对跨主机容器的网络进行设置,这需要额外的工具来实现.一些常用的开源工具主要包括flanne.OpenvSwitch.Weave.Calico等,这里面最常用的是flann ...

  3. sshfs基于ssh挂载远程目录

    为了像本地一样访问远程主机上的目录,通常我们会在远程主机上使用nfs来导出目录,并在本地主机上mount这个nfs文件系统.如果是windows系统,则使用cifs或samba的方式来访问. 但可能我 ...

  4. 移植 Qt 至 tiny210 详细过程

    实验所需资源: tiny210(cortex-a8) QT 版本:5.6.2 PC 环境:UBUNTU tslib:tslib-1.4 交叉工具链:4.5.1 开发板已装载好 Linux 编译 tsl ...

  5. Apollo 7 — ConfigService 消息扫描设计实现

    目录 设计 代码实现 总结 1.设计 Apollo 为了减少依赖,将本来 MQ 的职责转移到了 Mysql 中.具体表现为 Mysql 中的 ReleaseMessage 表. 具体官方文档可见:发送 ...

  6. [转]win10中安装JDK8以及环境配置

    本文转自:https://blog.csdn.net/yangsummer2426/article/details/80499775 1.      首先下载jdk,网址如下: http://www. ...

  7. C#与C++数据类型比较及结构体转换[整理]

    //c++:HANDLE(void   *)                          ----    c#:System.IntPtr//c++:Byte(unsigned   char)  ...

  8. TFS自动记住用户名密码

    在使用Team Foundation Server(以下简称TFS) 的时候,先在安装Team Foundation 的机器中新建一个与客户机中的同名的用户名,这样,在Visual Studio 20 ...

  9. 微信小程序实现支付功能

    小程序支付,没有封装支付代码:直接上一段可用的流程代码吧:微信小程序支付官网文档有详细的说明,这里我就不再赘述啦:客户端js: wx.request({ url:'https://www.xxxx.c ...

  10. 【Java每日一题】20170221

    20170220问题解析请点击今日问题下方的“[Java每日一题]20170221”查看(问题解析在公众号首发,公众号ID:weknow619) package Feb2017; public cla ...