小视频网站开发流程图,网页源代码下载,wordpress如何上传产品,什么是优化资源配置目录 前言1. 基本语法2. Demo3. 实际例子 前言
对于Java专栏#xff1a;Java专栏 对于Mybatis的相关知识可看我之前的文章#xff1a;Mybatis从入门到精通#xff08;全#xff09; 对于其余Java框架可看我之前的文章#xff1a;java框架 零基础从入门到精通的学习路线 附… 目录 前言1. 基本语法2. Demo3. 实际例子 前言
对于Java专栏Java专栏 对于Mybatis的相关知识可看我之前的文章Mybatis从入门到精通全 对于其余Java框架可看我之前的文章java框架 零基础从入门到精通的学习路线 附开源项目面经等超全
对于上述Mybatis中曾有讲过foreach标签此篇博客对其标签进行拓展
1. 基本语法
MyBatis中的foreach标签是用于迭代集合或数组的元素生成对应的SQL片段以便在动态SQL中使用。
该标签通常用于循环处理参数集合生成多个相同的SQL片段以实现批量操作或动态条件查询。
其基本的语法如下
foreach collectioncollectionName itemitemName indexindexName open( close) separator,#{itemName}
/foreach对应的属性如下只有collection和item是必选其他都是可选参数
collection: 指定要迭代的集合或数组的属性名表示传入的参数的数据类型。 该属性是必须指定的用于指定要进行foreach操作的对象。item: 指定在迭代过程中每个元素的别名表示本次迭代获取的元素。 若collection为List、Set或者数组则表示其中的元素 若collection为map则代表key-value的value。 该参数是必选的。index: 指定在迭代过程中每个元素的索引仅对集合有效。 在遍历List时index表示元素的索引在遍历Map时index表示Map的key。该参数是可选的。open: 指定迭代开始时的字符串最常用的是左括弧(。 MyBatis会将该字符拼接到整体的SQL语句之前并且只拼接一次。该参数是可选的。close: 指定迭代结束时的字符串最常用的是右括弧)。 MyBatis会将该字符拼接到整体的SQL语句之后。该参数是可选的。separator: 指定每次迭代之间的分隔符。 在SQL语句中用于分隔不同元素的值。例如1,2,3之间的,。该参数是可选的。
2. Demo
下面是一个简单的例子假设有一个包含多个用户ID的集合我们想要生成一个SQL语句查询这些用户
select idselectUsersByIds resultTypeUserSELECT * FROM usersWHERE id INforeach collectionuserIds itemuserId open( close) separator,#{userId}/foreach
/select在这个例子中userIds是一个包含用户ID的集合foreach标签会生成类似于IN (id1, id2, id3)的SQL片段。
另外如果使用MyBatis的动态SQL功能可以在if标签内使用foreach以根据条件动态生成SQL片段以下是一个例子假设有一个条件查询的场景根据用户选择的角色列表进行查询
select idselectUsersByRoles resultTypeUserSELECT * FROM userswhereif testroles ! null and roles.size 0AND id INforeach collectionroles itemrole open( close) separator,#{role}/foreach/if/where
/select在这个例子中selectUsersByRoles是一个动态SQL查询它根据用户传入的roles参数动态生成SQL条件。
如果roles不为空且包含元素那么if标签内的内容会生效生成类似于AND id IN (role1, role2, role3)的SQL片段。如果roles为空或不包含元素该条件会被忽略从而生成不包含AND的SQL语句。
在实际应用中这种动态SQL的使用可以根据不同的业务需求动态构建查询条件使SQL语句更加灵活和可复用。
3. 实际例子
结合实战中的例子讲解更加透彻
批量插入即列表中有多个元素代码示例
insert idsaveForList parameterTypejava.util.ListINSERT INTO E_DEVICE_TEMP_ALARM_HIST(DEVICE_NAME, BATTERY_TEMP, SEND_TO_DRIVER, CREATE_TIME, UPDATE_TIME, SENDER, SUGGESTION)foreach collectiontemperatureAlarmHistList itemtemperatureAlarmHist separatorunion all open( close)SELECT#{temperatureAlarmHist.deviceName, jdbcTypeVARCHAR},#{temperatureAlarmHist.batteryTemp, jdbcTypeVARCHAR},#{temperatureAlarmHist.sendToDriver, jdbcTypeINTEGER},#{temperatureAlarmHist.createTime, jdbcTypeDATE},#{temperatureAlarmHist.updateTime, jdbcTypeDATE},#{temperatureAlarmHist.sender, jdbcTypeVARCHAR},#{temperatureAlarmHist.suggestion, jdbcTypeVARCHAR}FROM DUAL/foreach
/insert动态SQL语句更新语句也同理
update idremoveRuleDetailByRuleId update equipment_change_shifts_rule_detail set is_deleted 1 where rule_id INforeach collectionids itemid indexindex open( separator, close)#{id}/foreach
/update结合if语句且参数位置可以随意
select idtrees resultMaptreeNodeResultMapselect id, parent_id, equipment_name as title, id as value, id as key,location from equipment_architecture where is_deleted 0if testtenantId!nulland tenant_id #{tenantId}/ifand id inforeach close) collectionids itemlistItem open( separator,#{listItem}/foreach
/select