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> 然后利用这 ...
随机推荐
- 写给非专业人士看的 *** 简介(同时也解释了GFW )
写给非专业人士看的 *** 简介 这个文章来源于一个朋友在***的过程中,搞不清楚 *** 的配置问题,在这里我想按照我对 *** 的理解简单梳理一下,以便一些非专业人士也能了解 long long ...
- 零元学Expression Blend 4 - Chapter 34 啊~!!我不要毛毛的感觉!-使用布局修整「UseLayoutRounding」
原文:零元学Expression Blend 4 - Chapter 34 啊~!!我不要毛毛的感觉!-使用布局修整「UseLayoutRounding」 本章将介绍UseLayoutRounding ...
- 通过HTTP Header控制缓存
我们经常通过缓存技术来加快网站的访问速度,从而提升用户体验.HTTP协议中也规定了一些和缓存相关的Header,来允许浏览器或共享高速缓存缓存资源.这些Header包括: Last-Modified ...
- Qt5---ftp上传功能(使用组合的办法实现功能,QNetworkAccessManager自动管理分片上传,用QLoggingCategory屏蔽SSL警告)
从Qt的版本进化中可以知道,在Qt4中的QFtp类到了Qt5中已经没有了,虽然可以通过在Qt5中自己编译出QFtp,但是Qt5中提供的QNetworkAccessManager在发送和请求网络方面 ...
- JS数据结构第三篇---双向链表和循环链表之约瑟夫问题
一.双向链表 在上文<JS数据结构第二篇---链表>中描述的是单向链表.单向链表是指每个节点都存有指向下一个节点的地址,双向链表则是在单向链表的基础上,给每个节点增加一个指向上一个节点的地 ...
- python 原理
Python原理--总结 基础数据类型: 字符串: upper,lower,startwith,endswith,replace,strip,split,count,isdigit,index ...
- 系统学习 Java IO (五)----使用 SequenceInputStream 组合多个流
目录:系统学习 Java IO---- 目录,概览 SequenceInputStream 可以将两个或多个其他 InputStream 合并为一个. 首先,SequenceInputStream 将 ...
- MethodInterceptor-方法拦截器
MethodInterceptor 方法拦截器,也就是aop拦截方法 1.使用示例 public interface MethodInterceptor extends Interceptor { O ...
- Django框架rest_framework中APIView的as_view()源码解析、认证、权限、频率控制
在上篇我们对Django原生View源码进行了局部解析:https://www.cnblogs.com/dongxixi/p/11130976.html 在前后端分离项目中前面我们也提到了各种认证需要 ...
- Python生成word
Python生成word 使用python-docx-template库, 将html转为word. python-docx-template可以使用类似jinja2的模板语法. 依赖docx库, 安 ...