mybatis in foreach 双层嵌套问题

 更新时间:2023年03月15日 15:03:52   作者:回首掏88  
这篇文章主要介绍了mybatis in foreach 双层嵌套问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

mybatis in foreach 双层嵌套

需求:根据角色id,返回角色名称,

入参是List<List> 类型的二维数组,需要返回一个对应的集合,集合的元素是逗号分隔的字符串。

dao层代码:

List<String> queryRoleName(List<List<Long>> list);

mapper代码:

<select id="queryRoleName" parameterType="java.util.List" resultType="string">
        <foreach collection="list" item="item" separator="union all">
            select ifnull(group_concat(role_name),'') roleName from sys_role where role_id in
            <if test="item!=null and item.size()>0">
                /*就像java for循环嵌套一样,外层的item的属性值和内层的collection属性值需要保持一致*/
                <foreach collection="item" item="roleId" separator="," open="(" close=")">
                    #{roleId}
                </foreach>
            </if>
            <if test="item==null">
                (null)
            </if>
        </foreach>
</select>

说明:

1、因为这里业务需求,可能出现传参角色id为null的情况,所以加了if动态标签判断item元素是否为空,并对返回结果的null值,用mysql的ifnull,对null转了空字符串处理

2、逗号分隔分组函数 group_concat()

效果:

入参:

{{null},{1,2},…}

sql解析:

select ifnull(GROUP_CONCAT(role_name),'') roleName from sys_role where role_id in(null)
union all select ifnull(GROUP_CONCAT(role_name),'') roleName from sys_role where role_id in(1,2)
union all ......

查询结果:

mybatis foreach标签进行嵌套插入

场景说明

现有一插入操作,要求按照指定格式进行插入操作。具体格式如下:

上面各对象中对应的表字段:

处理过程

第一层实体类:

public class StudioCourseAddUpdateDto implements Serializable {
    private static final long serialVersionUID = 4862281856286977081L;

    private int studioId;

    private List<CourseInfoDto> courseInfoDtoList;

   // 省略get/set
}

第二层实体类:

public class CourseInfoDto implements Serializable {

    private static final long serialVersionUID = -2975706030949793781L;

    private int courseType;

    private List<CourseDetailInfoDto> courseDetailInfoDtoList;

	// 省略get/set
}

第三层实体类:

public class CourseDetailInfoDto implements Serializable {
    private static final long serialVersionUID = -1423166674509217993L;

    private int courseId;

    private String feeCount;

    // 省略get/set
}

mapper接口:

int bathAddStudioCourseInfo(@Param("studioCourseAddUpdateDtoList") List<courseAddUpdateDto> courseAddUpdateDtoList);

配置文件:

<insert id="bathAddStudioCourseInfo" parameterType="com.it.tao.CourseAddUpdateDto">
    <foreach collection="courseAddUpdateDtoList" item="courseAddUpdateDto" >
        <foreach collection="courseAddUpdateDto.courseInfoDtoList" item="courseInfoDto"  >
            <foreach collection="courseInfoDto.courseDetailInfoDtoList" item="courseDetailInfoDto" >
                INSERT INTO card_course (course_id,studio_id,course_type,fee_count) VALUES
                (#{courseDetailInfoDto.courseId},#{courseAddUpdateDto.studioId},#{courseInfoDto.courseType},#{courseDetailInfoDto.feeCount});
            </foreach>
        </foreach>
   </foreach>
</insert>

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

最新评论