mybatisplus添加真正的批量新增、批量更新的实现

下面我给您详细讲解一下“mybatisplus添加真正的批量新增、批量更新的实现”的完整攻略。

理解MyBatis-Plus

MyBatis-Plus是基于MyBatis的快速开发框架,提供一系列的增强功能,能够更加方便、快捷地开发数据库相关操作。其中,其批量操作功能得到了广泛的关注和应用。本文详细介绍了MyBatis-Plus批量新增、批量更新的实现方式。

MyBatis-Plus批量新增

MyBatis-Plus的批量新增操作需要使用MyBatis的批量操作接口Executor,通过该接口实现真正的批量插入。其实现流程主要如下:

  1. 获取MyBatis的SqlSession对象。
SqlSession sqlSession = SqlHelper.sqlSession();
  1. 通过SqlSession获取对应的Executor对象。
Executor batchExecutor = sqlSession.getConfiguration().newExecutor(TransactionIsolationLevel.SQL_REPEATABLE_READ, true);
  1. 通过batchExecutor执行批量插入操作。需要注意的是,批量插入的时候,需要将SQL语句的占位符设置成(?, ?, ...)
List<T> list = new ArrayList<>();
// 添加数据到list中
String sql = "INSERT INTO table_name (col1, col2, ...) VALUES (?, ?, ...)";
PreparedStatement statement = null;
try {
    int batchSize = 1000; // 每批次插入的数量
    int index = 0;
    statement = batchExecutor.getTransaction().getConnection().prepareStatement(sql);
    for (T entity : list) {
        // 填充数据到占位符中
        statement.setObject(1, entity.getCol1());
        statement.setObject(2, entity.getCol2());
        // ...
        statement.addBatch();
        index++;
        if (index % batchSize == 0 || index == list.size()) {
            statement.executeBatch();
            statement.clearBatch();
        }
    }
    batchExecutor.getTransaction().commit();
} catch (SQLException e) {
    batchExecutor.getTransaction().rollback();
    throw new RuntimeException(e);
} finally {
    if (statement != null) {
        statement.close();
    }
}

MyBatis-Plus批量更新

MyBatis-Plus的批量更新操作与批量新增操作类似,同样需要使用MyBatis的批量操作接口Executor,通过该接口实现真正的批量更新。其实现流程主要如下:

  1. 获取MyBatis的SqlSession对象。
SqlSession sqlSession = SqlHelper.sqlSession();
  1. 通过SqlSession获取对应的Executor对象。
Executor batchExecutor = sqlSession.getConfiguration().newExecutor(TransactionIsolationLevel.SQL_REPEATABLE_READ, true);
  1. 通过batchExecutor执行批量更新操作。需要注意的是,批量更新的时候,需要将SQL语句的占位符设置成(?, ?, ...)
List<T> list = new ArrayList<>();
// 添加数据到list中
String sql = "UPDATE table_name SET col1 = ?, col2 = ?, ... WHERE id = ?";
PreparedStatement statement = null;
try {
    int batchSize = 1000; // 每批次更新的数量
    int index = 0;
    statement = batchExecutor.getTransaction().getConnection().prepareStatement(sql);
    for (T entity : list) {
        // 填充数据到占位符中
        statement.setObject(1, entity.getCol1());
        statement.setObject(2, entity.getCol2());
        // ...
        statement.setObject(n + 1, entity.getId());
        statement.addBatch();
        index++;
        if (index % batchSize == 0 || index == list.size()) {
            statement.executeBatch();
            statement.clearBatch();
        }
    }
    batchExecutor.getTransaction().commit();
} catch (SQLException e) {
    batchExecutor.getTransaction().rollback();
    throw new RuntimeException(e);
} finally {
    if (statement != null) {
        statement.close();
    }
}

示例

以下是两个示例,分别展示了MyBatis-Plus的批量新增和批量更新。

示例1:批量新增

public void batchInsert(List<User> userList) {
    // 获取SqlSession对象
    SqlSession sqlSession = this.getSqlSession();
    // 获取Executor对象
    Executor batchExecutor = sqlSession.getConfiguration().newExecutor(TransactionIsolationLevel.SQL_REPEATABLE_READ, true);
    // 执行批量插入操作
    String sql = "INSERT INTO t_user (id, name, age) VALUES (?, ?, ?)";
    PreparedStatement statement = null;
    try {
        int batchSize = 1000; // 每批次插入的数量
        int index = 0;
        statement = batchExecutor.getTransaction().getConnection().prepareStatement(sql);
        for (User user : userList) {
            statement.setLong(1, user.getId());
            statement.setString(2, user.getName());
            statement.setInt(3, user.getAge());
            statement.addBatch();
            index++;
            if (index % batchSize == 0 || index == userList.size()) {
                statement.executeBatch();
                statement.clearBatch();
            }
        }
        batchExecutor.getTransaction().commit();
    } catch (SQLException e) {
        batchExecutor.getTransaction().rollback();
        throw new RuntimeException(e);
    } finally {
        if (statement != null) {
            try {
                statement.close();
            } catch (SQLException e) {
                throw new RuntimeException(e);
            }
        }
    }
}

示例2:批量更新

