版权声明:本文为博主原创文章,未经博主允许不得转载。

foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合。foreach元素的属性主要有item,index,collection,open,separator,close。item表示集合中每一个元素进行迭代时的别名,index指定一个名字,用于表示在迭代过程中,每次迭代到的位置,open表示该语句以什么开始,separator表示在每次进行迭代之间以什么符号作为分隔符,close表示以什么结束,在使用foreach的时候最关键的也是最容易出错的就是collection属性,该属性是必须指定的,但是在不同情况下,该属性的值是不一样的,主要有一下3种情况:

  1. 如果传入的是单参数且参数类型是一个List的时候,collection属性值为list .
  2. 如果传入的是单参数且参数类型是一个array数组的时候,collection的属性值为array .
  3. 如果传入的参数是多个的时候,我们就需要把它们封装成一个Map了,当然单参数也可以封装成map,实际上如果你在传入参数的时候,在MyBatis里面也是会把它封装成一个Map的,map的key就是参数名,所以这个时候collection属性值就是传入的List或array对象在自己封装的map里面的key.
下面我们通过代码实践:
数据表:
采用Oracle的HR.Employees表
实体:Employees

public class Employees {
    private Integer employeeId;
    private String firstName;
    private String lastName;
    private String email;
    private String phoneNumber;
    private Date hireDate;
    private String jobId;
    private BigDecimal salary;
    private BigDecimal commissionPct;
    private Integer managerId;
    private Short departmentId;
}  
映射文件:

<!--List:forech中的collection属性类型是List,collection的值必须是:list,item的值可以随意,Dao接口中参数名字随意 -->
    <select id="getEmployeesListParams" resultType="Employees">
        select *
        from EMPLOYEES e
        where e.EMPLOYEE_ID in
        <foreach collection="list" item="employeeId" index="index"
            open="(" close=")" separator=",">
            #{employeeId}
        </foreach>
    </select>

<!--Array:forech中的collection属性类型是array,collection的值必须是:list,item的值可以随意,Dao接口中参数名字随意 -->
    <select id="getEmployeesArrayParams" resultType="Employees">
        select *
        from EMPLOYEES e
        where e.EMPLOYEE_ID in
        <foreach collection="array" item="employeeId" index="index"
            open="(" close=")" separator=",">
            #{employeeId}
        </foreach>
    </select>

<!--Map:不单单forech中的collection属性是map.key,其它所有属性都是map.key,比如下面的departmentId -->
    <select id="getEmployeesMapParams" resultType="Employees">
        select *
        from EMPLOYEES e
        <where>
            <if test="departmentId!=null and departmentId!=''">
                e.DEPARTMENT_ID=#{departmentId}
            </if>
            <if test="employeeIdsArray!=null and employeeIdsArray.length!=0">
                AND e.EMPLOYEE_ID in
                <foreach collection="employeeIdsArray" item="employeeId"
                    index="index" open="(" close=")" separator=",">
                    #{employeeId}
                </foreach>
            </if>
        </where>
    </select>


Mapper类:
public interface EmployeesMapper {

List<Employees> getEmployeesListParams(List<String> employeeIds);

List<Employees> getEmployeesArrayParams(String[] employeeIds);

List<Employees> getEmployeesMapParams(Map<String,Object> params);
}

测试方法(未贴完整代码):

@Test 
    public void testGetEmployeesListParams() {
        List<String> employeeIds = Arrays.asList("100", "101", "200");
        List<Employees> result = employeesMapper
                .getEmployeesListParams(employeeIds);
        assertEquals(3, result.size());
    }

@Test
    public void testGetEmployeesArrayParams() {
        String[] employeeIds = new String[] { "100", "200" };
        List<Employees> result = employeesMapper
                .getEmployeesArrayParams(employeeIds);
        assertEquals(2, result.size());
    }

