gpt4 book ai didi

java - myBatis:如何通过插入返回pojo?

转载 作者:行者123 更新时间:2023-12-01 19:32:00 25 4
gpt4 key购买 nike

我有一个简单的 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" 时,生成的 key 将设置为传递的 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);
...

关于java - myBatis:如何通过插入返回pojo?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59468427/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com