Mybatis mapper文件中处理集合List类型数据

本文介绍使用MyBatis进行批量数据更新和插入的方法,包括通过foreach元素处理多个ID的更新操作,以及如何一次性插入多条记录到数据库中。探讨了参数映射和集合的使用,适用于需要高效数据库操作的场景。

1 .

    <update id="updateStatus" parameterMap="SystemUserNotice">
        UPDATE
        <include refid="table" />
        SET
        `status` = #{status},`edit_time`=#{editTime}
        WHERE
        `id`
        IN
        (
        <foreach collection="idList" item="item" index="index" separator=",">
            #{item}
        </foreach>
        )
    </update>

 

2.

public class UserMessage{
   
    private Long id;

    private MessageModeEnum mode;

    private UserMessageTypeEnum sendType;

    private String title;

    private String content;

    private List<Long> userIds;

    private String iconUrl;

    private String args;

    private LocalDateTime createTime;

    private LocalDateTime readTime;
  <insert id="userMessage" parameterMap="UserMessage">
    INSERT INTO
      <include refid="table" />
      (`mode`,`send_type`,`title`,`content`,`user_id`,`icon_url`,`args`,`create_time`)
    VALUES
   <foreach collection="userIds" item="userId" index="index" separator =",">
      (#{mode},#{sendType},#{title}, #{content}, #{userId}, #{iconUrl}, #{args},#{createTime})
      </foreach >
    </insert>

3.

    <insert id="createList" parameterType="java.util.List">
        INSERT INTO
        <include refid="table" />
        (`xxxx_id`, `xxx_id`)
        VALUES
        <foreach collection="list" item="o" index="index" separator =",">
            (#{o.xxxx_id}, #{o.xxx_id})
        </foreach >
    </insert>

 

<think>嗯,用户想了解MyBatis Mapper处理多种参数类型的方法。我之前已经回答过类似的问题,但需要结合用户提供的引用内容来整理答案。首先,用户提到的引用[1]、[2]、[3]都涉及不同的传参方式,比如@Param注解、Map、JavaBean等。需要把这些方法系统地分类,并说明每种方式的优缺点。 首先,顺序传参法,用户可能知道这是最简单的方式,但引用[1]提到参数顺序调整会导致问题,所以需要强调不建议使用。然后是@Param注解,这是推荐的方式,能明确参数名,避免顺序问题。接下来是Map传参,引用[2]指出虽然灵活但结构不清晰,适合临时参数。JavaBean方式,引用[3]说明需要定义POJO,结构清晰但需要创建类。集合类型处理,引用[2]提到传递Collection时要用@Param指定名称,并用foreach处理。最后是混合传参,结合多种方式。 需要注意每种方法的适用场景和最佳实践,比如优先使用@Param和JavaBean,避免顺序传参。同时,用户可能关心如何选择合适的方法,或者遇到参数类型复杂时的处理策略。此外,要确保示例代码正确,比如XML中的参数引用方式,比如#{param1}、#{name}等。还要检查是否有遗漏的方法,比如直接使用Map的情况,或者动态SQL中的参数处理。 可能用户在实际开发中遇到参数传递错误的问题,比如参数名不对应或者顺序错误,所以需要强调命名的重要性。另外,JavaBean方式虽然结构清晰,但需要创建额外的类,可能对简单参数来说有点繁琐。需要权衡不同方法的利弊,给出建议。最后,生成的相关问题要覆盖常见疑问,比如最佳实践、动态SQL处理、错误排查等。</think>### MyBatis Mapper 多参数类型处理方法详解 在 MyBatis处理多参数类型时,主要通过以下 6 种方式实现参数传递和映射,每种方式都有其适用场景和注意事项: #### 1. **顺序传参法(基础但高风险)** ```xml <select id="selectUser" resultType="User"> SELECT * FROM users WHERE name = #{param1} AND age = #{param2} </select> ``` - **特点**:通过`param1, param2,...paramN`引用参数 - **缺点**:强依赖参数顺序(引用[1]指出顺序错误会导致灾难性后果) - **建议**:仅用于简单场景,**不推荐正式使用** #### 2. **@Param 注解命名法(推荐方式)** ```java User selectUser(@Param("userName") String name, @Param("userAge") int age); ``` ```xml <select id="selectUser" resultType="User"> SELECT * FROM users WHERE name = #{userName} AND age = #{userAge} </select> ``` - **优势**:明确参数语义,消除顺序依赖(引用[1]推荐方式) - **原理**:MyBatis 会将参数包装为 Map 结构 - **最佳实践**:2-4 个参数时优先使用 #### 3. **Map 集合传参(灵活但结构松散)** ```java Map<String, Object> params = new HashMap<>(); params.put("name", "张三"); params.put("age", 25); userMapper.selectByMap(params); ``` ```xml <select id="selectByMap" resultType="User"> SELECT * FROM users WHERE name = #{name} AND age = #{age} </select> ``` - **特点**:键值对形式传递,参数名自定义 - **缺点**:类型不安全,结构不直观(引用[2]指出不如 JavaBean 清晰) - **适用场景**:临时参数或动态字段查询 #### 4. **JavaBean 对象传参(结构化最佳实践)** ```java public class UserQuery { private String name; private Integer age; // getter/setter } ``` ```xml <select id="selectByBean" resultType="User"> SELECT * FROM users WHERE name = #{name} AND age = #{age} </select> ``` - **优势**:强类型检查,结构清晰(引用[3]演示的 POJO 方式) - **建议**:复杂查询或复用参数时首选 - **扩展**:支持嵌套对象属性访问(如`#{address.city}`) #### 5. **集合类型处理(批量操作场景)** ```java List<User> batchSelect(@Param("ids") List<Integer> idList); ``` ```xml <select id="batchSelect" resultType="User"> SELECT * FROM users WHERE id IN <foreach collection="ids" item="id" open="(" separator="," close=")"> #{id} </foreach> </select> ``` - **关键点**:必须使用`@Param`指定集合名称(引用[2]提到的 Collection 处理) - **动态 SQL**:配合`<foreach>`标签实现批量操作 #### 6. **混合参数模式(复杂场景组合)** ```java User complexQuery(@Param("filter") UserQuery filter, @Param("orderBy") String orderField); ``` ```xml <select id="complexQuery" resultType="User"> SELECT * FROM users WHERE name = #{filter.name} ORDER BY ${orderBy} </select> ``` - **优势**:结合对象与简单参数 - **注意**:`$`符号需防止 SQL 注入(仅用于可信字段名) ### 参数处理原理 MyBatis 通过`ParamNameResolver`类处理参数映射: 1. 无`@Param`注解时,使用`param1,param2,...`自动编号 2. 有注解时生成带指定名称的参数 Map 3. 单一参数且未声明注解时直接使用原始对象 ### 最佳实践建议 1. **2个以下参数**:优先使用`@Param`注解 2. **3个以上参数**:推荐封装为 JavaBean(引用[3]的 POJO 方式) 3. **动态字段查询**:可考虑 Map 传参(引用[2]的灵活方案) 4. **批量操作**:必须使用`@Param`+集合类型 5. **避免使用**:原始顺序传参(引用[1]强调的高风险)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值