[英]myBatis: how to return pojo with insert?
我有一個簡單的 POJO:
@Data
@NoArgsConstructor
public class User {
private Long id;
private String username;
private String password;
public User(String username, String password) {
this.username = username;
this.password = password;
}
}
我有映射器,保存這個 POJO 並返回 ID。
@Insert("insert into users(username, password) values(#{user.username}, #{user.password})")
@Options(useGeneratedKeys = true, keyProperty = "id")
Long save(@Param("user") User user);
然后,服務通過此 ID 接收實體:
@Override
public User save(User user) {
return Optional.ofNullable(
mapper.findById(
Optional.ofNullable(mapper.save(user))
.orElseThrow(() -> new EntityNotSavedException("Не удалось сохранить: " + user)))
)
.orElseThrow(() -> new EntityNotSavedException("Не удалось сохранить: " + user));
}
在這種情況下,我們有一個插入實體和第二個請求的請求 - 從 id 中選擇它。 成本太高。
插入一個請求后如何返回實體?
您不需要執行選擇。
這是一個常見的誤解,但@Insert
方法返回更新的行數,而不是生成的鍵(這是底層 JDBC API 的工作方式)。
當您指定keyProperty="id"
,生成的密鑰將設置為傳遞的User
參數的id
屬性。
請注意,您還應該指定keyColumn
。
從 3.5.0 版開始需要它。
如果您的服務方法必須返回一個User
,它可能看起來像這樣。
@Override
public User save(User user) {
if (mapper.save(user) != 1) {
// this may not happen.
// an exception will be thrown if insert failed.
}
return user;
}
通常,服務方法只執行 INSERT,調用者繼續使用原始User
實例進行后續操作。
服務方式:
@Override
public void save(User user) {
mapper.save(user);
}
調用服務方法的類看起來像......
User user = new User("John", "xyz");
service.save(user);
model.addAttribute("user", user);
...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.