我如何使用 quarkus 反应式 mysql 客户端和 mutiny api 在 mysql 中插入和获取最后插入的 id
How can I insert and get last inserted id in mysql with transactions using quarkus reactive mysql client with mutiny api
我将如何创建事务、插入行、提交事务并获取最后插入的 ID。所以方法应该return一个Uni<Integer>
。我是 mutiny api 的新手,我以前使用过 vertx.io
链接未来处理程序机制,因此重新调整自己以使用 mutiny api 有点困难。我已经检查了文档并认为类似于以下代码片段的东西应该可以工作,但我对如何使其工作感到困惑,并且 return Uni<Integer>
来自最后一个查询而不是 Uni<Void>
来自tx.commit()
return this.client.begin()
.flatMap(tx -> tx
.preparedQuery("INSERT INTO person (firstname,lastname) VALUES (,)")
.execute(Tuple.of(person.getFirstName(),person.getLastName()))
.onItem().produceUni(id-> tx.query("SELECT LAST_INSERT_ID()"))
.onItem().produceUni(res -> tx.commit())
.onFailure().recoverWithUni(ex-> tx.rollback())
);
试试这个:
return client.begin().onItem().produceUni(tx -> tx
.preparedQuery("INSERT INTO person (firstname,lastname) VALUES (,)").execute(Tuple.of(person.getFirstName(),person.getLastName()))
.onItem().produceUni(id -> tx.query("SELECT LAST_INSERT_ID()").execute())
.onItem().apply(rows -> rows.iterator().next().getInteger(0))
.onItem().produceUni(item -> tx.commit().on().item().produceUni(v -> Uni.createFrom().item(item)))
.on().failure().recoverWithUni(throwable -> {
return tx.rollback().on().failure().recoverWithItem((Void) null)
.on().item().produceUni(v -> Uni.createFrom().failure(throwable));
})
);
SqlClientHelper 将在未来的版本中加入 Quarkus(希望 1.6
)。您将能够简化为:
return SqlClientHelper.inTransactionUni(client, tx -> tx
.preparedQuery("INSERT INTO person (firstname,lastname) VALUES (,)").execute(Tuple.of(person.getFirstName(),person.getLastName()))
.onItem().produceUni(id -> tx.query("SELECT LAST_INSERT_ID()").execute())
.onItem().apply(rows -> rows.iterator().next().getInteger(0))
);
我将如何创建事务、插入行、提交事务并获取最后插入的 ID。所以方法应该return一个Uni<Integer>
。我是 mutiny api 的新手,我以前使用过 vertx.io
链接未来处理程序机制,因此重新调整自己以使用 mutiny api 有点困难。我已经检查了文档并认为类似于以下代码片段的东西应该可以工作,但我对如何使其工作感到困惑,并且 return Uni<Integer>
来自最后一个查询而不是 Uni<Void>
来自tx.commit()
return this.client.begin()
.flatMap(tx -> tx
.preparedQuery("INSERT INTO person (firstname,lastname) VALUES (,)")
.execute(Tuple.of(person.getFirstName(),person.getLastName()))
.onItem().produceUni(id-> tx.query("SELECT LAST_INSERT_ID()"))
.onItem().produceUni(res -> tx.commit())
.onFailure().recoverWithUni(ex-> tx.rollback())
);
试试这个:
return client.begin().onItem().produceUni(tx -> tx
.preparedQuery("INSERT INTO person (firstname,lastname) VALUES (,)").execute(Tuple.of(person.getFirstName(),person.getLastName()))
.onItem().produceUni(id -> tx.query("SELECT LAST_INSERT_ID()").execute())
.onItem().apply(rows -> rows.iterator().next().getInteger(0))
.onItem().produceUni(item -> tx.commit().on().item().produceUni(v -> Uni.createFrom().item(item)))
.on().failure().recoverWithUni(throwable -> {
return tx.rollback().on().failure().recoverWithItem((Void) null)
.on().item().produceUni(v -> Uni.createFrom().failure(throwable));
})
);
SqlClientHelper 将在未来的版本中加入 Quarkus(希望 1.6
)。您将能够简化为:
return SqlClientHelper.inTransactionUni(client, tx -> tx
.preparedQuery("INSERT INTO person (firstname,lastname) VALUES (,)").execute(Tuple.of(person.getFirstName(),person.getLastName()))
.onItem().produceUni(id -> tx.query("SELECT LAST_INSERT_ID()").execute())
.onItem().apply(rows -> rows.iterator().next().getInteger(0))
);