好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

Spring JPA之save方法示例详解

一、save(单条添加)

源码

?

1

2

3

4

5

6

7

8

9

10

11

@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呢?继续往下看:

?

1

2

3

4

5

6

7

8

9

10

/**

  * 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层中添加)

?

1

2

3

4

@Transactional

public User save(User user) {

     return userDao.save(user);

}

control层

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

/**

  * 单条数据保存

  * @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);

}

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

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

二、saveAll(批量添加)

源码

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

/*

  * (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层中添加)

?

1

2

3

4

@Transactional

public <S extends User> List<S> saveAll(Iterable<S> entities) {

     return userDao.saveAll(entities);

}

control层

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

/**

  * 批量保存数据

  * @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);

}

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

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

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

原文链接:https://juejin.cn/post/7221037881184616507

查看更多关于Spring JPA之save方法示例详解的详细内容...

  阅读:17次