mybatisplus⾼效批量更新_Mybatis中实现批量更新的⼏种姿
势,总有⼀款适合你
Mybatis中实现批量更新的⼏种姿势,总有⼀款适合你
⼀、概述
mybatis中实现批量插⼊是很简单的,相⽐⼤家都知道,这⾥就不赘述,本⽂主要讲述如何实现批量更新。
下⾯介绍本⽂要讲的⼏种⽅式主要是在xml中实现,不包含需要改动代码逻辑的⽅法,这⾥,除了⽹上说的普通情况,还有适合mysql和oracle的批量更新⽅式: 1. case when 2. foreach成多条sql 3. ON DUPLICATE KEY UPDATE (mysql) 4. replace into (mysql)
这次,我要讲的就是这四种⽅式。
如果⼤家正在寻⼀个java的学习环境,或者在开发中遇到困难,可以加⼊我们的java学习圈,点击即可加⼊,共同学习,节约学习时间,减少很多在学习中遇到的难题。
⼆、case when
这种⽅式实现的批量更新操作效率很低,⽽且,当更新的字段很多时,SQL语句会特别长。
update t_calendar_extend
when #{item.index} then #{difyTime}
when #{item.index} then #{pe}
index in (
#{item.index}
)
这⾥,根据index值来更新modify_time 和user_type的值,有⼏个字段,就要遍历⼏遍,效率很低。
三、foreach成多条sql
这种⽅式最简单,就是⽤foreach组装成多条update语句,但Mybatis映射⽂件中的sql语句默认是不⽀持以" ; " 结尾的,也就是不⽀持多条sql语句的执⾏。所以需要在连接mysql的url上加 &allowMultiQueries=true 这个才可以执⾏。
update tableName
name=${item.name},
name2=${item.name2}
where id = ${item.id}
四、ON DUPLICATE KEY UPDATE
MYSQL中的ON DUPLICATE KEY UPDATE,是基于主键(PRIMARY KEY)或唯⼀索引(UNIQUE INDEX)使⽤的。
如果已存在该唯⼀标⽰或主键就更新,如果不存在该唯⼀标⽰或主键则作为新⾏插⼊。
insert into t_output_calendar (index,
cal_date, user_type, create_time,
modify_time, delete_flag
)
values
separator=",">
(
#{item.index,jdbcType=INTEGER},
#{item.calDate,jdbcType=TIMESTAMP},
#{pe,jdbcType=TINYINT},
#{ateTime,jdbcType=TIMESTAMP},
#{difyTime,jdbcType=TIMESTAMP},
#{item.deleteFlag,jdbcType=TINYINT}
)
ON DUPLICATE KEY UPDATE modify_time = VALUES(modify_time), user_type = VALUES(user_type);
五、replace into
msql的replace into跟insert into的⽤法完全⼀样,但是它带有更新功能:
如果发现表中已经有此⾏数据(根据主键或者唯⼀索引判断)则先删除此⾏数据,然后插⼊新的数据。否则,直接插⼊新数据。
注意,它是先删除数据,然后再插⼊,这是和ON DUPLICATE KEY UPDATE不同的地⽅,如果当前的数据库⽤户没有删除权限,是不能使⽤replace into的。
⽰例:
replace into t_output_calendar (index, cal_date, user_type, create_time,
modify_time, delete_flag
)
values
separator=",">
(
#{item.index,jdbcType=INTEGER},
#{item.calDate,jdbcType=TIMESTAMP},批量更新sql语句
#{pe,jdbcType=TINYINT},
#{ateTime,jdbcType=TIMESTAMP},
#{difyTime,jdbcType=TIMESTAMP},
#{item.deleteFlag,jdbcType=TINYINT}
)

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。