foreach标签

下面介绍一下一个mapper配置文件中的foreach标签(注意,要跟着前面的总结来看,这里使用的例子是结合前面的工程写的,大部分代码没有再赘述)

foreach的作用是向sql传递数组或List,mybatis使用foreach解析

1.1需求
在用户查询列表和查询总数的statement中增加多个id输入查询。
sql语句如下:

两种方法:
SELECT * FROM USER WHERE id=1 OR id=3 OR id=5

SELECT * FROM USER WHERE id IN(1,3,5)

1.2在输入参数类型中添加List<Integer> ids传入多个id
public class UserQueryVo {

//传入多个id
private List<Integer> ids;

public List<Integer> getIds() {
return ids;
}

public void setIds(List<Integer> ids) {
this.ids = ids;
}
......
}

1.3修改mapper.xml

WHERE id=1 OR id=3 OR id=5
在查询条件中,查询条件定义成一个sql片段,需要修改sql片段。

[html] view plaincopy
  1. <pre name="code" class="html"><!-- 定义sql片段
  2. id:sql片段的唯一标识
  3. 在sql片段中不要加入where
  4. 经验:一般我们定义sql片段是为了可重用性,是基于单表来定义sql片段,
  5. 这样的话这个sql片段可重用性才高-->
  6. <sql id="query_user_where">
  7. <if test="ids!=null">
  8. <!-- 使用foreach遍历传入ids
  9. collection指定输入对象中集合属性
  10. item每次遍历生成的对象名
  11. open开始遍历时要拼接的串
  12. close开始遍历时要拼接的串
  13. separator遍历的两个对象中间需要拼接的串
  14. -->
  15. <!-- 使用实现下边的sql拼接
  16. WHERE (id=1 OR id=3 OR id=5)-->
  17. <foreach collection="ids" item="user_id" open="AND (" close=")" separator="OR">
  18. <!-- 每次遍历要拼接的串 -->
  19. id=#{user_id}
  20. </foreach>
  21. </if>
  22. </sql>
  23. <!-- 用户信息综合查询 -->
  24. <select id="findUserList" parameterType="cn.edu.hpu.mybatis.PO.UserQueryVo"
  25. resultType="cn.edu.hpu.mybatis.PO.UserCustom">
  26. select * from user
  27. <!-- where标签可以自动去掉第一个and -->
  28. <where>
  29. <!-- 应用sql片段的id,如果refid指定的id不再本mapper文件中,需要前边加namespace -->
  30. <include refid="query_user_where"></include>
  31. <!-- 在这里还可能要引用其他的sql片段 -->
  32. </where>
  33. </select>

在mapper接口类中添加相应方法:

[java] view plaincopy
  1. //用户管理的Dao接口
  2. public interface UserMapper {
  3. //用户信息综合查询
  4. public List<UserCustom> findUserList(UserQueryVo userQueryVo) throws Exception;
  5. ......
  6. }

1.4测试代码

[java] view plaincopy
  1. //用户信息综合查询
  2. @Test
  3. public void testFindUserList() throws Exception{
  4. SqlSession sqlSession=sqlSessionFactory.openSession();
  5. //创建UserMapper代理对象
  6. UserMapper userMapper=sqlSession.getMapper(UserMapper.class);
  7. //创建包装对象,设置查询条件
  8. UserQueryVo userQueryVo=new UserQueryVo();
  9. //传入多个Id
  10. List<Integer> ids=new ArrayList<Integer>();
  11. ids.add(1);
  12. ids.add(3);
  13. ids.add(5);
  14. //将ids通过userQueryVo传入statement中
  15. userQueryVo.setIds(ids);
  16. //调用userMapper的方法
  17. List<UserCustom> users=userMapper.findUserList(userQueryVo);
  18. for (int i = 0; i < users.size(); i++) {
  19. UserCustom user=(UserCustom)users.get(i);
  20. System.out.println(user.getId()+":"+user.getUsername());
  21. }
  22. }

测试结果:
1:张三
3:刘莉莉
5:刘三姐

日志输出:

[plain] view plaincopy
  1. DEBUG [main] - Opening JDBC Connection
  2. DEBUG [main] - Created connection 6867819.
  3. DEBUG [main] - Setting autocommit to false on JDBC Connection [com.mysql.jdbc.Connection@68cb6b]
  4. DEBUG [main] - ==>  Preparing: select * from user WHERE ( id=? OR id=? OR id=? )
  5. DEBUG [main] - ==> Parameters: 1(Integer), 3(Integer), 5(Integer)
  6. DEBUG [main] - <==      Total: 3

可以看到,sql语句select * from user WHERE ( id=? OR id=? OR id=? ) 通过foreach输出成功

1.5另外一个sql的实现:

[html] view plaincopy
  1. <!-- 使用实现下边的sql拼接
  2. AND ID IN(1,3,5)-->
  3. <foreach collection="ids" item="user_id" open="AND ID IN(" close=")" separator=",">
  4. <!-- 每次遍历要拼接的串 -->
  5. #{user_id}
  6. </foreach>

