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>
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
相关文章
Jackson将json string转为Object,org.json读取json数组的实例
下面小编就为大家带来一篇Jackson将json string转为Object,org.json读取json数组的实例,具有很好的参考价值,希望对大家有所帮助2017-12-12
SpringBoot+Dubbo+Zookeeper实现简单分布式开发的应用详解
这篇文章主要介绍了SpringBoot+Dubbo+Zookeeper实现简单分布式开发的应用详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧2021-01-01
Spring Boot中集成各种日志框架Logback、Log4j2和Java Util
这篇文章主要介绍了Spring Boot中集成各种日志框架Logback、Log4j2和Java Util Logging,通过实例代码介绍了集成Logback、Log4j2和Java Util Logging的基本步骤,你可以根据自己的需求进行配置和扩展,以满足更复杂的日志需求,需要的朋友可以参考下2023-11-11


最新评论