mybatisPlus自定义批量新增的实现代码

下面我将详细讲解如何实现mybatisPlus自定义批量新增的实现代码,包括两条示例:

自定义批量新增实现代码

mybatisPlus并不支持批量新增操作,所以需要我们手动实现,下面是具体的代码实现:

public interface CustomBatchInsertMapper<T> extends BaseMapper<T> {
    /**
     * 批量新增
     * @param list 实体对象列表
     * @return 影响记录数
     */
    @InsertProvider(type = CustomBatchInsertProvider.class, method = "dynamicSQL")
    int customBatchInsert(List<T> list);
}

其中,CustomBatchInsertMapper是自定义的mapper接口,该接口继承了BaseMapper接口。CustomBatchInsertProvider是自定义的SQL提供者,用于生成SQL语句。在CustomBatchInsertMapper接口中,使用@InsertProvider注解指定CustomBatchInsertProvider作为SQL提供者,并指定customBatchInsert方法调用DynamicSQL方法,最后返回影响记录数。

接下来是具体的CustomBatchInsertProvider类的实现:

public class CustomBatchInsertProvider {
    public <T> String batchInsert(Map<String, Object> map) {
        List<T> list = (List<T>) map.get("list");
        if (CollectionUtils.isEmpty(list)) {
            return null;
        }
        StringBuilder sb = new StringBuilder();
        sb.append("INSERT INTO ");
        sb.append(SqlHelper.getTableName(list.get(0).getClass()));
        sb.append(" (");
        List<Field> fieldList = getAllField(list.get(0).getClass());
        for (Field field : fieldList) {
            sb.append(SqlHelper.getColumnName(field));
            sb.append(",");
        }
        sb.deleteCharAt(sb.length() - 1);
        sb.append(") VALUES ");
        for (T entity : list) {
            sb.append("(");
            for (Field field : fieldList) {
                Object fieldValue = getFieldVal(entity, field);
                if (Objects.isNull(fieldValue)) {
                    sb.append("null,");
                } else {
                    sb.append(SqlHelper.safeParam(fieldValue));
                    sb.append(",");
                }
            }
            sb.deleteCharAt(sb.length() - 1);
            sb.append("),");
        }
        sb.deleteCharAt(sb.length() - 1);
        return sb.toString();
    }

    private List<Field> getAllField(Class<?> clazz) {
        List<Field> fieldList = new ArrayList<>();
        Field[] fields = clazz.getDeclaredFields();
        for (Field field : fields) {
            field.setAccessible(true);
            if (field.isAnnotationPresent(TableField.class) && !field.getAnnotation(TableField.class).exist()) {
                continue;
            }
            fieldList.add(field);
        }
        Class<?> superclass = clazz.getSuperclass();
        if (Objects.nonNull(superclass) && !Object.class.equals(superclass)) {
            fieldList.addAll(getAllField(superclass));
        }
        return fieldList;
    }

    private Object getFieldVal(Object entity, Field field) {
        try {
            return field.get(entity);
        } catch (IllegalAccessException e) {
            throw ExceptionUtils.mpe("Error: Cannot execute getFieldVal method. Cause", e);
        }
    }
}

CustomBatchInsertProvider类中,实现了batchInsert方法,该方法接收一个Map<String, Object>类型的参数,其中包含需要新增的实体对象列表。该方法首先获取对象列表中的第一个对象,并通过MybatisPlus的SqlHelper.getTableName方法获取当前实体对象对应的表名。然后,通过反射获取实体对象的所有属性和属性值,并拼接成SQL语句。最后返回拼接好的SQL语句。

注意:在进行反射获取实体对象属性时,需要判断属性是否有@TableField(exist = false)注解,若有此注解,则跳过该属性,不参与拼接SQL语句。这是因为MybatisPlus会根据@TableField(exist = false)注解的属性名生成SQL语句,如果没有该注解,MybatisPlus会将该属性作为数据库中的一列。

示例

下面是两条使用示例:

示例1

假设我们有一个UserDO实体对象,用于保存用户信息。需要新增10条用户记录到数据库中。此时,我们可以这样实现:

List<UserDO> list = new ArrayList<>();
for(int i = 0; i < 10; i++) {
    UserDO userDO = new UserDO();
    userDO.setName("张三" + i);
    userDO.setAge(20 + i);
    userDO.setSex(SexEnum.MALE);
    userDO.setPassword("123456");
    userDO.setMobile("13888888888");
    list.add(userDO);
}
CustomBatchInsertMapper<UserDO> customBatchInsertMapper = sqlSession.getMapper(CustomBatchInsertMapper.class);
int rows = customBatchInsertMapper.customBatchInsert(list);

在上述代码中,我们首先创建了10个UserDO对象,并设置相关属性。然后,获取自定义的mapper接口CustomBatchInsertMapper的实例,调用customBatchInsert方法,传入实体对象列表,最后返回新增记录数。

示例2

