关于实体类中多层嵌套集合,用mybatis的collection标签可以快速实现

本文介绍了如何在实体类中处理多层嵌套集合的映射问题,通过MyBatis的collection标签,避免了循环赋值的方式,提高了效率。XML配置展示了collection的使用,强调了字段名与resultMap的对应关系,使得在MVC层可以直接调用接口,简化了赋值操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一,首先分析需求在有三个实体类的情况下,好比user类,Student,YearClass类,结构如下

//最外层类
public class user {
    private String name;
    private String age;

    private List<Student> students;
}

//中间层类
public class Student {

    private String school;

    private String addr;

    private List<YearClass> yearClasses;
}
//最内层类
public class YearClass {
    private String classNo;

    private int stuNum;

}



 由于本人工作经验不多,之前碰到这种情况,我都是用循环逐个赋值,但是这次由于对效率有效求,所以就舍弃之前的循环赋值的方法,就用了mybatis中collection标签进行嵌套赋值,这个方法真的写起来非常简便,比我之前那种笨方法好太多了。

二. XML层大概如下所示


    <resultMap id="BaseResultMap" type="com.java.model.User">
        <result column="NAME" property="name" jdbcType="VARCHAR"/>
        <result column="AGE" property="age" jdbcType="VARCHAR"/>
        <collection property="students" javaType="List"
### MyBatis 中 `foreach` 标签嵌套 `if` 的使用 在 MyBatis 中,`foreach` 和 `if` 是两个常用的动态 SQL 标签。虽然官方文档并未明确说明两者可以嵌套使用,但在实际开发中可以通过特定的方式实现这种需求。 当需要在 `foreach` 循环内部加入条件判断时,可以在 XML 映射文件中通过 `<if>` 标签来控制逻辑[^1]。具体来说,`<if>` 可以用来筛选符合条件的数据项,而这些数据会被传递给 `<foreach>` 进行迭代处理。 #### 实现方式 以下是具体的实现方法: 1. **参数准备** 确保传入的参数是一个集合或者数组形式的对象,并且该对象中的每一项都具有可被条件判断的属性。 2. **XML 配置** 在 Mapper 文件中配置如下结构: ```xml <select id="selectItems" parameterType="map" resultType="Item"> SELECT * FROM items WHERE item_id IN <foreach collection="itemList" open="(" separator="," close=")"> <if test="_open == false">)</if> <if test="item.enabled == true">${item.id}</if> </foreach> </select> ``` 上述代码片段展示了如何在一个 `foreach` 循环中嵌套 `if` 条件语句。其中 `_open == false` 表达式的目的是为了防止多余的括号闭合操作[^3]。 3. **注意事项** - 如果未指定 `collection` 属性,则默认会尝试解析根节点下的列表。 - 当前版本可能不完全支持复杂的多层嵌套逻辑,因此建议尽量简化业务场景并测试兼容性[^2]。 4. **补充功能扩展** 对于更复杂的需求,还可以结合其他标签如 `trim`, `choose` 等进一步优化查询语句生成效果。例如,在某些情况下可以用 `set` 或者 `where` 替代部分冗余语法。 --- ### 示例代码展示 下面提供了一个完整的例子,演示了如何在批量更新操作中应用此技术: 假设有一个实体类 `User` ,其字段包括 `id`, `name`, 和 `status` 。我们希望只针对状态为激活 (`active`) 的用户执行更新动作。 ```sql -- 数据库表 structure (users) CREATE TABLE users ( id INT PRIMARY KEY, name VARCHAR(50), status ENUM('inactive', 'active') ); ``` 对应的 Java Bean 定义如下: ```java public class User { private Integer id; private String name; private Boolean active; // Getters and Setters... } ``` Mapper 方法签名定义: ```java void updateUserStatus(@Param("list") List<User> userList); ``` SQL Mapping 文件内容: ```xml <update id="updateUserStatus"> UPDATE users u SET u.status = CASE <foreach collection="list" index="index" item="user" separator=""> <if test="user.active != null AND user.active == true"> WHEN #{user.id} THEN 'active' </if> </foreach> ELSE u.status END WHERE u.id IN <foreach collection="list" open="(" separator="," close=")" item="user"> <if test="user.id != null">#{user.id}</if> </foreach> </update> ``` 以上示例实现了基于输入列表内的每个用户的活动标志位来进行有条件的状态切换的功能。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值