mybatis update更新字段的使用操作

 更新时间:2021年01月22日 16:31:38   作者:chushiyunen  
这篇文章主要介绍了mybatis update更新字段的使用操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

多个mapper方法,更新单字段

说实话不太推荐,因为如果有10个字段要更新,难道写10个方法。

但是实际中很多人都这么写。

通用mapper方法,java代码控制字段

特点是一个mapper方法包含所有字段,不为空的就update。

但是需要控制入参,一般有2中方式:

new 一个对象然后set id和要改的字段

如果字段多比较费劲,需要一个一个set。

查询出对象,然后set要改的字段

这2种方式差不多,就是代码看起来不一样。

特别注意,定位字段不要加if

要更新的字段加if没有什么问题

但是定位条件不要加if,因为万一忘记传递了,变成没有where条件,那么条数不可控了。搞不好把全表更新了,可就万劫不复了。

补充:mybatis执行批量更新update

目前想批量更新,如果update的值是相同的话,很简单,

update table set column='...' where id in (1,2,3)l

这样的sql就可以了。Mybatis中这样写就行

<update id="batchUpdateStudentWithMap" parameterType="java.util.Map" >
 UPDATE STUDENT SET name = #{name} WHERE id IN
 <foreach collection="idList" index="index" item="item" open="(" separator="," close=")">
  #{item}
 </foreach>
</update>

但是这样的需求很少,一般是有个集合,每个元素中的值是不一样的,然后需要一次性更新。一般的处理方式是使用for循环。这样的效率较低,当数据量大时,期望有种一次性插入的操作。如果使用的是mysql,有

insert into table (aa,bb,cc) values(xx,xx,xx),(oo,oo,oo) on duplicate key update

replace into table (aa,bb,cc) values(xxx,xxx,xxx),(ooo,ooo,ooo),(ccc,ccc,ccc) 

两种方式可以处理。

当前数据库是oracle,可以使用case when来拼成一长串sql处理

UPDATE mytable
 SET myfield = CASE id
  WHEN 1 THEN 'value'
  WHEN 2 THEN 'value'
  WHEN 3 THEN 'value'
 END
WHERE id IN (1,2,3)

实际上这种方式对于mysql也有效。

最开始的时候,想着写一系列并列的更新语句就可以了

<update id="updateBatch" parameterType="java.util.List">
<foreach collection="list" item="item" index="index" separator=";"
 open="" close="">
 update REGION_CODE set
 CODE=#{item.Code,jdbcType=VARCHAR},
 NAME=#{item.Name,jdbcType=VARCHAR}
 where ID = #{item.id,jdbcType=DECIMAL}
</foreach>
</update>

这样直接报错,因为Mybatis映射文件中的sql语句不允许 ; 符号。

两种方法:

第一种:需要在db链接url后面带一个参数 &allowMultiQueries=true

即:

jdbc:mysql://localhost:3306/mysqlTest?characterEncoding=utf-8&allowMultiQueries=true

第二种:按照可行的case when处理方式,Mybatis映射文件书写方式如下:

<update id="updateBatch" parameterType="java.util.List">
 update REGION_CODE set
 CODE=
 <foreach collection="list" item="item" index="index" separator=" " open="case ID" close="end">
  when #{item.id,jdbcType=DECIMAL} then #{item.Code,jdbcType=VARCHAR}
 </foreach>
 ,NAME=
 <foreach collection="list" item="item" index="index" separator=" " open="case ID" close="end">
  when #{item.id,jdbcType=DECIMAL} then #{item.Name,jdbcType=VARCHAR}
 </foreach>
 where ID in
 <foreach collection="list" index="index" item="item" separator="," open="(" close=")">
  #{item.id,jdbcType=DECIMAL}
 </foreach>
</update>

至此,批量更新功能完成。

项目中实际使用案例:

<update id="updateForBatch" parameterType="java.util.List"> 
  update user_credit_black_list set 
  type= 
  <foreach collection="list" item="item" index="index" separator=" " open="case ID" close="end"> 
  when #{item.id,jdbcType=BIGINT} then #{item.type,jdbcType=VARCHAR} 
  </foreach> 
  ,user_id= 
  <foreach collection="list" item="item" index="index" separator=" " open="case ID" close="end"> 
  when #{item.id,jdbcType=BIGINT} then #{item.userId,jdbcType=BIGINT} 
  </foreach> 
  ,update_time= 
  <foreach collection="list" item="item" index="index" separator=" " open="case ID" close="end"> 
  when #{item.id,jdbcType=BIGINT} then #{item.updateTime,jdbcType=TIMESTAMP} 
  </foreach> 
  ,delete_flg= 
  <foreach collection="list" item="item" index="index" separator=" " open="case ID" close="end"> 
  when #{item.id,jdbcType=BIGINT} then #{item.deleteFlg,jdbcType=BIT} 
  </foreach> 
  ,update_code= 
  <foreach collection="list" item="item" index="index" separator=" " open="case ID" close="end"> 
  when #{item.id,jdbcType=BIGINT} then #{item.updateCode,jdbcType=BIGINT} 
  </foreach> 
  where ID in 
  <foreach collection="list" index="index" item="item" separator="," open="(" close=")"> 
  #{item.id,jdbcType=BIGINT} 
  </foreach> 
 </update> 

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。如有错误或未考虑完全的地方,望不吝赐教。

相关文章

  • Java中的相除(/)和取余(%)的实现方法

    Java中的相除(/)和取余(%)的实现方法

    这篇文章主要介绍了Java中的相除(/)和取余(%)的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-07-07
  • 详解Spring Cloud Zuul重试机制探秘

    详解Spring Cloud Zuul重试机制探秘

    本篇文章主要介绍了详解Spring Cloud Zuul重试机制探秘,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-11-11
  • java获取昨天日期字符串的方法

    java获取昨天日期字符串的方法

    这篇文章主要介绍了java获取昨天日期字符串的方法,涉及java针对日期与时间的运算与转换等相关操作技巧,需要的朋友可以参考下
    2016-08-08
  • Java中Pattern.compile函数的使用详解

    Java中Pattern.compile函数的使用详解

    这篇文章主要介绍了Java中Pattern.compile函数的使用详解,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • java中应用Stack进行算术运算的操作

    java中应用Stack进行算术运算的操作

    这篇文章主要介绍了java中应用Stack进行算术运算的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-03-03
  • IO流概述分类字节流写数据三种方式及问题分析

    IO流概述分类字节流写数据三种方式及问题分析

    这篇文章主要为大家介绍了IO流概述分类字节流写数据三种方式及写数据问题分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12
  • Springboot整合minio实现文件服务的教程详解

    Springboot整合minio实现文件服务的教程详解

    这篇文章主要介绍了Springboot整合minio实现文件服务的教程,文中的示例代码讲解详细,对我们的工作或学习有一定帮助,需要的可以参考一下
    2022-06-06
  • java基于UDP实现图片群发功能

    java基于UDP实现图片群发功能

    这篇文章主要为大家详细介绍了java基于UDP实现图片群发功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-01-01
  • SpringBoot2零基础到精通之映射与常用注解请求处理

    SpringBoot2零基础到精通之映射与常用注解请求处理

    SpringBoot是一种整合Spring技术栈的方式(或者说是框架),同时也是简化Spring的一种快速开发的脚手架,本篇让我们一起学习映射、常用注解和方法参数的小技巧
    2022-03-03
  • Go Java算法之交错字符串示例详解

    Go Java算法之交错字符串示例详解

    这篇文章主要为大家介绍了Go Java算法之交错字符串示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08

最新评论