Spring Data JPA 批量保存数据

本文将介绍怎样使用 Spring Data JPA 实现批量保存实体

情景介绍

我们有一个需求,需要新增、修改用户订单。一个订单拥有多个商品,使用 JPA 保存时需要保存订单信息和订单所属的商品、价格信息。最简单的做法是逐一保存订单、订单所属商品信息,这样就会执行 n+1 次数据库操作。

从功能上说,上面的做法有问题,能够满足我们的需求。如果某一个订单拥有几十个商品,我们就会执行几十次数据库操作,这对数据库是不友好的;在 JPA 中,我们可以通过 saveAll() 方法实现批量保存,一次性保存几十个订单商品信息;这样一个订单就只需要执行两次数据库操作。

saveAll 方法定义

<S extends T> Iterable<S> saveAll(Iterable<S> entities);

上面方法用来保存传递给 saveAll 方法的所有实体,entities 参数是一个实体迭代器,不能为空,迭代器中每一个元素也不能为 null。

saveAll 方法返回保存实体,永远不会返回 null,返回的 Iterable 和传递的 entities 具有相同的大小。

如果给定的 Iterable 实体或 entities 参数其中一个实体是 null,则抛出 IllegalArgumentException 异常。

示例代码

import com.hxstrive.jpa.springboot_jpa.dao.UserDao;
import com.hxstrive.jpa.springboot_jpa.entity.User;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.ArrayList;
import java.util.List;

/**
 * 批量保存
 * @author Administrator 2021/9/22 12:53
 * @version 1.0
 */
@SpringBootTest
public class Demo2 {

    @Autowired
    private UserDao userDao;

    @Test
    public void batch1() {
        List<User> userList = new ArrayList<>();
        userList.add(new User("用户1", 22, 7500.34f));
        userList.add(new User("用户2", 23, 7350.12f));
        userList.add(new User("用户3", 26, 6890.05f));
        userList.add(new User("用户4", 30, 7120.5f));
        // 批量保存用户实体
        Iterable<User> iterable = userDao.saveAll(userList);
        for(User user : iterable) {
            System.out.println(user);
        }
    }

}

上面代码中,一次性保存了4个 User 实体。

一个不注意小事情的人,永远不会成功大事业。——戴尔·卡耐基
1 不喜欢
说说我的看法 -
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
公众号