Mybatis中的update动态SQL语句

Mybatis中的CRUD操作(增删改查)中,简单的SQL操作比较直观,如查找操作:

<select id="findBySrcId" resultMap="entityRelationResultMap">
  SELECT * FROM ENTITY_RELATION WHERE SRC_ID=#{srcId}
</select>

其中id对应同名java文件中的方法,resultMap对应的自定义的数据类型(当使用java自带类型就更容易了,比如java.lang.String之类的)。

但是涉及到更新操作时,可能不需要对所有字段更新,这时不需要更新的字段需要保持原字段信息,当使用以下信息就会报错:

<update id="updateOne"  parameterType="com.inspur.search.data.EntityRelation">
 update ENTITY_RELATION SET SRC_ID=#{srcId},SRC_TYPE=#{srcType},DEST_ID=#{destId},
        DEST_TYPE=#{destType},REL_TYPE=#{relType},STATUS=#{status},SN_ID=#{snId}
 where id=#{id}
</update>

因为不更新的字段,会被传递null到SQL中,引起异常。

这时就需要进行动态SQL拼接,如下,使用trim就是为了删掉最后字段的“,”。
主要不用单独写SET了,因为set被包含在trim中了:

<update id="updateOne"  parameterType="com.inspur.search.data.EntityRelation">
 UPDATE ENTITY_RELATION
 <trim prefix="set" suffixOverrides=",">
  <if test="srcId!=null">SRC_ID=#{srcId},</if>
  <if test="srcType!=null">SRC_TYPE=#{srcType},</if>
  <if test="destId!=null">DEST_ID=#{destId},</if>
  <if test="destType!=null">DEST_TYPE=#{destType},</if>
  <if test="relType!=null">REL_TYPE=#{relType},</if>
  <if test="status!=null">STATUS=#{status},</if>
  <if test="snId!=null">SN_ID=#{snId},</if>
 </trim>
 WHERE id=#{id}
</update>

备注:

主要是解决:涉及到更新操作时,可能不需要对所有字段更新,这时不需要更新的字段需要保持原字段信息。(因为不更新的字段,会被传递null到SQL中,引起异常。)



  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: Mybatisupdate语句可以使用动态sql来实现灵活的更新操作。动态sql可以根据不同的条件来生成不同的sql语句,从而实现灵活的更新操作。常用的动态sql标签包括if、choose、when、otherwise、set等。其,if标签可以根据条件判断是否需要更新某个字段,choose标签可以根据多个条件选择不同的更新方式,set标签可以设置需要更新的字段和值。使用动态sql可以大大提高Mybatis的灵活性和可维护性。 ### 回答2: MyBatis是一个优秀的ORM(对象关系映射)框架,在使用MyBatis进行CRUD操作时,我们往往需要使用到update语句动态sql来进行数据的修改操作。MyBatis使用update标签来定义update语句,并支持使用动态SQL语法进行动态处理。下面我将结合实例来具体介绍MyBatis动态SQL的update语句使用方法。 (1)无条件更新语句 当我们需要更新一张表的所有记录时,可以使用下面的update语句: ``` <update id="updateAllUsers" parameterType="Map"> update user set status=#{status} </update> ``` 上面的update语句,我们使用了update标签来定义update语句,id属性定义了这个update语句的名称,parameterType属性指定了传递给update语句的参数类型。在update语句,我们使用了set子句来指定要更新的列和对应的新值。 (2)根据条件更新语句 如果我们需要根据条件进行更新,比如根据id来更新一条记录,可以使用下面的update语句: ``` <update id="updateUserById" parameterType="Map"> update user set status=#{status} where id=#{id} </update> ``` 上面的update语句,我们使用了where子句来指定更新的条件,其#{id}是从Map类型的参数获取的。 (3)多条件更新语句 如果我们需要根据多个条件进行更新,可以使用下面的update语句: ``` <update id="updateUsersByParams" parameterType="Map"> update user set status=#{status} where name=#{name} and age > #{age} </update> ``` 上面的update语句,我们使用了and关键字来组合多个条件,其#{name}和#{age}是从Map类型的参数获取的。 (4)动态更新语句 MyBatis支持使用动态SQL语法来动态构建update语句,具体做法是在update标签使用if和where动态标签。下面是一个使用动态SQL语法的update语句实例: ``` <update id="updateUser" parameterType="User"> update user <set> <if test="name != null">name=#{name},</if> <if test="age != null">age=#{age},</if> <if test="status != null">status=#{status},</if> </set> <where> <if test="id != null">id=#{id}</if> </where> </update> ``` 上面的update语句,我们使用了set子句的if标签来对要更新的列进行判断和拼接,使用where子句的if标签来对更新的条件进行判断和拼接。这样就实现了动态构建update语句的功能。 总之,MyBatisupdate语句动态SQL功能为我们提供了更加灵活、方便的数据更新操作方式,使我们能够更加高效地完成应用开发工作。 ### 回答3: MyBatis是一种开源的Java持久层框架,它可以通过使用XML或注解将SQL操作与Java代码分离,并且提供了灵活的动态SQL语句。在MyBatis,更新操作的动态SQL语句可以通过使用update标签来实现。 update标签是MyBatis用于执行更新操作的标签,它可以包含各种动态SQL节点,例如if,choose,foreach等。update标签可以使用parameterType属性指定传入参数的Java类型,使用statementType属性指定执行语句的类型。下面是一个简单的update标签示例: ``` <update id="updateUser"> update user set username=#{username}, password=#{password} where id=#{id} </update> ``` 在上面的update标签,id属性表示更新操作的唯一标识符,update user set...where语句表示要执行的SQL语句。#{...}是MyBatis的占位符,会根据传入的参数进行替换。 如果要在update语句使用动态条件,可以使用if节点。if节点的test属性用于指定条件表达式,条件成立时才会执行节点SQL语句。下面是一个包含if节点的update标签示例: ``` <update id="updateUser"> update user <set> <if test="username != null">username = #{username},</if> <if test="password != null">password = #{password},</if> </set> where id=#{id} </update> ``` 在上面的示例,使用了set标签来指定要更新的字段。如果用户名不为空字符串,则会添加username=#{username}到更新语句,如果密码不为空字符串,则会添加password=#{password}到更新语句。 除了if节点之外,MyBatis还提供了其他类型的动态SQL节点,例如choose,when,otherwise和foreach。这些节点可以方便地实现根据不同条件生成不同的更新语句。 总之,MyBatis动态SQL语句非常灵活,能够根据不同的条件生成不同的SQL语句,使得开发者能够更容易地编写出高效、灵活的数据访问代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值