当前位置: 首页 > news >正文

项目中的sql语句涉及到取集合时(即in(...))的用法foreach

1.foreach简单介绍:

foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合。
foreach元素的属性主要有item,index,collection,open,separator,close。
item表示集合中每一个元素进行迭代时的别名,
index指定一个名字,用于表示在迭代过程中,每次迭代到的位置,
open表示该语句以什么开始,
separator表示在每次进行迭代之间以什么符号作为分隔符,
close表示以什么结束,
collection属性是在使用foreach的时候最关键的也是最容易出错的,该属性是必须指定的,但是在不同情况下,该属性的值是不一样的,主要有一下3种情况:
(1)如果传入的是单参数且参数类型是一个List的时候,collection属性值为list .
(2)如果传入的是单参数且参数类型是一个array数组的时候,collection的属性值为array .
(3)如果传入的参数是多个的时候,我们就需要把它们封装成一个Map了,当然单参数也可以封装成map,实际上如果你在传入参数的时候,在MyBatis里面也是会把它封装成一个Map的,map的key就是参数名,所以这个时候collection属性值就是传入的List或array对象在自己封装的map里面的key.
2.实践-实体类

[java] view plain copy
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;  
}    

3.实践-XML

[html] view plain copy

<!--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>  

4.实践-Mapper

[java] viewcopy

public interface EmployeesMapper {   

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

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

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

5.可能出现的错误
Parameter ‘list’ not found. Available parameters are [XXX, param1]
产生这个问题的原因是由于一直认为 foreach 里面的 collection 应该放的是 java.util.List 之类的,但其实应该是我们与Dao里面 @Param(“XXX”) 绑定的参数名一致。

参考:http://blog.csdn.net/s592652578/article/details/52871884
https://www.cnblogs.com/zhangqian27/p/6842430.html

相关文章:

  • nginx 日志分析工具goaccess
  • MyEclipse+Tomcat+MAVEN+SVN项目完整环境搭建
  • HDU2602(01背包)
  • 使用maven创建web项目
  • 在orcal数据库中循环插入的语句
  • 李洪强iOS开发之OC[009] -OC无参方法的声明实现和调用
  • 看到一篇讲的很详细的创建Maven项目然后转成动态web项目的介绍。
  • 使用MyBatis Generator自动创建代码
  • 当装了两个tomcat后,修改tomcat端口
  • Linux strace命令
  • mybatis深入理解之 # 与 $ 区别以及 sql 预编译
  • Spring定时任务,Spring4整合quartz2.2,quartz-scheduler定时任务
  • orcal数据库的主键的自动增长
  • 虚拟主机通过修改.htaccess将入口重定向到public文件夹
  • 从orcal库中的B表复制数据到A表
  • E-HPC支持多队列管理和自动伸缩
  • iOS编译提示和导航提示
  • Redis在Web项目中的应用与实践
  • storm drpc实例
  • Webpack4 学习笔记 - 01:webpack的安装和简单配置
  • 两列自适应布局方案整理
  • 浅谈web中前端模板引擎的使用
  • 如何设计一个微型分布式架构?
  • 为物联网而生:高性能时间序列数据库HiTSDB商业化首发!
  • 我从编程教室毕业
  • 以太坊客户端Geth命令参数详解
  • 主流的CSS水平和垂直居中技术大全
  • 追踪解析 FutureTask 源码
  • 白色的风信子
  • 阿里云ACE认证之理解CDN技术
  • ​configparser --- 配置文件解析器​
  • ​Kaggle X光肺炎检测比赛第二名方案解析 | CVPR 2020 Workshop
  • ​sqlite3 --- SQLite 数据库 DB-API 2.0 接口模块​
  • ​TypeScript都不会用,也敢说会前端?
  • # 执行时间 统计mysql_一文说尽 MySQL 优化原理
  • (007)XHTML文档之标题——h1~h6
  • (10)工业界推荐系统-小红书推荐场景及内部实践【排序模型的特征】
  • (51单片机)第五章-A/D和D/A工作原理-A/D
  • (cos^2 X)的定积分,求积分 ∫sin^2(x) dx
  • (pt可视化)利用torch的make_grid进行张量可视化
  • (SpringBoot)第二章:Spring创建和使用
  • (ZT)出版业改革:该死的死,该生的生
  • (附源码)ssm捐赠救助系统 毕业设计 060945
  • (三)centos7案例实战—vmware虚拟机硬盘挂载与卸载
  • (转)Android学习笔记 --- android任务栈和启动模式
  • (转)PlayerPrefs在Windows下存到哪里去了?
  • .java 指数平滑_转载:二次指数平滑法求预测值的Java代码
  • .net redis定时_一场由fork引发的超时,让我们重新探讨了Redis的抖动问题
  • .NET 回调、接口回调、 委托
  • .Net 应用中使用dot trace进行性能诊断
  • .NET/C# 在代码中测量代码执行耗时的建议(比较系统性能计数器和系统时间)
  • .NET6实现破解Modbus poll点表配置文件
  • .NET开发人员必知的八个网站
  • .net中应用SQL缓存(实例使用)
  • .net最好用的JSON类Newtonsoft.Json获取多级数据SelectToken