MyBatis参数传入集合之foreach动态sql

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);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/419369.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

“睡服”面试官系列第四篇之字符串的扩展(建议收藏学习)

目录 字符串的扩展 1. 字符的 Unicode 表示法 2. codePointAt() 3. String.fromCodePoint() 4. 字符串的遍历器接口 5. at() 6. normalize() 7. includes(), startsWith(), endsWith() 8. repeat() 9. padStart()&#xff0c;padEnd() 10. 模板字符串 11. 实例&…

Chapter 5 Exercises Problems

转载于:https://www.cnblogs.com/momoko/p/4931714.html

Android之Notification制作多媒体控制器

上一篇讲述了Notification的基础用法&#xff0c;本篇将介绍&#xff0c;自定义通知栏&#xff0c;并利用讲到的内容&#xff0c;实现一个简单的音乐播发器。 1.自定义通知的实现&#xff1b; Notification有一个contentView属性&#xff0c;该属性接受的对象是RemoteView对象&…

MyBatis 多表联合查询及优化

关于优化 对于优化嘛&#xff0c;我这里简单的提几点&#xff0c;大家可以考虑一下。首先&#xff0c;就是对表的设计&#xff0c;在设计表初期&#xff0c;不仅仅要考虑到数据库的规范性&#xff0c;还好考虑到所谓的业务&#xff0c;以及对性能的影响&#xff0c;比如&#x…

React Native windows环境安装遇到的坑

在官方中文文档中&#xff08;http://reactnative.cn/docs/0.37/getting-started.html&#xff09;有一段话是&#xff1a;使用Chocolatey来安装NodeJS。注意&#xff0c;目前已知Node 7.1版本在windows上无法正常工作&#xff0c;请注意避开这个版本&#xff01; 如何避开&…

linux指令查看tomcat日志

实际开发中经常遇到查看远程tomcat日志&#xff0c;来查找原因:因此总结了一些常用的linux指令 1、先切换到&#xff1a;cd usr/local/tomcat5/logs 2、tail -f catalina.out3、这样运行时就可以实时查看运行日志了 Ctrlc 是退出tail命令。 其他常用的linux指令整理&#x…

iptables对请求的URL作IP访问控制

服务器运行环境是Tomcat&#xff0c;现在要实现的目的是&#xff0c;只允许特定的IP访问某个目录&#xff0c;一种方法是在tomcat配置文件server.conf中&#xff0c;使用RemoteAddrValve对虚拟主机做访问控制。另外一种方法可以通过iptables规则。个人比较喜欢iptables例如&…

React-Native填坑之TextInput value属性

TextInput用法就不多讲了&#xff0c;主要记录下遇到的一个怪问题。 背景&#xff1a;项目需要开发一个充值页面&#xff0c;需要一个输入框&#xff0c;然后几个按钮&#xff0c;输入框是允许用户自己输入任意金额&#xff0c;按钮是可以让用户快捷选择金额。那么问题来了&…

Spring的特点

Spring框架Spring框架是一个分层架构,有7个定义良好的模块组成spring模块构建在核心容器智之上, 核心容器定义了创建、 配置、和管理bean的方式组成spring框架的每个模块(或组件)都可以单独存在, 或者与其他一个或多个模块联合实现 模块如下: 1--核心容器 核心容器提供spring框…

MySQL对一行多列求和

SUM函数的语法是&#xff1a; SELECT SUM(expression ) FROM tables WHERE predicates; 表达式可以是一个数值字段或公式。 SELECT column1 column1 column1 …… column1 AS Total FROM table

mybatis判断集合为空或者元素个数为零

mybatis判断集合为空或者元素个数为零&#xff1a; <if test"mlhs ! null and mlhs.size() ! 0">and t.mlh_name not in <foreach collection"mlhs" item"item1" open"(" close")" index"i" separator&…

React-Native 填坑之ListView(item更新)

一 背景 效果图如下&#xff1a;二 解决办法 我的目的是实现单选item&#xff0c;正常情况设置一个state变量来保存选中的Index,在每次点击item的时候改变index就OK&#xff01;但是&#xff0c;我想的太天真了。this.setState()只能渲染外部组件&#xff0c;而ListView子组件…

锋利的jQuery--编写jQuery插件(读书笔记五)[完结篇]

1.表单验证插件Validation2.表单插件Form3.动态事件绑定插件livequery可以为后来的元素绑定事件类似于jQuery中的live()方法4.jQuery UI5.jQuery Cookie6.遮罩层插件:thickbox7.编写jQuery插件<1>编写插件的目的&#xff1a;给已经有的一些列方法或函数做一个封装&#x…

Java中的注解以及应用 @Deprecated @SupressWarning @Override

Annotation注解在 Java 中有着很广泛的,他是做为一种标识 为javac所识别,。每一个注解 都对应这一个Java类 在java.lang包中 有三个注解 分别是Deprecated SuppressWarning Override 在使用 注解前必须要在 注解类前面加上 每增加一个注解 就意味着产生了一个注解…