Java 将CRUD vertx之后的数据返回到处理程序中,以便再次使用
她是我的数据库插入方法Java 将CRUD vertx之后的数据返回到处理程序中,以便再次使用,java,handler,vert.x,Java,Handler,Vert.x,她是我的数据库插入方法 public static void addMessage(RoutingContext routingContext) { System.out.println("Add Message"); String message = routingContext.getBodyAsJson().getString("message"); JsonObject params = new JsonObject(); params.put("QUE
public static void addMessage(RoutingContext routingContext) {
System.out.println("Add Message");
String message = routingContext.getBodyAsJson().getString("message");
JsonObject params = new JsonObject();
params.put("QUERY", Queries.DB_INSERT_MESSAGE);
params.put("PARAMS", new JsonArray().add(message));
DB.insert(params, res -> {
if (res.succeeded()) {
ClientCallBack.sendJsonResponce(routingContext, res.result().getJsonArray("rows"));
} else {
ClientCallBack.sendErrorResponce(routingContext, res.cause().getMessage());
}
});
publicstaticvoidinsert(jsonobjectreqparams,Handler){
插入(config.getJsonObject(CONS_config.DATABASE).getString(CONS_config.DEFAULT_DATABASE),reqParams,handler);
}
公共静态void插入(字符串DB_前缀、JsonObject reqParams、处理程序){
if(CONS_CONFIG.ORACLE.equalsIgnoreCase(DB_前缀)){
oracle.updateWithParams(reqParams,handler);
}否则{
updateWithParams(reqParams,handler);
}
}
和updateWithParams
public static void insert (JsonObject reqParams, Handler<AsyncResult<JsonObject>> handler){
insert(config.getJsonObject(CONS_CONFIG.DATABASE).getString(CONS_CONFIG.DEFAULT_DATABASE), reqParams, handler);
}
public static void insert (String DB_PREFIX, JsonObject reqParams, Handler<AsyncResult<JsonObject>> handler){
if(CONS_CONFIG.ORACLE.equalsIgnoreCase(DB_PREFIX)){
oracle.updateWithParams(reqParams, handler);
}else{
mysql.updateWithParams(reqParams, handler);
}
}
public void updateWithParams(JsonObject参数,处理程序resultHandler){
debug(“从参数开始:+paramsQuery.encode());
字符串sql=paramsQuery.getString(“查询”);
JsonArray params=paramsQuery.getJsonArray(“params”);
getConnection(连接->{
if(connection.successed()){
connection.result().updateWithParams(sql、params、query->{
if(query.successed()){
handler.handle(Future.succeededFuture(query.result().toJson());
}否则{
logger.debug(query.cause().getMessage());
resultHandler.handle(Future.failedFuture(Msg.UPDATE_WITH_PARAMS_FAIL));
}
});
}否则{
logger.debug(connection.cause().getMessage());
resultHandler.handle(Future.failedFuture(Msg.CONNECT_TO_DATA_BASE_FAIL));
}
connection.result().close();
});
}
我的问题是,即使数据已在数据库中注册,但处理程序返回空值。有没有办法在每次CRUD操作后返回结果?
my methode addMessage中的res.result().getJsonArray(“行”)返回null。
谢谢正如@Paulo Lopes建议的那样,您应该使用.getKeys()方法:
insert不会返回行,这就是为什么没有数据。如果要获取插入的数据,需要获取生成的密钥(或使用您自己提供的密钥)并在之后选择。@PauloLopes感谢您的回复,但即使是删除或更新。它返回null。你能告诉我如何使用genrated键吗?@PauloLopes我想得到生成的键整数,但我得到的是
{“keys”:[“aaasnlaaaaaaaaaaaaac”],“updated”:1}
。谢谢你的回答,但我的问题是,当我使用r.result().getKeys()时,它会像这样返回字符串[“aaasnlaaaaaaaaaaaaaiac”]因此,我无法使用此方法result.getKeys().getInteger(0)您是否在Oracle上,有可能吗?Oracle会返回您的ROWID。我编辑了我的答案以反映Oracled非常感谢您的帮助@Alexey now iget keys empty{“keys”:[],“Update”:1}我不知道oracle中的问题是否是我使用序列自动递增ID的方式非常感谢@Alexey您的答案非常完美现在我可以拿到我的钥匙了
public void updateWithParams(JsonObject paramsQuery, Handler<AsyncResult<JsonObject>> resultHandler) {
logger.debug("START WITH PARAMS : "+paramsQuery.encode());
String sql = paramsQuery.getString("QUERY");
JsonArray params = paramsQuery.getJsonArray("PARAMS");
getConnection(connection->{
if (connection.succeeded()) {
connection.result().updateWithParams(sql, params, query -> {
if (query.succeeded()) {
resultHandler.handle(Future.succeededFuture(query.result().toJson()));
} else {
logger.debug(query.cause().getMessage());
resultHandler.handle(Future.failedFuture(Msg.UPDATE_WITH_PARAMS_FAIL));
}
});
}else{
logger.debug(connection.cause().getMessage());
resultHandler.handle(Future.failedFuture(Msg.CONNECT_TO_DATA_BASE_FAIL));
}
connection.result().close();
});
}
mySQLClient.getConnection((res)->{
if (res.succeeded()) {
SQLConnection conn = res.result();
JsonArray params = new JsonArray().add(UUID.randomUUID().toString()).add("A").add("abcd");
conn.updateWithParams("insert into user (email, name, password) values (?, ?, ?)", params,
(r) -> {
if (r.succeeded()) {
// Your IDs
JsonArray keys = r.result().getKeys();
// This should work for MySQL
//String q = "select * from user where id in (?)";
// This should work with Oracle, since Oracle returns ROWID (string), not ID (integer)
String q = "select id from user where rowid in (?)";
conn.queryWithParams(q, keys, (result) -> {
// Return it instead of printing
if (result.succeeded()) {
System.out.println(result.result().toJson());
}
});
}
else {
// Handle error
}
});
}
else {
res.cause().printStackTrace();
}
// Deal with errors
});