簡體   English   中英

myBatis:如何通過插入返回 pojo?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM