Mybatis 学习---${ }与#{ }获取输入参数的区别、Foreach的用法
一、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的用法的更多相关文章
- python获取输入参数
python获取输入参数 学习了:https://www.cnblogs.com/angelatian/p/5832448.html import sys模块: len(sys.argv)参数个数 s ...
- Mybatis框架四:输入参数、输出参数
输入参数可以有三种:简单类型,POJO,包装类 关于前两种: http://www.cnblogs.com/xuyiqing/p/8600888.html 这里写一下传递包装类参数: 一个POJO:U ...
- 前端笔试题目小结--获取输入参数用户名;查询URL字符串参数
编写一个JavaScript函数getSuffix,用于获得输入参数的后缀名.如输入abc.txt,返回txt. str1 = "abc.txt"; function getSuf ...
- Mybatis动态SQL——if,where,trim,choose,set.foreach的用法
知识点:主要介绍mybatis中,动态sql中的if,where,trim,set,foreach的用法 自学谷粒学院mybatis学习视频,参考mybatis官方文档 java包:log4j.jar ...
- Controller中获取输入参数注解使用总结
1.处理request的uri部分的参数(即restful访问方式):@PathVariable. 当使用restful访问方式时, 即 someUrl/{paramId}, 这时的参数可通过 @Pa ...
- mybatis框架中 #和$传递参数的区别 和注意
#{}: 1. 是预编译 2. 编译成占位符 3. 可以防止sql注入 4. 自动判断数据类型 5. 一个参数时,可以使用任意参数名称进行接收 ${}: 1. 非预编译 2. sql的直 ...
- mybatis中sql标签、where标签、foreach标签用法
<sql id="query_user_where"> <!-- 如果 userQueryVo中传入查询条件,再进行sql拼接--> <!-- tes ...
- Mybatis 的输入参数学习
mybatis 的输入参数: 指得就是parameterType的参数 这个参数就代表的sql语句中的输入参数 sql语句中的参数使用 有两种方式 : 使用#{} 获取: 8个基本数据类型 + S ...
- ServletRequest HttpServletRequest 请求方法 获取请求参数 请求转发 请求包含 请求转发与重定向区别 获取请求头字段
ServletRequest 基本概念 JavaWeb中的 "Request"对象 实际为 HttpServletRequest 或者 ServletRequest, ...
随机推荐
- C# 获取 sha256
C# 获取 sha256, 输入可以是 字符串,也可以是 字节流流: 自定义的输入类型的枚举: public enum Sha26ParseType { StringType, StreamType ...
- 项目详解4—haproxy 反向代理负载均衡
一.企业服务架构图及负载均衡的要求 1.场景说明 在企业生产环境中,每天会有很多的需求变更,比如增加服务器.新业务上线.url路由修改.域名配置等等,对于前端负载均衡设备来说,容易维护,复杂度低,是首 ...
- hadoop集群无法找到datanode节点问题解决
问题:在配置hadoop集群时,master的50070后台中找不到slave的datanode节点怎么办? 解决: 方法一:首先确认下master和slave的hdfs-site.xml配置中的df ...
- .Net Core 中间件之静态文件(StaticFiles)源码解析
一.介绍 在介绍静态文件中间件之前,先介绍 ContentRoot和WebRoot概念. ContentRoot:指web的项目的文件夹,包括bin和webroot文件夹. WebRoot:一般指Co ...
- SHELL脚本--管道和重定向基础
bash&shell系列文章:http://www.cnblogs.com/f-ck-need-u/p/7048359.html 1.8.1 匿名管道"|" 管道符号意如其 ...
- Perl中的hash类型
hash类型 hash类型也称为字典.关联数组.映射(map)等等,其实它们都是同一种东西:键值对.每一个Key对应一个Value. hash会将key/value散列后,按序放进hash桶.散列后的 ...
- Perl数据序列化和持久化(入门):Storable模块
Perl提供了一个Storable模块,用来对数据结构进行序列化(serialization,Perl中称为冻结),也就是将数据结构保存为二进制数据. 序列化后的数据可以写入文件实现持久化,可以将持久 ...
- C#调用存储过程执行缓慢,但在数据库中执行却很快的问题
参考: http://www.debugease.com/mssqlbasic/976568.html https://www.cnblogs.com/Irving/p/3951220.html ht ...
- [android] 隐式意图和显式意图的使用场景
激活系统的某些应用,并且往应用里面填一些数据,比如说短信应用 打开短信应用,查看logcat,找到ActivityManager, 看到Display.com.android.mms/.ui.Comp ...
- 32.QT-制作最强电压电阻表盘,可以自定义阴影效果,渐变颜色,图标,文字标签等-附带demo程序
由于上位机需要绘制电压电阻表盘,如下图所示: 后来,在网上找阿找,还是没找到满意的,索性自己来画控件算了,由于第一次画控件,所以花了我2天时间,才画好 效果图如下: 上图的所有颜色(包括滑动的渐变/单 ...