Mybatis 传入String 类型的动态参数如何写?

本文介绍了一个具体的MyBatis查询配置示例,展示了如何使用条件查询来获取指定类型的通信字段信息。通过该示例可以了解到MyBatis中动态SQL的使用方法,包括如何设置参数类型、结果类型及SQL语句中的条件判断。

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

<select id="queryCommunicationFieldByType" resultType="reconnoitreCommunicationField" parameterType="String">

 SELECT * FROM tb_reconnoitre_communication_field WHERE commun_status = 'Y'

      <if test="_parameter !=null and _parameter !=''">
     and commun_file_type =#{type}  
      </if>
      order by  commun_field_name asc
     
  </select> 
<think>我们正在讨论MyBatis中update操作的动态参数法。根据引用内容,我们可以使用<set>标签或者<trim>标签来实现动态更新。 引用[1]提到:使用set标签可以动态更新列,自动添加SET关键字并去掉多余的逗号。 引用[2]展示了<trim>标签的使用,它也可以实现类似的功能,并且更加灵活,可以自定义前缀和要移除的后缀。 引用[3]给出了一个全量修改的示例,但要求所有字段都赋值,且必须指定where条件(如id)以防止全表更新。 引用[4]则提到了批量update的法,但用户当前问题没有提到批量,所以我们先关注单条记录的动态更新。 用户的问题:如何在MyBatis中编更新操作的动态参数? 回答思路: 1. 使用<set>标签:这是MyBatis提供的专门用于update语句动态生成set子句的标签。 2. 使用<trim>标签:通过配置prefix(前缀)和suffixOverrides(后缀覆盖)来实现同样的功能,且更灵活。 下面分别给出两种方式的示例。 注意:在动态SQL中,我们使用<if>标签来判断参数是否为空,非空则包含该字段的更新。 假设我们有一个实体类User,包含id, name, email, phone等属性,我们想根据id更新其他字段(非空的字段才更新)。 方式一:使用<set>标签 ```xml <update id="updateUser" parameterType="User"> UPDATE user <set> <if test="name != null">name = #{name},</if> <if test="email != null">email = #{email},</if> <if test="phone != null">phone = #{phone},</if> </set> WHERE id = #{id} </update> ``` 说明:<set>标签会自动在包含的内容前面加上SET关键字,并且会自动去除最后一个逗号。 方式二:使用<trim>标签 ```xml <update id="updateUser" parameterType="User"> UPDATE user <trim prefix="SET" suffixOverrides=","> <if test="name != null">name = #{name},</if> <if test="email != null">email = #{email},</if> <if test="phone != null">phone = #{phone},</if> </trim> WHERE id = #{id} </update> ``` 说明:<trim>标签的prefix属性表示在内容前添加的前缀(这里为SET),suffixOverrides属性表示去除最后一个逗号。 两种方式效果相同,选择一种即可。 注意事项: 1. 必须指定where条件,否则会更新整张表(引用[3]中强调了where id=#{id}必不可少)。 2. 在动态SQL中,逗号是在每个字段更新语句的末尾,由<set>或<trim>自动处理多余的逗号。 如果用户需要批量更新,则需要使用foreach标签,但本次问题未涉及,所以不展开。 根据引用[2]中的示例,我们也可以看到<trim>和<if>结合使用的效果。 因此,针对用户的问题,我们推荐使用<set>标签或<trim>标签来实现动态更新。 生成相关问题: 1. 在MyBatis中如何防止update语句更新全表? 2. MyBatis的<set>标签和<trim>标签有什么区别? 3. 如何实现MyBatis的批量更新操作?</think>在 MyBatis 中编动态参数的更新操作,主要通过 `<set>` 或 `<trim>` 标签结合 `<if>` 条件判断实现动态 SQL。以下是具体法和说明: ### 一、动态 UPDATE 的两种核心法 #### 1. 使用 `<set>` 标签(推荐) ```xml <update id="updateUser"> UPDATE user <set> <if test="name != null">name = #{name},</if> <if test="email != null">email = #{email},</if> <if test="age != null">age = #{age},</if> </set> WHERE id = #{id} </update> ``` **特点**: - 自动添加 `SET` 关键字 - 自动移除末尾多余的逗号(如最后一个条件为空时) - 类似 `WHERE` 标签的智能处理逻辑[^1] #### 2. 使用 `<trim>` 标签(更灵活) ```xml <update id="updateUser"> UPDATE user <trim prefix="SET" suffixOverrides=","> <if test="name != null">name = #{name},</if> <if test="email != null">email = #{email},</if> <if test="age != null">age = #{age},</if> </trim> WHERE id = #{id} </update> ``` **参数说明**: - `prefix="SET"`:条件成立时添加前缀 `SET` - `suffixOverrides=","`:自动移除末尾多余的逗号[^2] ### 二、关键注意事项 1. **必须指定 WHERE 条件** 避免全表更新风险,如 `WHERE id = #{id}`[^3] 2. **参数判空处理** 用 `<if test="field != null">` 或 `<if test="field != null and field != ''">` 防止空值覆盖 3. **逗号处理** 字段末尾需加逗号,动态 SQL 会自动处理最后一个逗号 4. **接口定义** Mapper 接口方法:`void updateUser(@Param("id") Long id, @Param("name") String name, ...);` ### 三、完整示例 ```xml <!-- 根据传入参数动态更新用户信息 --> <update id="updateUserSelective"> UPDATE user <set> <if test="name != null">name = #{name},</if> <if test="email != null">email = #{email},</if> <if test="age != null">age = #{age},</if> updated_at = NOW() <!-- 固定更新的字段 --> </set> WHERE id = #{id} </update> ``` **执行效果**: - 若只传 `name` 和 `id`:生成 `UPDATE user SET name=?, updated_at=NOW() WHERE id=?` - 若传 `email` 和 `id`:生成 `UPDATE user SET email=?, updated_at=NOW() WHERE id=?` ### 四、应用场景 1. **部分字段更新**:前端仅修改部分字段时 2. **条件更新**:根据业务状态更新不同字段 3. **避免全量更新**:减少不必要的数据库入[^3] > ⚠️ **重要安全提示**:动态 SQL 必须配合严格的 WHERE 条件使用,否则可能导致全表数据被意外更新[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值