public void batchUpdate(List<User> userList) {
    // 获取SqlSession对象
    SqlSession sqlSession = this.getSqlSession();
    // 获取Executor对象
    Executor batchExecutor = sqlSession.getConfiguration().newExecutor(TransactionIsolationLevel.SQL_REPEATABLE_READ, true);
    // 执行批量更新操作
    String sql = "UPDATE t_user SET name = ?, age = ? WHERE id = ?";
    PreparedStatement statement = null;
    try {
        int batchSize = 1000; // 每批次更新的数量
        int index = 0;
        statement = batchExecutor.getTransaction().getConnection().prepareStatement(sql);
        for (User user : userList) {
            statement.setString(1, user.getName());
            statement.setInt(2, user.getAge());
            statement.setLong(3, user.getId());
            statement.addBatch();
            index++;
            if (index % batchSize == 0 || index == userList.size()) {
                statement.executeBatch();
                statement.clearBatch();
            }
        }
        batchExecutor.getTransaction().commit();
    } catch (SQLException e) {
        batchExecutor.getTransaction().rollback();
        throw new RuntimeException(e);
    } finally {
        if (statement != null) {
            try {
                statement.close();
            } catch (SQLException e) {
                throw new RuntimeException(e);
            }
        }
    }
}

希望以上内容对您有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:mybatisplus添加真正的批量新增、批量更新的实现 - Python技术站

(0)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • 黑客如何利用文件包含漏洞进行网站入侵

    黑客通过利用文件包含漏洞,可以轻松地将自己的代码注入到网站服务器中,从而实现对网站的入侵。下面是黑客会使用的一些攻击方法和技术: 使用文件包含漏洞的攻击方法 抓取页面源代码 黑客可以访问页面的URL,并使用一些指定的参数来获取页面的源代码。一旦黑客获取了页面的源代码,就可以查看其中是否存在文件包含漏洞。 判断漏洞类型 黑客可以通过分析页面源代码,判断该漏洞是…

    Java 2023年6月15日
    00
  • 如何实现 Java SpringBoot 自动验证入参数据的有效性

    Java SpringBoot 通过javax.validation.constraints下的注解,实现入参数据自动验证如果碰到 @NotEmpty 否则不生效,注意看下 @RequestBody 前面是否加上了@Valid Validation常用注解汇总 Constraint 详细信息 @Null 被注释的元素必须为 null @NotNull 被注释…

    Java 2023年4月18日
    00
  • Kotlin编程基础语法编码规范

    Kotlin编程基础语法编码规范 1. 常见命名规范 在Kotlin语言中,标识符的命名规范如下: 包名使用小写字母: 包名应该全部使用小写字母,且不应该使用下划线或者其它特殊字符。 类名使用驼峰命名: 类名的首字母应该大写,驼峰命名,不使用下划线。 方法名使用小驼峰命名: 方法名的首字母应该小写,而后面的单词首字母应该大写。 常量名使用全大写字母: 常量名…

    Java 2023年6月1日
    00
  • 用java代码帮朋友P图

    下面是“用java代码帮朋友P图”的完整攻略: 准备工作 首先,我们需要安装并配置好Java开发环境。建议使用JDK1.8及以上版本,可以到Oracle官网下载并安装。安装完成后,需配置Java环境变量,具体可参考官方文档或搜索教程进行配置。 图像处理库 Java提供了许多用于图像处理的库,常用的有Java2D和JavaFX等。这里我们选择Java2D,它提…

    Java 2023年5月23日
    00
  • 使用maven自定义插件开发

    让我来为您详细讲解“使用maven自定义插件开发”的完整攻略。 1. 简介 Maven是一个Java项目管理工具,它可以帮助我们更方便地管理项目依赖、构建等工作。Maven的自定义插件可以帮助我们更好地满足自己的需求,提高项目的开发效率。本文主要介绍如何使用Maven自定义插件开发,并提供两个基本案例演示。 2. 开发步骤 自定义Maven插件的开发步骤包括…

    Java 2023年5月20日
    00
  • 详解Java合并数组的两种实现方式

    详解Java合并数组的两种实现方式 在Java中,合并数组是一个常见的操作,本文将介绍Java中合并数组的两种实现方式。 一、使用System.arraycopy()方法 Java中提供了System.arraycopy()方法来实现数组的复制和合并。以下是合并数组的示例代码: public static int[] mergeArrays(int[] ar…

    Java 2023年5月26日
    00
  • java启动参数之谜的排查过程

    以下是Java启动参数排查过程的攻略。 总览 Java应用程序的启动参数是决定应用程序行为的一些选项。这些参数可以设置Java虚拟机的行为,也可以设置应用程序的行为。当应用程序行为和预期不符时,启动参数可能就成为排查问题的关键。 下面是解决Java启动参数排查问题的一些步骤。 第一步:查看启动参数 查看启动参数是排查Java启动参数问题的第一步。可以使用以下…

    Java 2023年5月20日
    00
  • springboot+jsonp解决前端跨域问题小结

    下面是“springboot+jsonp解决前端跨域问题小结”的详细攻略。 前言 在开发前后端分离的应用时,常常会遇到前端请求后端时跨域的问题。这个时候,可以采用jsonp方式来解决跨域问题。 引入依赖 在我们使用springboot+jsonp的时候,需要引入一下两个依赖: <dependency> <groupId>org.spr…

    Java 2023年5月26日
    00
合作推广
合作推广
分享本页
返回顶部