# 数据操作

在JPA中，保存数据时必须携带实体关系，但是DTO中往往缺少实体关系。因此，在保存数据之前必须先查询数据，然后根据DTO中的数据进行增量的更新。

{% code title="FooService.java" %}

```java
package com.example.demo.service;

import com.example.demo.*;
import com.taocares.commons.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Optional;

@Service
public class FooService {

    @Autowired
    private FooRepository fooRepository;
    
    public Optional<FooDto> findById(Long fooId) {
        Optional<Foo> foo = fooRepository.findById(fooId);
        if (foo.isPresent()) {
            return Optional.of(BeanUtils.copyProperties(foo.get(), FooDto.class));
        } else {
            return Optional.empty();
        }
    }
    
    public void save(FooDto fooDto) {
        if (fooDto.getId() != null) { // 修改
            Foo foo = fooRepository.getOne(fooDto.getId());
            BeanUtils.copyProperties(fooDto, foo);
            fooRepository.save(foo);
        } else { // 新增
            Foo foo = BeanUtils.copyProperties(fooDto, Foo.class);
            fooRepository.save(foo);
        }
    }
}
```

{% endcode %}

{% hint style="info" %}
`JpaRepository`提供了两种查询单条数据的方法：

* `findById`：返回`Optional`对象，推荐在查询方法中使用。
* `getOne`：返回实体，懒加载的模式，如果数据不存在会直接抛出`EntityNotFoundException`，推荐在数据修改时使用。
  {% endhint %}
