目录

一、foreach元素的属性

二、collection属性值的三种情况

三、代码示例

四、相关错误


一、foreach元素的属性

collection: foreach的对象,作为入参,对象为list、array时,collection属性值分别默认用"list"、"array"代替,Map对象没有默认的属性值。但是,在作为入参时可以使用

@Param(“name”)注解来设置自定义collection属性值,设置name后,list、array会失效;

item: 集合元素迭代时的别名称,该参数为必选项,如果遍历的对象是map,则item为val;

index: 在list、array中,index为元素的序号索引。但是在Map中,index为遍历元素的key值,该参数为可选项;

open: 遍历集合时的开始符号,通常与close=")"搭配使用。使用场景IN(),values()时,该参数为可选项;

separator: 元素之间的分隔符,类比在IN()的时候,separator=",",最终所有遍历的元素将会以设定的(,)逗号符号隔开,该参数为可选项;

close: 遍历集合时的结束符号,通常与open="("搭配使用,该参数为可选项;

二、collection属性值的三种情况

1,如果传入的参数类型为list时: collection的默认属性值为list,同样可以使用@Param注解自定义name;

2,如果传入的参数类型为array时: collection的默认属性值为array,同样可以使用@Param注解自定义name;

3,如果传入的参数类型为Map时: collection的属性值可为三种情况:1.遍历map.keys;2.遍历map.values;3.遍历map.entrySet();

三、代码示例

1、properties配置文件:

up.merId=101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116

2、serviceImpl层:

//读取配置文件
@Value("#{'${up.merId}'.split(',')}")
private List<String> upMerList;//业务层方法核心
List<OrderInfo> oList = new ArrayList<>();
List<OrderInfo> lList = null;
OrderInfo orI = null;
System.out.println("upMerList:"+upMerList);
try{//方法一,对参数list进行遍历,逐个查询,再通过addAll合并所有集合
//     for (String s : upMerList) {
//         orI = new OrderInfo();
//         orI.setSettleDate(yesterDay);
//         orI.setOrderStatus("1");
//         orI.setNy(yesterDay);
//         orI.setMerSysId(s);
//         lList = orderInfoDao.selectOnlyOrderInfo(orI);
//         oList.addAll(lList);
//     }//方法二,将list传入SQL,在mapper层处理list参数orI = new OrderInfo();orI.setSettleDate(yesterDay);orI.setOrderStatus("1");orI.setNy(yesterDay);orI.setUpMerList(upMerList);oList = orderInfoDao.selectOnlyOrderInfo(orI);
}catch (Exception e){e.printStackTrace();logger.info("订单信息日期" + DateUtil.getYesterDay() + ",数据查询失败。");
}

3、OrderInfo主要参数

//表中包含字段
private String merSysId;//数据库表中不包含的字段,需要用transient 修饰
private transient List<String> upMerList;//其他参数及get、set方法在此省略不写

4、dao层方法

/*** 查询订单* @param* @return* @throws Exception
*/
public List<OrderInfo> selectOnlyOrderInfo(OrderInfo orderInfo);//所有参数都在OrderInfo中,同时参数不需要加其他注解修饰//若参数不放入OrderInfo中,则使用以下写法
List<OrderInfo> selectOnlyOrderInfo(@param("orderInfo") OrderInfo orderInfo, @param("upMerList") List<String> upMerList)

5、mapper层

<!-- 查询订单详情 --><select id="selectOnlyOrderInfo" parameterType="com.task.bean.OrderInfo"resultMap="orderInfo">SELECT*FROMorder_info_${ny} o<where><if test="orderStatus != null and orderStatus != ''">AND o.ORDER_STATUS = #{orderStatus}</if><!--         该if标签对应上面方法一  -->
<!--         <if test="settleDate != null and settleDate != ''">-->
<!--             AND o.MER_SYS_ID #{merSysId}-->
<!--         </if>--><!--            该if标签对应上面方法二  --><if test="upMerList != null">AND o.MER_SYS_ID in<foreach collection="upMerList" index="index" item="upMerList" open="(" separator="," close=")">#{upMerList}</foreach></if></where></select>

运行结果:

upMerList:[101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116]
DEBUG [main] c.t.o.d.O.selectOnlyOrderInfo            : ==>  Preparing: SELECT o.MER_ID, o.MER_SYS_ID, o.ORDER_DATE, o.MER_ORDER_ID, o.USER_NAME, o.CARD_M_NUM, o.SIGN_ORDER_ID, o.ORDER_TIME, o.ORDER_AMT, o.SETTLE_DATE, o.ORDER_STATUS, o.ORDER_CODE, o.ORDER_DESC FROM order_info_20220816 o WHERE o.ORDER_STATUS = ? AND o.MER_SYS_ID in ( ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? )
DEBUG [main] c.t.o.d.O.selectOnlyOrderInfo            : ==> Parameters: 1(String), 101(String), 102(String), 103(String), 104(String), 105(String), 106(String), 107(String), 108(String), 109(String), 110(String), 111(String), 112(String), 113(String), 114(String), 115(String), 116(String)
2022-08-22 11:23:02.072 DEBUG 8128 --- [           main] c.t.o.d.O.selectOnlyOrderInfo            : <==      Total: 771582

