文档章节

【MyBatis框架】mapper配置文件-foreach标签

M
 Mysoft
发布于 2015/09/18 14:30
字数 728
阅读 479
收藏 2

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片段。

<pre name="code" class="html"><!-- 定义sql片段 
id:sql片段的唯一标识 
在sql片段中不要加入where
经验:一般我们定义sql片段是为了可重用性,是基于单表来定义sql片段,
这样的话这个sql片段可重用性才高-->
<sql id="query_user_where">
    <if test="ids!=null">
        <!-- 使用foreach遍历传入ids 
        collection指定输入对象中集合属性
        item每次遍历生成的对象名
        open开始遍历时要拼接的串
        close开始遍历时要拼接的串
        separator遍历的两个对象中间需要拼接的串
        -->
        <!-- 使用实现下边的sql拼接 
        WHERE (id=1 OR id=3 OR id=5)-->
        <foreach collection="ids" item="user_id" open="AND (" close=")" separator="OR">
            <!-- 每次遍历要拼接的串 -->
            id=#{user_id}
        </foreach>
    </if>
</sql>

<!-- 用户信息综合查询 -->
    <select id="findUserList" parameterType="cn.edu.hpu.mybatis.PO.UserQueryVo" 
                                resultType="cn.edu.hpu.mybatis.PO.UserCustom">
        select * from user 
        
        <!-- where标签可以自动去掉第一个and -->  
        <where>
            <!-- 应用sql片段的id,如果refid指定的id不再本mapper文件中,需要前边加namespace -->
            <include refid="query_user_where"></include>
            <!-- 在这里还可能要引用其他的sql片段 -->
        </where>
    </select>

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

//用户管理的Dao接口
public interface UserMapper {
    
    //用户信息综合查询
    public List<UserCustom> findUserList(UserQueryVo userQueryVo) throws Exception;
    ......
}

1.4测试代码

//用户信息综合查询
    @Test
    public void testFindUserList() throws Exception{
        
        SqlSession sqlSession=sqlSessionFactory.openSession();
        
        //创建UserMapper代理对象
        UserMapper userMapper=sqlSession.getMapper(UserMapper.class);
        
        //创建包装对象,设置查询条件
        UserQueryVo userQueryVo=new UserQueryVo();
        //传入多个Id
        List<Integer> ids=new ArrayList<Integer>();
        ids.add(1);
        ids.add(3);
        ids.add(5);
        //将ids通过userQueryVo传入statement中
        userQueryVo.setIds(ids);
        
        //调用userMapper的方法
        List<UserCustom> users=userMapper.findUserList(userQueryVo);
        
        for (int i = 0; i < users.size(); i++) {
            UserCustom user=(UserCustom)users.get(i);
            System.out.println(user.getId()+":"+user.getUsername());
        }
    }

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

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

1.5另外一个sql的实现:

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


本文转载自:http://blog.csdn.net/acmman/article/details/46581375

共有 人打赏支持
M
粉丝 4
博文 58
码字总数 24535
作品 0
广州
高级程序员
私信 提问
mybatis学习笔记(2)-mybatis概述

mybatis学习笔记(2)-mybatis概述 标签: mybatis [TOC] 本文对mybatis做一个简单介绍,包括框架原理,执行过程,开发方法,输入输出映射以及动态sql,我会在后续的系列文章中一一详细说明 my...

brianway
2016/02/27
334
0
Mybatis配置文件详解(4)

本次主要来了解: MyBatis数据库配置文件SqlMapConfig.xml SQL映射配置中输入映射的配置 SQL映射配置中输出映射的配置 SQL映射配置中动态SQL语句的配置 1. SqlMapConfig配置文件详解 主要来配...

LeaveStyle
2018/08/30
0
0
MyBatis向数据库中批量插入数据

Foreach标签 foreach: collection:指定要遍历的集合; 表示传入过来的参数的数据类型。该参数为必选。要做 foreach 的对象,作为入参时,List 对象默认用 list 代替作为键, 数组对象有 arra...

必须往前走
01/11
0
0
源码分析 Mybatis 的 foreach 为什么会出现性能问题

背景 最近在做一个类似于综合报表之类的东西,需要查询所有的记录(数据库记录有限制),大概有1W条记录,该报表需要三个表的数据,也就是根据这 1W 个 ID 去执行查询三次数据库,其中,有一...

TSMYK
2018/12/16
0
0
MyBatis使用笔记

MyBatis MyBatis作为一个轻量的SQL映射框架,确实很简单,但是知识点挺多,实际使用中还是会有时想不起来某个标签该怎么写,所以整理了这篇文章,以备查询。由于MyBatis如此简单,使得这一篇...

楠木楠
2016/11/22
17
0

没有更多内容

加载失败,请刷新页面

加载更多

pg_lightool基于basebackup的单表恢复和块恢复

开源软件pg_lightool,实现了基于wal日志的块恢复。详情参见博客:https://my.oschina.net/lcc1990/blog/1931485。由于wal日志中FPW的不确定性,它不能作为一个数据库恢复的解决方案。目前对...

movead
27分钟前
2
0
对比剖析Swarm Kubernetes Marathon编排引擎

Docker Native Orchestration 基本结构 Docker Engine 1.12 集成了原生的编排引擎,用以替换了之前独立的Docker Swarm项目。Docker原生集群(Swarm)同时包括了(Docker Engine \/ Daemons)...

Linux就该这么学
28分钟前
2
0
Mybatis的结果集处理

此时我们已经可以把整段的SQL语句取出,但还并没有在数据库中去执行,我们可以先来分析一下配置文件中SQL语句执行后的结果集是如何处理的。 Mybatis会将结果集按照映射配置文件中定义的映射规...

算法之名
41分钟前
21
0
Spring Boot(Spring的自动整合框架)

Spring Boot 是一套基于Spring框架的微服务框架,由于Spring是一个轻量级的企业开发框架,主要功能就是用于整合和管理其他框架,想法是将平时主流使用到的框架的整合配置预先写好,然后通过简...

花漾年华
44分钟前
2
0
Windows下条件变量的实现

条件变量是什么? 是一种同步对象。 条件变量有什么用? 用于复杂的、多线程的、多核的程序中,实现多个线程间同步任务。 条件变量与其它同步对象的区别? 与事件、互斥锁、segment等同步对象...

shzwork
45分钟前
1
1

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部