MyBatis foreach标签的用法
From《MyBatis从入门到精通》
一、foreach实现in集合
1.映射文件中添加的代码:
<!--
4.4 foreach用法
SQL语句有时会使用IN关键字,例如id in {1,2,3}。可以使用id in #{ids}方式直接
获取值,但是这种写法不能防止SQL注入,想避免SQL注入就需要用#{}的方式,这时就需要
配合使用foreach标签来满足需求。
foreach可以对数组,map或实现了Iterable接口(如List、Set)的对象进行遍历。数组
在处理时会转换成List对象,因此foreach遍历的对象可以分为两大类:Iterable类型
和Map类型。
-->
<!--
4.4.1 foreach实现in集合
需求:
根据传入的用户id集合查询所有符合条件的用户。
-->
<select id="selectByIdList" resultType="tk.mybatis.simple.model.SysUser">
select id,
user_name userName,
user_password userPassword,
user_email userEmail,
user_info userInfo,
head_img headImg,
create_time createTime
from sys_user
where id in
<!--
<foreach>包含以下属性:
collection:必填,值为要迭代循环的集合类型。这个属性值的情况有很多
item:变量名,值为从迭代对象中取出的每一个值
index:索引的属性名,在集合数组情况下值为当前索引值;当迭代对象是map时,这个值为map的key
open:整个循环内容的开头字符串
close:整个循环内容的结尾字符串
separator:每次循环的分隔符
-->
<foreach collection="list" open="(" close=")" separator=","
item="id" index="i">
#{id}
</foreach>
<!--
collection的属性要如何设置?来看看MyBatis是如何处理这种类型的参数的:
1.只有一个数组参数或集合参数:
当参数类型为集合类型的时候,默认会转换成Map类型,并添加一个key为collection的值
如果参数类型是List类型,那么就继续添加一个key为list的值,这样,当collection="list"
时,就能得到这个集合,并对它进行循环处理。
当参数类型为数组类型的时候,也会转换成Map类型,默认的key为array。当采用如下方法使用
数组参数时,就需要把foreach便签中的collection属性值设置为array
List<SysUser> selectByList(Long[] idArray);
上面是数组或集合类型的参数默认的名字。推荐使用@Param来指定参数的名字,这时collection
就设置为通过@Param注解指定的名字。
2.有多个参数:
有多个参数时,需要用@Param注解给每个参数指定一个名字~~~
3.参数是Map类型:
使用map和使用@Param注解方式类似,将collection指定为Map中的key即可。
如果要循环所传入的Map,推荐使用@Param注解指定名字,此时可将collection
设置为指定的名字,如果不想指定名字,就使用默认值_parameter
——我选择用@Param指定名字。。。
4.参数是一个对象:
这种情况下指定对象的属性名即可。当使用对象内层嵌套的对象时,使用属性.属性
(集合和数组可以使用下标取值)的方式可以指定深层的属性值。
-->
</select>
2.接口类中添加的方法:
List<SysUser> selectByIdList(List<Long> idList);
3.测试代码
@Test
public void testSelectByIdList(){
SqlSession sqlSession = getSqlSession();
try{
UserMapper userMapper=sqlSession.getMapper(UserMapper.class);
List<Long> idList = new ArrayList<Long>();
idList.add(1L);
idList.add(1001L);
List<SysUser> userList = userMapper.selectByIdList(idList);
Assert.assertEquals(2,userList.size());
}finally {
sqlSession.close();
}
}
二、foreach实现批量插入
1.映射文件中添加的代码:
<!--
4.4.2 foreach实现批量插入
可以开启批量新增回写主键值的功能
-->
<insert id="insertList">
insert into sys_user(
user_name,user_password,user_email,
user_info,head_img,create_time)
values
<foreach collection="list" item="user" separator=",">
(
#{user.userName},#{user.userPassword},#{user.userEmail},
#{user.userInfo},#{user.headImg,jdbcType=BLOB},
#{user.createTime,jdbcType=TIMESTAMP}
)
</foreach>
</insert>
2.接口类中添加的方法:
int insertList(List<SysUser> userList);
3.测试代码:
@Test
public void testInsertList() {
SqlSession sqlSession = getSqlSession();
try{
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
List<SysUser> userList = new ArrayList<SysUser>();
for (int i = 0; i < 2; i++) {
SysUser user = new SysUser();
user.setUserName("test"+i);
user.setUserPassword("123456");
user.setUserEmail("test@mybatis.tk");
userList.add(user);
}
int result = userMapper.insertList(userList);
Assert.assertEquals(2,result);
}finally {
sqlSession.rollback();
sqlSession.close();
}
}
三、foreach实现动态UPDATE
1.映射文件中添加的代码:
<!--
4.4.3 foreach实现动态UPDATE
当参数是Map类型的时候,foreach标签的index属性值对应的不是索引值,而是Map中
的key,利用这个key可以实现动态UPDATE。
-->
<update id="updateByMap">
update sys_user
set
<foreach collection="_parameter" item="val" index="key" separator=",">
${key}=#{val}
</foreach>
where id=#{id}
</update>
2.接口类中添加的方法:
int updateByMap(Map<String,Object> map);
3.测试代码:
@Test
public void testUpdateByMap(){
SqlSession sqlSession = getSqlSession();
try{
UserMapper userMapper=sqlSession.getMapper(UserMapper.class);
Map<String,Object> map=new HashMap<String,Object>();
map.put("id",1L);
map.put("user_email","test@mybatis.tk");
map.put("user_password","1234456");
userMapper.updateByMap(map);
SysUser user = userMapper.selectById(1L);
Assert.assertEquals("test@mybatis.tk",user.getUserEmail());
}
finally {
sqlSession.rollback();
sqlSession.close();
}
}
MyBatis foreach标签的用法的更多相关文章
- Mybatis foreach标签含义
背景 考虑以下场景: InfoTable(信息表): Name Gender Age Score 张三 男 21 90 李四 女 20 87 王五 男 22 92 赵六 女 19 94 孙七 女 23 ...
- mybatis <forEach>标签的使用
MyBatis<forEach>标签的使用 你可以传递一个 List 实例或者数组作为参数对象传给 MyBatis.当你这么做的时候,MyBatis 会自动将它包装在一个 Map 中,用名 ...
- MyBatis从入门到精通(八):MyBatis动态Sql之foreach标签的用法
最近在读刘增辉老师所著的<MyBatis从入门到精通>一书,很有收获,于是将自己学习的过程以博客形式输出,如有错误,欢迎指正,如帮助到你,不胜荣幸! 本篇博客主要讲解如何使用foreach ...
- MyBatis foreach标签遍历数组
有时候开发中需要根据多个ID去查询,可以将ID封装为List或者数组然后使用MyBatis中的foreach标签构建in条件. 这里我将ID封装为String[]作为参数. <select id ...
- mybatis foreach标签
一.批量插入数据 示例:添加订单商品表 1.模型层的相应代码 /** * 添加订单商品表 * @param ordergoods * @return */ public boolean addOrde ...
- MyBatis bind标签的用法
From<MyBatis从入门到精通> <!-- 4.5 bind用法 bind标签可以使用OGNL表达式创建一个变量并将其绑定到上下文中. 需求: concat函数连接字符串,在M ...
- MyBatis select标签的用法
From<MyBatis从入门到精通> 第一步,在接口中添加方法: public interface UserMapper { SysUser selectById(Long id); } ...
- mybatis foreach where test用法
<select id="selectAny" resultType="user" parameterType="user"> s ...
- mybatis foreach标签的解释 与常用之处
情景:查询数据库中文章的相关文章 文章为一个表 字段tags为相关文章字符串中间用','逗号进行啦分割 查询完一个文章后可以把tags字段构造为一个List<String> 然后利用这 ...
随机推荐
- windows下服务程序相关(别人提供的5种封装使用)
作者: daodaoliang 版本: V 0.0.1 日期: 2017年11月25日 1. Windows Service 编程实现 在windows平台下面编写 服务程序 免不了要去查看微软的开发 ...
- 活锁(livelock) 专题
活锁(livelock) 活锁指的是任务或者执行者没有被阻塞,由于某些条件没有满足,导致一直重复尝试,失败,尝试,失败. 活锁和死锁的区别在于,处于活锁的实体是在不断的改变状态,所谓的“活”, 而处于 ...
- C#调用Microsoft.DirectX.DirectSound.dll时出错
1.修改工程的编译选项.我的开发运行环境是Windows 10 x64系统.需要修改一下工程的编译选项,把AnyCPU改成x86的. 未能加载文件或程序集“Microsoft.DirectX.Dire ...
- 【Python】:拓展Queue实现有序不重复队列
最近手头有个需求是这样的,定期检查数据库获取失败任务并且进行重启.最早想到的是添加一个生产者&&消费者队列,但是发现很多棘手的问题. 1.重启任务是调用的一个shell脚本然后在脚本中 ...
- ext中设置grid单选,取消选择
原代码(无法取消选择)如下: selModel: Ext.create('Ext.selection.CheckboxModel', { mode: "SINGLE", allow ...
- 安卓环境下,通过QT调用jar包
在安卓上,许多第三方工具都提供jar包.qt可以通过jni来调用jar包.本文通过一个例子,说明安卓上QT调用jar的方式. 工具/原料 qt android jar包 jar包准备 1 ja ...
- 使用WebBrowser并调用网页中的JS函数
在界面上拖入QAxWidget,注意这里不建议直接在UI设计界面指定控件,否则可能引起QtCreator崩溃 建议在代码中动态设置,如: ui->axWidget->setControl( ...
- QT中的各种对话框
大家可以参见QT中各种MessageBox的使用的这篇文章 界面效果图如下,大家可以用代码自己操作 diglog.h #ifndef DIALOG_H #define DIALOG_H #includ ...
- EF Power Tool 代码生成器 反向生成
大致来说,这个工具有这样几个功能: 1) 按照现有数据库结构,生成Code First POCO class.DbContext class和相应的mapping class. 2) 以designe ...
- Android-小小设置永久解决程序因为未捕获异常而异常终止的问题
(一) 前言各位亲爱的午饭童鞋,是不是经常因为自己的程序中出现未层捕获的异常导致程序异常终止而痛苦不已?嗯,是的.. 但是,大家不要怕,今天给大家分享一个东东可以解决大家这种困扰,吼吼! (二) Un ...