当前位置: 首页 > 网络应用技术

在Mybatis中插入数据的3种方法!

时间:2023-03-06 11:26:54 网络应用技术

  批处理插入功能是我们日常工作中最常见的业务功能之一。我还写了一篇有关“ Mybatis Plus批处理数据插入功能,Yyds!”的文章,但文章的反馈不是很好,有两个主要问题:首先,许多人对Mybatis的批处理插入功能有误解加上(以下简称MP)。因此,绩效没有得到改善;其次,实际上有用于本地批处理的坑,但很少有人知道。

  因此,基于上述情况,Lege决定再次提出Mybatis批处理插入的摘要,同时进行性能测试和对三个实现的相应原理分析。

  让我们简要地谈论三批插入::

  在开始之前,让我们创建一个数据库和测试数据。执行SQL脚本如下:

  数据库的最终效果如下:

  接下来,我们将使用Spring Boot项目批量插入10W数据,以测试每种方法的执行时间。

  周期单插入(测试)的核心代码如下:

  如下图所示,运行上述过程花了88574毫秒:

  MP批处理插入函数中有三个核心实现类:USERCONTROLLER(CONTRORTER),USERSERVIEMPL(业务逻辑实现类),USERMAPPER(数据库映射类),其呼叫过程如下:如下:

  请注意,此方法需要首先添加到MP框架中,打开pom.xml文件以添加以下内容:

  注意:mybatis-plus-latest-version代表MP框架的最新版本编号。记住将上述“ mybatis-plus-latest-tatest-version”替换为特定版本号,例如3.4.3,以正常介绍该框架。

  要引入更多MP框架,请移动其官方网站:https://baomidou.com/guide/

  实现上述代码后,我们可以使用MP来实现数据批次插入功能,但是除了本文中的特定实现代码外,我们还需要知道每个方法的执行效率。

  上述过程的执行总计为6088毫秒,如下图所示:

  从上面的结果来看,我们可以看到使用MP的批处理插入函数(插入数据10W bar),与循环单插入的性能相比,其性能提高了14.5倍。

  从国会议员和周期的执行时间开始,我们可以看到,正如一些朋友认为的那样,在周期中,使用MP并未作为周期执行,以便更清楚地解释此问题,我们检查了MP的源代码。

  MP的核心实现代码是SaveBatch方法。该方法的源代码如下:

  我们继续跟进SaveBatch的重载方法:

  从上面的源代码可以看出,MP分为N要执行的N部件,每零件1,000,每个部分将每1,000件分批执行,因此其性能远高于单个循环单曲的性能插入。

  那么,为什么要分批实现它,而不是一个时间执行?不用担心,我们知道何时查看第三个实现方法。

  本机批处理插入方法依赖于Mybatis中的foreach标签来将数据缝合到本机插入语句中,而核心实现代码如下。

  将SaveBatchBynative方法添加到UserServiceImpl以实现代码如下:

  将SaveBatchBynative方法添加到Usermapper中,以实现代码如下:

  创建usermapper.xml文件,使用foreach tag缝制sql,特定的实现代码如下:

  在上述步骤之后,几乎实现了我们的本机批处理插入功能。接下来,我们使用单元测试来检查此方法的执行效率。

  但是,当我们运行程序时,会发生以下情况:

  NANI?该程序的执行已报告了错误。

  从上述错误信息可以看出,当我们使用本机方法将10W数据插入SQL执行中时,SQL剪接SQL太大(4.56m),无法使程序执行错误(size)4M,所以该程序报告错误。

  这是本机批处理插入方法的缺点,以及为什么需要分批执行MP,以防止数据库执行的程序,因为它触发了数据库的最大执行SQL。

  当然,解决方案还可以通过设置MySQL的最大执行SQL来解决错误报告问题。设置命令如下:

  如下所示:

  注意:以上命令需要在连接到MySQL的客户端中执行。

  但是,上述解决方案仍无法治愈,因为我们无法预测该程序中最大的SQL的大小,因此最通用的方法是分配实现批处理插入的方法(即MP工具)。

  当我们将MySQL的最大执行设置为10m时,运行上述单元的测试代码,并且执行结果如下:

  在本文中,我们介绍了MyBatis批处理插入的三种方法。其中,周期的数量是最低,最不可或缺的。触发数据库的最大SQL大小执行),因此,在上述情况下,您可以考虑使用MP的批处理插入函数。

  请注意公共帐户“ Java中国社区”,以获取更多Mybatis和Spring Boot系列文章。