【MyBatis框架】mapper配置文件-foreach标签相关推荐

  1. Mybatis系列:解决foreach标签内list为空的问题

    我把之前发布在简书的两篇文章通过拦截器Interceptor优化Mybatis的in查询 和Mybatis中foreach标签内list为空的解决方案进行了整合,整理为本文的内容.此外,我还对代码部分 ...

  2. Idea中Spring整合MyBatis框架中配置文件中对象注入问题解决方案

    运行环境:Spring框架整合MaBitis框架 问题叙述: 在Spring配置文件applicationContext-mybatis.xml中配置好mybatis之后 <?xml versi ...

  3. 【MyBatis框架】配置文件-resultMap总结

    resultMap总结 resultType: 作用: 将查询结果按照sql列名pojo属性名一致性映射到pojo中. 场合: 常见一些明细记录的展示,比如用户购买商品明细,将关联查询信息全部展示在页 ...

  4. c++框架有哪些_Java Mybatis框架入门教程_v20200726

    MyBatis 的前身是 Apache 的开源项目 iBatis.MyBatis 几乎可以代替 JDBC,是一个支持普通 SQL 查询,存储过程和高级映射的基于 Java 的优秀持久层框架.MyBat ...

  5. Java SE MyBatis框架(详解)

    Java SE MyBatis框架 目录 Java SE MyBatis框架 通用框架 1.lib 2.src 2.1.mybatis.xml 2.2.DateBase.properties 2.3. ...

  6. MyBatis框架知识

    代理模式 什么是代理模式? 代理模式相当于一个桥梁,代理对象负责增强功能(超市不负责生产) 为什么需要代理模式? 无法直接访问目标对象 代理对象举例? 房东-----------目标对象房屋中介--- ...

  7. MyBatis框架学习 DAY_02:使用XML配置文件/多参数问题 / FOREACH /IF / #{}和${} / 创建SSM框架流程

    XML文件配置SQL 1. 使用XML文件配置SQL语句 2. 关于多参数的问题 2. 练习 3. 动态SQL -- foreach 4. 动态SQL -- if 5. 关于#{}和${}格式的占位符 ...

  8. Mybatis工作流程,附带mybatis的mapper文件和config配置文件模板。mapper文件和dao接口的关系——xml中的namespace和sql标签id命名要求。

    1. Mybatis工作流程 1.1 使用MySQL创建数据库girls并生成一个表boys,如下图. 1.2 创建该表对应的简单实体类Boys,如下图. 1.3 创建Dao接口以及和接口同名的map ...

  9. (转)MyBatis框架的学习(四)——Mapper.xml文件中的输入和输出映射以及动态sql

    http://blog.csdn.net/yerenyuan_pku/article/details/71893689 前面对MyBatis框架的学习中,我们对Mapper.xml映射文件多少有些了解 ...

最新文章

  1. RGB Color Codes Chart
  2. SAP日记之一-漫漫自学路
  3. 作家百态之一:作家、批评家与酒
  4. 使用cadence建封装
  5. 【设计模式】第二章 代理模式
  6. 区块链的有趣应用:买彩票、云养鸡、查茅台
  7. 入职第一天:接口自动化测试怎么测
  8. 开发必学的验证码,教你从零写一个验证码
  9. 英语翻译软件测试简历,如此翻译-2 - Victor's Testing Career - 51Testing软件测试网 51Testing软件测试网-软件测试人的精神家园...
  10. 《Redis入门指南(第 2 版)》读后感
  11. ffmpeg 推流 m3u8 播放 EasyDarwin 存储录像和播放
  12. MAC小技巧|Mac屏幕截图去除窗口阴影
  13. 任正非谈管理--读书笔记
  14. 5G无线网络优化覆盖
  15. 专家学者热议智慧交通:大数据云计算,出行有“千里眼”
  16. Regulator的使用
  17. 【渝粤题库】陕西师范大学200111中学语文教学法 作业(专升本)
  18. 推荐Layui镜像网站
  19. python 桑基图 地理坐标_利用Python+Excel制作桑基(Sankey)图
  20. python numpy 子数组_详解:Python 取numpy数组的某几行某几列方法(含对与错示例)...

热门文章

  1. bootstrap bootstraptable 固定列_BootStrapTable分页
  2. Python数据科学|第一章:数据科学家的武器库
  3. .NET MVC扩展UrlHelper支持CDN
  4. E-MapReduce解决hive comment中文乱码问题
  5. 百度地图与谷歌地图 (常识、区别,更倾向于使用百度地图,纠错信息比谷歌多)...
  6. S2SH 第一次整合的经历
  7. OECP社区正式上线
  8. ActiveMQ Topic发布订阅消息
  9. POJ2586(贪心)
  10. cdoj 1252 24点游戏 dfs