myBatis:如何使用insert返回pojo?

时间:2019-12-24 11:52:15

标签: java mybatis

我有一个简单的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中选择它。费用太多。

在一个请求中插入后如何返回实体?

1 个答案:

答案 0 :(得分:2)

您不需要执行选择。
这是一个常见的误解,但是@Insert方法返回更新的行数,而不是生成的键(这是基础JDBC API的工作方式)。
如您指定的keyProperty="id",所生成的密钥设置为传递的id参数的User属性。

请注意,您还应该指定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);
}

调用service方法的类看起来像...

User user = new User("John", "xyz");
service.save(user);
model.addAttribute("user", user);
...