假设我们有一个OrderDO实体对象,用于保存订单信息。需要新增100条订单记录到数据库中。此时,我们可以这样实现:

List<OrderDO> list = new ArrayList<>();
for(int i = 0; i < 100; i++) {
    OrderDO orderDO = new OrderDO();
    orderDO.setUserId(i % 10 + 1L);
    orderDO.setGoodsName("商品" + i);
    orderDO.setTotalPrice(i * 100L);
    list.add(orderDO);
}
CustomBatchInsertMapper<OrderDO> customBatchInsertMapper = sqlSession.getMapper(CustomBatchInsertMapper.class);
int rows = customBatchInsertMapper.customBatchInsert(list);

在上述代码中,我们同样创建了100个OrderDO对象,并设置相关属性。然后,获取自定义的mapper接口CustomBatchInsertMapper的实例,调用customBatchInsert方法,传入实体对象列表,最后返回新增记录数。

以上就是完整的mybatisPlus自定义批量新增的实现代码攻略,希望能够对您有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:mybatisPlus自定义批量新增的实现代码 - Python技术站

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

相关文章

  • Spring Security的过滤器链机制

    Spring Security 是 Spring 提供的一个重要的安全框架,可以方便地实现安全认证和授权等功能。其中最核心的特性是 Spring Security 的过滤器链机制。 什么是过滤器链 Spring Security 的过滤器链机制是指将一组过滤器串联起来,对指定的请求进行逐个过滤处理,以完成功能的实现和安全保障。 Spring Security…

    Java 2023年5月20日
    00
  • 分享7款开源Java反编译工具

    这里是分享7款开源Java反编译工具的攻略。 1. 简介 反编译是指将已编译的二进制文件转换为可读懂的源代码文件的过程,而Java反编译工具就是用来对Java类文件进行反编译。开源的Java反编译工具越来越多,本文将介绍七款比较知名的Java反编译工具。 2. JD-GUI JD-GUI是一个免费的开源反编译工具,能够将.class文件反编译为Java源代码…

    Java 2023年5月19日
    00
  • 简易的投票系统以及js刷票思路和方法

    简易的投票系统 本文将介绍如何搭建一个简易的投票系统,并且针对该投票系统介绍js刷票思路和方法。 投票系统原理 投票系统的原理非常简单,只需要记录每个用户对每个选手的投票数即可。在展示投票结果时,对每个选手的投票数进行累加,从而得出该选手的总得票数,从高到低排序就可以得出投票结果。 实现步骤 定义数据库表 创建一个votes表,表结构如下: 字段名 类型 说…

    Java 2023年6月15日
    00
  • Mybatis源码分析之插件模块

    “Mybatis源码分析之插件模块”是一篇深入剖析Mybatis插件模块的文章。总的来说,Mybatis插件模块的实现流程可以概括为下面四个核心类别:Interceptor、InterceptorChain、Plugin和Invocation。 Interceptor接口:插件必须实现的接口,提供了intercept()方法以便拦截Mybatis的方法调用。…

    Java 2023年6月1日
    00
  • 微信小程序 获取二维码实例详解

    微信小程序获取二维码实例详解 1. 背景 在微信小程序中,我们可以通过获取小程序的二维码来实现页面分享、推广等功能。本文将详细讲解如何在小程序中获取二维码。 2. 实现步骤 2.1 准备工作 在开发小程序前,需要先申请小程序的 AppID。授权方式可以是开发者账号授权或是公众平台授权。 2.2 获取二维码 在小程序接口中,提供了一个 wx.createQRC…

    Java 2023年5月23日
    00
  • HTTP协议详解_动力节点Java学院整理

    HTTP协议详解_动力节点Java学院整理 一、HTTP协议的基础知识 1.1 HTTP协议的定义 HTTP(Hypertext Transfer Protocol)是一种用于传输超媒体文档(例如HTML)的应用层协议。它是Web的基础协议,也是一种请求-响应协议,常用于客户端和服务器之间的通讯。 1.2 HTTP请求的基本格式 HTTP请求由三个部分组成,…

    Java 2023年6月15日
    00
  • java自带命令行工具jmap、jhat与jinfo的使用实例代码详解

    Java自带命令行工具攻略 Java自带了多个命令行工具,可以对Java程序进行分析、调试和监控。其中,jmap、jhat和jinfo是非常重要的工具。本攻略将详细讲解它们的使用,包括实例代码和示例结果。 jmap jmap是Java Memory Map的缩写,是一个用于打印Java进程中内存使用情况的命令行工具。下面是jmap的常用选项: Usage: …

    Java 2023年5月19日
    00
  • Java 分位点(分位值)计算方式

    当需要将一组数据进行分布分析时,可以通过计算分位点(quantile),常用的分位点有中位数、上四分位数、下四分位数等。在Java中,可以使用Apache Commons Math库来计算分位点,本文将介绍Java分位点计算方式的完整攻略。 引入依赖 要使用Apache Commons Math库,需要在pom.xml文件中添加以下依赖: <depen…

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