我如何使用带有Mutiny API的Quarkus反应式mysql客户端在事务中插入并获取mysql中最后插入的id

时间:2020-06-16 10:07:52

标签: reactive quarkus smallrye mutiny

我将如何创建事务,插入行,提交事务以及获取最后插入的ID。因此,该方法应返回Uni<Integer>。我是mutiny api的新手,我以前使用过vertx.io链接将来的处理程序机制,因此要调整自身以使用mutiny api有点困难。我已经检查了文档,认为与以下代码段类似的内容应该可以工作,但是我对如何使其工作并从上次查询返回Uni<Integer>而不是从{{1 }}

Uni<Void>

1 个答案:

答案 0 :(得分:2)

尝试一下:

return client.begin().onItem().produceUni(tx -> tx
    .preparedQuery("INSERT INTO person (firstname,lastname) VALUES ($1,$2)").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 ($1,$2)").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))
);
相关问题