Spring JPA之save方法示例详解

 更新时间:2023年04月27日 14:50:50   作者:烟雨戏江南  
这篇文章主要为大家介绍了Spring JPA之save方法示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

一、save(单条添加)

源码

@Transactional
@Override
public <S extends T> S save(S entity) {
   Assert.notNull(entity, "Entity must not be null.");
   if (entityInformation.isNew(entity)) {
      em.persist(entity);
      return entity;
   } else {
      return em.merge(entity);
   }
}

由代码可知,它是先去判断了entity是否为new:

如果是new,就执行save方法;

如果非new,则执行update方法。这就是jpa为啥只有save接口没有update接口的原因吧!

此时我们应该有个疑惑:怎么样才算new呢?继续往下看:

/**
 * Must be {@link Transient} in order to ensure that no JPA provider complains because of a missing setter.
 *
 * @see org.springframework.data.domain.Persistable#isNew()
 */
@Transient // DATAJPA-622
@Override
public boolean isNew() {
   return null == getId();
}

恍然大悟,原来他是去看 entity 的id(实体类的主键)是否存在:不存在就是new。(通俗易懂,很好理解)

service 层

添加 save 方法(save 是三方件自带接口不需要再dao层中添加)

@Transactional
public User save(User user) {
    return userDao.save(user);
}

control层

/**
 * 单条数据保存
 * @param id 自增的,可以不填
 * @param name
 * @param age
 * @return
 */
@GetMapping("/save")
public User save(Integer id,String name, Integer age){
	User user = new User();
	user.setId(id);
	user.setName(name);
	user.setAge(age);
	return userService.save(user);
}

浏览器测试OKhttp://localhost:7777/save?id=1&name=lili&age=18

测试id存在的情况OKhttp://localhost:7777/save?id=1&name=毛毛&age=20

二、saveAll(批量添加)

源码

/*
 * (non-Javadoc)
 * @see org.springframework.data.jpa.repository.JpaRepository#save(java.lang.Iterable)
 */
@Transactional
@Override
public <S extends T> List<S> saveAll(Iterable<S> entities) {
   Assert.notNull(entities, "Entities must not be null!");
   List<S> result = new ArrayList<>();
   for (S entity : entities) {
      result.add(save(entity));
   }
   return result;
}

一目了然,saveAll其实就是传入entity的集合,然后遍历进行save操作

service

添加 saveAll 方法(saveAll 是三方件自带接口不需要再dao层中添加)

@Transactional
public <S extends User> List<S> saveAll(Iterable<S> entities) {
	return userDao.saveAll(entities);
}

control层

/**
 * 批量保存数据
 * @param ids 
 * @param names
 * @param ages
 * @return
 */
@GetMapping("/saveAll")
public List<User> saveAll(int[] ids,String[] names,Integer[] ages){
    List<User> list = new ArrayList<>();
    for(int i=0; i<names.length; i++){
        User user = new User();
        user.setId(ids[i]);
        user.setName(names[i]);
        user.setAge(ages[i]);
        list.add(user);
    }
    return userService.saveAll(list);
}

浏览器测试OKhttp://localhost:7777/saveAll?ids=2,3&names=丁丁,壮壮&ages=13,14

注: 如果在实体类中的id上添加注解@GeneratedValue(strategy = GenerationType.IDENTITY),可以给id增加自增属性,这样我们就无需再传入id了

以上就是Spring JPA之save方法示例详解的详细内容,更多关于Spring JPA save方法详解的资料请关注脚本之家其它相关文章!

相关文章

  • SpringBoot详细讲解断言机制原理

    SpringBoot详细讲解断言机制原理

    断言Assertion是测试方法中的核心部分,用来对测试需要满足的条件进行验证。这些断言方法都是org.junit.jupiter.api.Assertions的静态方法。检查业务逻辑返回的数据是否合理。所有的测试运行结束以后,会有一个详细的测试报告
    2022-06-06
  • Java Swing编写一个简单的计算器软件

    Java Swing编写一个简单的计算器软件

    大家好,本篇文章主要讲的是Java Swing编写一个简单的计算器软件,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览
    2021-12-12
  • JVM加载一个类的过程

    JVM加载一个类的过程

    本文主要介绍了JVM加载一个类的过程。具有很好的参考价值,下面跟着小编一起来看下吧
    2017-02-02
  • IDEA创建SpringBoot的maven项目的方法步骤

    IDEA创建SpringBoot的maven项目的方法步骤

    这篇文章主要介绍了IDEA创建SpringBoot的maven项目的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • IDEA启动报错Internal error. Please refer to https://jb.gg/ide/critical-startup-errors解决办法

    IDEA启动报错Internal error. Please refer to https://jb.gg/i

    这篇文章主要介绍了IDEA启动报错Internal error. Please refer to https://jb.gg/ide/critical-startup-errors解决办法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-04-04
  • SpringBoot整合jasypt实现重要数据加密

    SpringBoot整合jasypt实现重要数据加密

    Jasypt是一个专注于简化Java加密操作的开源工具,这篇文章主要为大家介绍了详细介绍了如何使用jasypt实现重要数据加密,感兴趣的小伙伴可以了解下
    2025-03-03
  • 微信跳一跳辅助Java代码实现

    微信跳一跳辅助Java代码实现

    这篇文章主要为大家详细介绍了微信跳一跳辅助的Java代码实现资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-01-01
  • java实现单词小游戏

    java实现单词小游戏

    这篇文章主要为大家详细介绍了java实现单词小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-02-02
  • logback EvaluatorFilter日志过滤器源码解读

    logback EvaluatorFilter日志过滤器源码解读

    这篇文章主要为大家介绍了logback EvaluatorFilter日志过滤器源码解读,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-11-11
  • idea向System.getenv()添加系统环境变量的操作

    idea向System.getenv()添加系统环境变量的操作

    这篇文章主要介绍了idea向System.getenv()添加系统环境变量的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06

最新评论