我有一个简单的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中选择它。费用太多。
在一个请求中插入后如何返回实体?
答案 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);
...