文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

[精] Mybatis批量操作(含MySQL、Oracle)示例和获取影响行数介绍

2023-10-23 15:01

关注

手打不易,如果转摘,请注明出处!

注明原文:https://zhangxiaofan.blog.csdn.net/article/details/117933877


目录

前言

Mybatis 执行器

 表结构定义

Mybatis批量新增

批量新增——Mysql写法

批量新增——Oracle写法

Mybatis批量删除

批量删除——MySQL写法、Oracle写法一样

Mybatis批量更新

批量更新——MySQL写法

批量更新——Oracle写法

总结


前言

本文将以示例的方式,介绍Mybatsi批量操作增删改,以及如何获取影响行数,涉及到MySQL和Oracle两种不同的写法。

Mybatis 执行器

Mybatis 执行器三种模式介绍

default-executor-type:simple(默认):     SimpleExecutor, 单个 sqlsession 内, 每次操作,都开启一个 Statement 对象,用完立刻关闭 Statement 对象batch:     BatchExecutor, 单个 sqlsession 内,每次操作复用已有 Statement 对象, addBatch()汇总,然后统一执行executeBatch()    因此 Mybatis 官方写明它无法返回行数(BATCH executor is in use, the update counts are being lost.)reuse:     ReuseExecutor, 应用实例内, 全局共享 Statement对象(Map), 存在则复用

 表结构定义

CREATE TABLE `student`(    `id`   int(11) NOT NULL AUTO_INCREMENT,    `name` varchar(255) DEFAULT NULL,    `age`  int(11)      DEFAULT NULL,    PRIMARY KEY (`id`))ENGINE = InnoDB AUTO_INCREMENT = 1 DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci;

Mybatis批量新增

一般批量insert有4种写法
1.循环插入,每次插入一条,用的不多,这里不介绍

注意:如果是一次提交多个insert/update语句,MySQL的连接串需要加上allowMultiQueries=true,表示开启批处理,可以执行批量SQL。就是多个分号;的SQL

BEGIN-END写法,这个是单次多条insert语句,用的不多,这里不介绍
3.foreach写法,这个是单次单条insert语句(常用)
4.JDBC原生写法,这个效率最高,不属于mybatis写法,这里不介绍

Mapper接口定义:

int insertListBatch(@Param("studentList") List studentList);

批量新增——Mysql写法

单次单条insert语句,foreach-batch写法

            insert into student(        id,        name,        age        ) values                    (            #{item.id,jdbcType=INTEGER},            #{item.name,jdbcType=VARCHAR},            #{item.age,jdbcType=INTEGER}            )            

获取返回影响行数,只需要用下面这种执行器模式,直接获取返回值,该值就是影响行数。Oracle也是一样。

default-executor-type: simple
        int i = studentService.insertListBatch(studentList);        logger.info("Mybatis SQL return :" + i);

批量新增——Oracle写法

单次单条insert语句,foreach-batch写法

            insert into STUDENT(        ID,        NAME,        AGE        )                    (            select            #{item.id},            #{item.name,jdbcType=VARCHAR},            #{item.age,jdbcType=DECIMAL}            from dual            )            

Oracle与MySQL批量插入的区别就是Oracle需要用到 union all 和 dual 关键字,看下Oracle批量插入的SQL示例就知道了:

INSERT INTO TEST.STUDENT (ID,NAME,AGE)(SELECT 7,'change',18 FROM dual)UNION ALL(SELECT 5,'change',18 FROM dual)

上面说到,Mybatis批量插入有几种写法,那么这些写法有什么区别?效率怎么样?可以参考这篇文章:4亿数据批量操作插入,为什么不用Mybatis,而是选择原生JDBC?(文中有各类批量操作效率对比和总结)https://zhangxiaofan.blog.csdn.net/article/details/121351546


Mybatis批量删除

Mapper接口定义

int deleteByIdList(@Param("list") List list);

批量删除——MySQL写法、Oracle写法一样

            delete from student        where id IN                    #{item}            

 返回影响行数,跟批量插入一样,用simple(默认)执行器即可,直接获取返回值。

Mybatis批量更新

Mapper接口定义

int updateListByIdBatch(@Param("studentList") List studentList);

批量更新——MySQL写法

            update student                                                                                when id=#{item.id} then #{item.age,jdbcType=INTEGER}                                                                                                                        when id=#{item.id,jdbcType=INTEGER} then #{item.name,jdbcType=VARCHAR}                                                                where id in                    #{item.id,jdbcType=INTEGER}            

返回影响行数,跟批量插入一样,用simple(默认)执行器即可,直接获取返回值。 

批量更新——Oracle写法

        update STUDENT                                                                                when ID=#{item.id} then #{item.age,jdbcType=DECIMAL}                                                when ID=#{item.id,jdbcType=DECIMAL} then age                                                                                                                                                when ID=#{item.id,jdbcType=DECIMAL} then #{item.name,jdbcType=VARCHAR}                                                when ID=#{item.id,jdbcType=DECIMAL} then name                                                                                        where ID in                    #{item.id,jdbcType=DECIMAL}            

Oracle与MySQL批量更新的写法主要区别在,Oracle需要用 choose-when-otherwise 来解决部分输入字段为null的问题。感兴趣的朋友可以参考这篇文章:

Oralce Mybaits批量更新的正确写法——解决传入字段为nullhttps://zhangxiaofan.blog.csdn.net/article/details/120179181?spm=1001.2014.3001.5502返回影响行数,跟批量插入一样,用simple(默认)执行器即可,直接获取返回值。

where如果有多个条件,可以写成类似这样的:

        where (ID,ID2) in                    (#{item.id,jdbcType=DECIMAL},#{item.id2,jdbcType=DECIMAL})        

总结

上述Mybatis的批量操作都是一条SQL操作完成的,也是项目中常用到的写法。当一次操作的数据量很大的时候,这种写法效率会大大降低(可能都不如循环一条一条的执行)。因此实际项目过程中批量操作,如果数据较大,就要分批次处理,一次传一部分,具体传多少跟表字段大小和SQL条数相关。

来源地址:https://blog.csdn.net/q258523454/article/details/117933877

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-数据库
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