@Test
    public void testGetEmployeesMapParams() {
        String departmentId = "60";
        List<String> employeeIdsList = Arrays.asList("103", "104", "105");
        String[] employeeIdsArray = new String[] { "103", "104" };
        // 传入多个参数
        Map<String, Object> params = new HashMap<String, Object>();
        params.put("departmentId", departmentId);
        params.put("employeeIdsList", employeeIdsList);
        params.put("employeeIdsArray", employeeIdsArray);
        List<Employees> result = employeesMapper.getEmployeesMapParams(params);
        assertEquals(3, result.size());
    }

以一下是全文
接口类

package com.ydssy.dao.product;

import java.util.List;
import java.util.Map;

import com.ydssy.model.product.ProductStore;

public interface ProductStoreMapper {
//接口 传入一个集合
List<ProductStore> parameterlist(String[] s);
}

映射文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.ydssy.dao.product.ProductStoreMapper" >

<!--Array:forech中的collection属性类型是array,collection的值必须是:list,item的值可以随意,Dao接口中参数名字随意 -->
<select id="parameterlist" parameterType="com.ydssy.model.product.ProductStore" resultType="com.ydssy.model.product.ProductStore">
select ps.* from es_product_store ps where ps.goodsid in<foreach collection="array" item="employeeId" index="index"  open="(" close=")" separator=",">
#{employeeId}
</foreach>
</select>

</mapper>

测试类

package test;

import java.util.List;

import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Before;
import org.junit.Test;

import com.ydssy.dao.product.ProductStoreMapper;
import com.ydssy.model.product.ProductStore;
public class TestProductStoreMapper {
private SqlSession session;
private ProductStoreMapper dao;

@Before// @Before在··之前
public void init() {

SqlSessionFactoryBuilder ssfb = new SqlSessionFactoryBuilder();
// SqlSessionFactory通过SqlSessionFactoryBuilder的ssfb方法里的类加载器的getResourceAsStream方法获取配置文件信息
//getResourceAsStream会创建一个流 通过这个流去获取配置文件,这个文件会返回一个importString这个流
SqlSessionFactory ssf = ssfb.build(TestProductStoreMapper.class.getClassLoader().getResourceAsStream("com/ydssy/goods/goods.xml"));

// 获得SqlSession对象
// (SqlSession是执行sql的一个容器 通过session访问数据库)。
session = ssf.openSession();
//用session对象去获取接口 ,getMapper方法会返回符合Tapper映射器( 即EmployeeDAO 接口) 要求的对象
dao = session.getMapper(ProductStoreMapper.class);
}

@Test
public void test3() {
String[] s = new String[] { "516","518" };
List<ProductStore> result = dao.parameterlist(s);
System.out.println(result);
session.commit();
session.close();
}
}

配置文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//ibatis.apache.org//DTD Config 3.0//EN"
"http://ibatis.apache.org/dtd/ibatis-3-config.dtd">
<configuration>
<environments default="environment">
<environment id="environment">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url"
value="jdbc:mysql:///symall_emoji?useUnicode=true&amp;characterEncoding=UTF-8&amp;allowMultiQueries=true&amp;useSSL=true" />
<property name="username" value="root" />
<property name="password" value="123456" />
</dataSource>
</environment>
</environments>
<mappers><!-- 配置文件连接 映射器文件 -->
<mapper resource="com/ydssy/mapping/goods/GoodsCatMapper.xml" />
<mapper resource="com/ydssy/mapping/product/ProductStoreMapper.xml" />

</mappers>
</configuration>

转载于:https://www.cnblogs.com/mxcl/p/8318463.html

