MyBatis动态SQL之<foreach>用法
目录
一、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>用法相关推荐
- MyBatis动态sql之foreach用法
目录 1.foreach元素的属性 2.collection属性值的三种情况 3.代码示例 3.1 collection属性值为List(Array等同): 3.2 collection属性值类型为M ...
- 9.mybatis动态SQL标签的用法
mybatis动态SQL标签的用法 动态 SQL MyBatis 的强大特性之一便是它的动态 SQL.如果你有使用 JDBC 或其他类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句有多么痛苦 ...
- mybatis动态sql及分页
1. 动态sql简述 mybatis的动态sql语句是基于OGNL表达式的.可以方便的在sql语句中实现某些逻辑. 总体说来mybatis动态SQL语句主要有以下几类: if 语句 (简单的条件判断) ...
- MyBatis Dynamic SQL(一)— 真正的Mybatis动态sql — MyBatis Dynamic SQL
目录 现状 MyBatis Dynamic SQL 项目地址 官方文档 项目介绍 作者 Mybatis Generator 简介 特性 目标 提示 快速使用 步骤 定义常量Tables和Columns ...
- Mybatis 动态SQL
Mybatis 动态SQL 一 .动态SQL 数组 array 使用foreach 标签 <!-- mybatis的集合操作知识点: 如果遇到集合参数传递,需要将集合遍历标签: foreach ...
- MyBatis动态SQL(认真看看, 以后写SQL就爽多了)
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 来源:cnblogs.com/homejim/p/9909657. ...
- 认真看看, 以后写 SQL 就爽多了:MyBatis 动态 SQL:
点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 作者 | 阿进的写字台 来源 | cnblogs.com ...
- MyBatis动态SQL,写SQL更爽
点击上方 好好学java ,选择 星标 公众号重磅资讯,干货,第一时间送达 今日推荐:分享一套基于SpringBoot和Vue的企业级中后台开源项目,这个项目有点哇塞!个人原创100W +访问量博客: ...
- 认真看看, 以后写 SQL 就爽多了:MyBatis 动态 SQL
点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达今日推荐:2020年7月程序员工资统计,平均14357元,又跌了,扎心个人原创100W+访问量博客:点击前往,查看更多 整理 ...
- Mybatis 动态Sql语句《常用》
MyBatis 的强大特性之一便是它的动态 SQL.如果你有使用 JDBC 或其他类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句有多么痛苦.拼接的时候要确保不能忘了必要的空格,还要注意省掉 ...
最新文章
- 利用java虚拟机的工具jmap分析java内存情况
- 从不用 try-catch 实现的 async/await 语法说错误处理
- python实现选择文件_python3实现文件选择对话框
- LiveQing直播点播存储流媒体服务-服务器并发性能及消耗带宽计算参考
- Elasticsearch实战:给博客打造全文检索
- 南阳oj92--图像有用区域(Bfs)
- 世界地球日:全国网友用手机种出“保护黄河幸福林”
- access中主键自动增长_ACCESS与EXCEL融合应用系列(一) :把数据导入Access
- python数据结构不常用的方法(哈哈,其实是常用的)
- 【自勉-向后端架构师/音视频架构师出发】我的目标是星辰大海(4月)
- 学校选课网筛选器的设想
- 王健林身价暴跌百亿,儿子却在撒钱!
- 转载知乎大神设置普通路由器支持IPV6
- php订阅号发送消息,php实现微信公众号主动推送消息
- JConsole:Java监视与管理控制台
- 上线两个月,微信小程序给那些用身体支持它的人带来了什么?
- 2022大三计算机 | 保研机试 | 学习路线
- VN.PY量化框架创始人教你做量化交易
- Redis内存淘汰策略LRU、LFU详解
- AutoJs学习-实现某音点赞自动回复