四、相关错误

1、实体类OrderInfo中未添加transient 修饰

Unknown column 'upMerList' in 'field list'//当出现该错误时,还有其他两种解决办法
//方法一:使用  javax.persistence包下的 @Transient 注解
/*方法二:使用  Mybatis-Plus的注解 @TableField(exist = false)* 它用在属性上,表示该属性不为数据库表字段,但又是必须使用的。* 使用说明:* 若exist = true,则表示该属性为数据库表字段。* exist = false,则表示该属性不为数据库表字段。
*/

2、mapper文件collection="list"时

org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.reflection.ReflectionException: There is no getter for property named 'list' in 'class com.task.bean.OrderInfo'

MyBatis动态SQL之<foreach>用法相关推荐

  1. MyBatis动态sql之foreach用法

    目录 1.foreach元素的属性 2.collection属性值的三种情况 3.代码示例 3.1 collection属性值为List(Array等同): 3.2 collection属性值类型为M ...

  2. 9.mybatis动态SQL标签的用法

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

  3. mybatis动态sql及分页

    1. 动态sql简述 mybatis的动态sql语句是基于OGNL表达式的.可以方便的在sql语句中实现某些逻辑. 总体说来mybatis动态SQL语句主要有以下几类: if 语句 (简单的条件判断) ...

  4. MyBatis Dynamic SQL(一)— 真正的Mybatis动态sql — MyBatis Dynamic SQL

    目录 现状 MyBatis Dynamic SQL 项目地址 官方文档 项目介绍 作者 Mybatis Generator 简介 特性 目标 提示 快速使用 步骤 定义常量Tables和Columns ...

  5. Mybatis 动态SQL

    Mybatis 动态SQL 一 .动态SQL 数组 array 使用foreach 标签 <!-- mybatis的集合操作知识点: 如果遇到集合参数传递,需要将集合遍历标签: foreach ...

  6. MyBatis动态SQL(认真看看, 以后写SQL就爽多了)

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 来源:cnblogs.com/homejim/p/9909657. ...

  7. 认真看看, 以后写 SQL 就爽多了:MyBatis 动态 SQL:

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 作者 | 阿进的写字台 来源 | cnblogs.com ...

  8. MyBatis动态SQL,写SQL更爽

    点击上方 好好学java ,选择 星标 公众号重磅资讯,干货,第一时间送达 今日推荐:分享一套基于SpringBoot和Vue的企业级中后台开源项目,这个项目有点哇塞!个人原创100W +访问量博客: ...

  9. 认真看看, 以后写 SQL 就爽多了:MyBatis 动态 SQL

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达今日推荐:2020年7月程序员工资统计,平均14357元,又跌了,扎心个人原创100W+访问量博客:点击前往,查看更多 整理 ...

  10. Mybatis 动态Sql语句《常用》

    MyBatis 的强大特性之一便是它的动态 SQL.如果你有使用 JDBC 或其他类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句有多么痛苦.拼接的时候要确保不能忘了必要的空格,还要注意省掉 ...

最新文章

  1. 利用java虚拟机的工具jmap分析java内存情况
  2. 从不用 try-catch 实现的 async/await 语法说错误处理
  3. python实现选择文件_python3实现文件选择对话框
  4. LiveQing直播点播存储流媒体服务-服务器并发性能及消耗带宽计算参考
  5. Elasticsearch实战:给博客打造全文检索
  6. 南阳oj92--图像有用区域(Bfs)
  7. 世界地球日:全国网友用手机种出“保护黄河幸福林”
  8. access中主键自动增长_ACCESS与EXCEL融合应用系列(一) :把数据导入Access
  9. python数据结构不常用的方法(哈哈,其实是常用的)
  10. 【自勉-向后端架构师/音视频架构师出发】我的目标是星辰大海(4月)
  11. 学校选课网筛选器的设想
  12. 王健林身价暴跌百亿,儿子却在撒钱!
  13. 转载知乎大神设置普通路由器支持IPV6
  14. php订阅号发送消息,php实现微信公众号主动推送消息
  15. JConsole:Java监视与管理控制台
  16. 上线两个月,微信小程序给那些用身体支持它的人带来了什么?
  17. 2022大三计算机 | 保研机试 | 学习路线
  18. VN.PY量化框架创始人教你做量化交易
  19. Redis内存淘汰策略LRU、LFU详解
  20. AutoJs学习-实现某音点赞自动回复

热门文章

  1. Mediawiki环境搭建
  2. 2021年智能优化算法:天鹰优化器AO-附MATLAB代码
  3. 计算机主机一闪一闪的无法启动,电脑开机屏幕一闪一闪的开不开在一重启就好了...
  4. 09年中国网络广告:淘宝市场份额直逼新浪
  5. 数据分析案例——客户流失分析与预测
  6. java list 交集 并集 差集 去重复并集
  7. 如何刷recovery
  8. 香港电讯及华为完成全球首个HSS/VoLTE系统转移
  9. 深度探索C++对象模型 学习笔记 第二章 构造函数语意学
  10. 咦,为什么我的事务回滚不了?