MyBatis参数传入集合之foreach动态sql相关推荐

  1. mybatis入门(四)之动态SQL

    转载自  mybatis 动态SQL 动态 SQL MyBatis 的强大特性之一便是它的动态 SQL.如果你有使用 JDBC 或其它类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句的痛苦. ...

  2. Mybatis学习日记(四)——动态SQL第一部分

    Mybatis的强大特性之一是它的动态SQL,在进行项目开发的时候,我们对数据库的操作不可能全部是定式的,当对数据库的操作根据不同情况发生变化时,就可以用到Mybatis的动态SQL.而Mybatis ...

  3. c3p0 参数 模糊查询_mybatis之动态sql,模糊查询,结果集处理,mybatis分页及特殊字符处理...

    目标及项目目录结构 目标 1.mybatis动态sql 2.模糊查询 3.查询返回结果集的处理 4.分页查询 5.特殊字符处理 项目的目录结构 1.mybatis动态sql If.trim.forea ...

  4. Spring+SpringMVC+MyBatis深入学习及搭建(五)——动态sql

    mybatis核心:对sql语句进行灵活操作,通过表达式进行判断,对sql进行灵活拼接.组装. mybatis提供各种标签方法实现动态拼接sql. 1. if&where 1.2 需求 用户信 ...

  5. MyBatis学习笔记(六)动态sql

    在一些情况下,如查询参数不确定时,需要用到动态sql 例子,根据动态输入的查询条件查询student. 一.if语句 1.StudentTMapper [html] view plain copy p ...

  6. 【Mybatis 之应用篇】 4_动态SQL、缓存

    文章目录 Mybatis 十二.动态SQL 1.IF 2.choose(when,otherwise) 3.where,set 4.SQL片段 5.Foreach 十三.缓存 (了解) 1.简介 2. ...

  7. 【MyBatis】学习纪要六:动态SQL

    2019独角兽企业重金招聘Python工程师标准>>> 引言 动态SQL:Dynamic SQL. 本节我们来通过 MyBatis 的官方文档进行学习. Description(描述 ...

  8. mybatis中mapper文件中的动态sql语句

    有时候在检索时,用户提供的数据不一样多,我们很难使用静态的sql语句进行判别,所以这个时候需要使用动态的sql语句 这里主要针对Mapper.xml文件中的sql语句,笔者在下面所有的例子中只提供了M ...

  9. mybatis的注解开发之三种动态sql

    脚本sql XML配置方式的动态SQL我就不讲了,有兴趣可以自己了解,下面是用<script>的方式把它照搬过来,用注解来实现.适用于xml配置转换到注解配置 @Select(" ...

最新文章

  1. 全球五大顶级域名一周统计 .BIZ环比上升7.3%
  2. opencv转pytorch
  3. 第九届河南理工大学算法程序设计大赛 正式赛(ABCDEFGHJKL)
  4. js cookies 存数组_用一个例子理解JS函数的底层处理机制
  5. WAR文件与具有嵌入式服务器的Java应用程序
  6. Jsoup使用DOM方法来遍历一个文档
  7. linux设备模型之tty驱动架构分析,linux设备模型之uart驱动架构分析
  8. 【渝粤教育】广东开放大学 企业文化学 形成性考核 (57)
  9. linux中的文本处理方法集锦
  10. 企业微信分享小程序功能
  11. 网络百科——网络接口卡
  12. 分析与提取QQ木马盗号技术
  13. 【图的表示】:如何存储微博、微信等社交网络中的好友关系?
  14. 命令行实现URL编解码
  15. .Net6.0系列-6 .Net 6LinQ(二)常用扩展方法
  16. layui 读取本地excel内容_layui-excel
  17. win7下设置 WiFi AP
  18. CentOS 7.2 添加磁盘并创建新区
  19. 【OpenCV 学习笔记】第二十章: 角点检测之:harris算法以及Shi-Tomasi算法
  20. Docker快速入门与使用

热门文章

  1. UML图系列——用例图
  2. Oracle存储结构_文件
  3. Gentoo 安装日记 14 (配置内核 :设备驱动)
  4. mysql udf提权_mysql——udf提权
  5. ae 创建图像等高线 蒙版_Pixelmator ——图像处理软件
  6. 第八届蓝桥杯决赛 图书排列
  7. express与mysql数据库_express无法连接到mysql数据库
  8. 计算机组成原理试卷五套,计算机组成原理(五套试题)
  9. 腾讯再次劝退高龄员工,IT人的中年危机,我来教你化解!
  10. 20个超高效的Linux命令与技巧