对于Java专栏:Java专栏
对于Mybatis的相关知识可看我之前的文章:Mybatis从入门到精通(全)
对于其余Java框架可看我之前的文章:java框架 零基础从入门到精通的学习路线 附开源项目面经等(超全)
对于上述Mybatis中曾有讲过foreach标签!此篇博客对其标签进行拓展
MyBatis中的
标签是用于迭代集合或数组的元素,生成对应的SQL片段,以便在动态SQL中使用。
该标签通常用于循环处理参数集合,生成多个相同的SQL片段,以实现批量操作或动态条件查询。
其基本的语法如下:
<foreach collection="collectionName" item="itemName" index="indexName" open="(" close=")" separator=",">
#{itemName}
foreach>
对应的属性如下:(只有collection和item是必选,其他都是可选参数)
collection
: 指定要迭代的集合或数组的属性名,表示传入的参数的数据类型。item
: 指定在迭代过程中每个元素的别名,表示本次迭代获取的元素。index
: 指定在迭代过程中每个元素的索引,仅对集合有效。open
: 指定迭代开始时的字符串,最常用的是左括弧'('
。close
: 指定迭代结束时的字符串,最常用的是右括弧')'
。separator
: 指定每次迭代之间的分隔符。下面是一个简单的例子,假设有一个包含多个用户ID的集合,我们想要生成一个SQL语句查询这些用户:
<select id="selectUsersByIds" resultType="User">
SELECT * FROM users
WHERE id IN
<foreach collection="userIds" item="userId" open="(" close=")" separator=",">
#{userId}
foreach>
select>
在这个例子中,userIds是一个包含用户ID的集合,
标签会生成类似于IN (id1, id2, id3)的SQL片段。
另外,如果使用MyBatis的动态SQL功能,可以在
标签内使用
,以根据条件动态生成SQL片段,以下是一个例子,假设有一个条件查询的场景,根据用户选择的角色列表进行查询:
<select id="selectUsersByRoles" resultType="User">
SELECT * FROM users
<where>
<if test="roles != null and roles.size > 0">
AND id IN
<foreach collection="roles" item="role" open="(" close=")" separator=",">
#{role}
foreach>
if>
where>
select>
在这个例子中,selectUsersByRoles是一个动态SQL查询,它根据用户传入的roles参数动态生成SQL条件。
标签内的内容会生效,生成类似于AND id IN (role1, role2, role3)
的SQL片段。在实际应用中,这种动态SQL的使用可以根据不同的业务需求动态构建查询条件,使SQL语句更加灵活和可复用。
结合实战中的例子,讲解更加透彻
批量插入
,即列表中有多个元素,代码示例:<insert id="saveForList" parameterType="java.util.List">
INSERT INTO E_DEVICE_TEMP_ALARM_HIST(DEVICE_NAME, BATTERY_TEMP, SEND_TO_DRIVER, CREATE_TIME, UPDATE_TIME, SENDER, SUGGESTION)
<foreach collection="temperatureAlarmHistList" item="temperatureAlarmHist" separator="union all" open="(" close=")">
SELECT
#{temperatureAlarmHist.deviceName, jdbcType=VARCHAR},
#{temperatureAlarmHist.batteryTemp, jdbcType=VARCHAR},
#{temperatureAlarmHist.sendToDriver, jdbcType=INTEGER},
#{temperatureAlarmHist.createTime, jdbcType=DATE},
#{temperatureAlarmHist.updateTime, jdbcType=DATE},
#{temperatureAlarmHist.sender, jdbcType=VARCHAR},
#{temperatureAlarmHist.suggestion, jdbcType=VARCHAR}
FROM DUAL
foreach>
insert>
动态SQL语句
,更新语句也同理:<update id="removeRuleDetailByRuleId" >
update equipment_change_shifts_rule_detail set is_deleted = 1 where rule_id IN
<foreach collection="ids" item="id" index="index" open="(" separator="," close=")">
#{id}
foreach>
update>
结合if语句
,且参数位置可以随意:<select id="trees" resultMap="treeNodeResultMap">
select id, parent_id, equipment_name as title, id as 'value', id as 'key',location from equipment_architecture where is_deleted = 0
<if test="tenantId!=null">
and tenant_id = #{tenantId}
if>
and id in
<foreach close=")" collection="ids" item="listItem" open="(" separator=",">
#{listItem}
foreach>
select>