我正在处理带有Json数据的Post请求,如何将它们添加到数据库中,以便进行检查以找出数据库中是否已经存在该用户,如果没有,则创建一个新用户行(如果有),则为该用户更新消息。
我在请求中接受的内容:电话,短信
我不太了解如何实现。
UserController
@RestController
@RequestMapping("/users")
public class UserController {
@Autowired
private UserRepo userRepo;
@PostMapping(consumes = {MediaType.APPLICATION_XML_VALUE, MediaType.APPLICATION_JSON_VALUE})
public String createUser(@Valid @RequestBody User requestUserDetails) {
userRepo.save(requestUserDetails);
return "The message delivered.";
}
}
用户
@Entity
@Table(name = "ApiTable", schema = "TestApi")
public class User {
@Id
@GeneratedValue(strategy= GenerationType.AUTO)
private Integer id;
private String phone;
private String message;
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getMessage() {
return message;
}
public void setLastName(String message) {
this.message = message;
}
}
UserRepo
public interface UserRepo extends CrudRepository<User, Long> {
}
应用
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
KeyUser
public class KeyUser implements Serializable {
private String phone;
private String message;
}
应用
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
答案 0 :(得分:1)
好吧,userRepo.save(requestUserDetails)
已经为您做到了。
请查看Spring中save
类中SimpleJpaRepository<T, ID>
方法的实现。
SimpleJpaRepository.java
@Transactional
public <S extends T> S save(S entity) {
if (entityInformation.isNew(entity)) {
em.persist(entity);
return entity;
} else {
return em.merge(entity);
}
}
org.springframework.data.jpa.repository.support.SimpleJpaRepository<T, ID>
实现了JpaRepository<T, ID>
继承的CrudRepository<T, ID>
。
这已经检查对象在数据库中是否已经存在。您只需要提供填充了主键的实体即可。
如果未填充主键,则Spring无法检查对象是否存在。因此,将创建一个新行。
如果该对象已经存在,它将调用EntityManager.merge
,否则将调用EntityManager.persist
。
看看:
User use = new User();
user.setId(1);
user.setPhone("123");
user.setMessage("Hello");
userRepository.save(user);
在这种情况下,如果数据库中存在User
和id == 1
,则其信息将被合并。
现在,如果由于某种原因这不适合您,那么您将必须手动执行此操作,方法是通过ID来搜索用户,然后对其应用一些规则。
类似这样的东西:
@RestController
@RequestMapping("/users")
public class UserController {
@Autowired
private UserRepo userRepo;
@PostMapping(consumes = {MediaType.APPLICATION_XML_VALUE, MediaType.APPLICATION_JSON_VALUE})
public String createUser(@Valid @RequestBody User requestUserDetails) {
User user = requestUserDetails;
if(requestUserDetails.getId() != null) {
Optional<User> userOpt = userRepo.findById(requestUserDetails.getId());
if (userOpt.isPresent()) {
user = userOpt.get();
// the user exists... do something..
}
}
// at the end, save the user anyway (event if it exists or not)
userRepo.save(user);
return "The message delivered.";
}
}
答案 1 :(得分:0)
要更新对象,可以使用merge
方法。如果对象具有id属性,请使用merge,否则保存。