有没有这样处理的功能? mysql 在顶点 java
is there any function to process like this? mysql on vertx java
如你所见,
如果已有电子邮件,请不要添加用户
如果没有现有电子邮件,请添加用户。
一个 API 处理一切,所以我试图将 API 分成两个 API,用户 API 和数据库 API。
如果我使用 json 发送查询,比如
"query" :
["SELECT * FROM USER WHERE email='" + email + "'",
"INSERT INTO USER VALUES('" + email + "', '" + name + "', '" + password + "')"]
和数据库 API 应该同时处理这些查询。
如果 SELECT
有结果,请执行 INSERT
如果没有,请不要 INSERT
vertx有解决办法吗?
提前致谢。
connection.query("SELECT * FROM USER WHERE email='" + email + "'", rs -> {
if(!rs.result().getResults().isEmpty()) {
handler.handle(Future.failedFuture("email already exists"));
} else {
connection.execute("INSERT INTO USER VALUES('" + email + "', '" + name + "', '" + password + "')", ins -> {
if (ins.failed()) {
throw new RuntimeException(ins.cause());
}
// and close the connection
connection.close(done -> {
if (done.failed()) {
throw new RuntimeException(done.cause());
}
});
});
handler.handle(Future.succeededFuture(new JsonObject().put("result", "succeed")));
}
});
首先,我希望您实际上并没有向 API 发送查询,而是希望您使用准备好的语句来防止 SQL 注入。
其次,您可以在没有太多 Vert.x 干预的情况下解决您的问题,方法是向电子邮件列添加唯一键,然后捕获异常。
在您的数据库中:
alter table USER add unique (email)
在您的申请中:
JsonArray params = new JsonArray().add("a@a.com").add("A").add("abcd");
conn.updateWithParams("insert into user (email, name, password) values (?, ?, ?)", params,
(r) -> {
if (r.succeeded()) {
System.out.println("Ok!");
}
else {
if (r.cause() instanceof MySQLException) {
MySQLException cause = (MySQLException) r.cause();
// 1062 is MySQL Duplicate Key
if (cause.errorMessage().errorCode() == 1062) {
// Duplicate key, ignore
}
}
}
// Handle connection closing
});
如你所见,
如果已有电子邮件,请不要添加用户 如果没有现有电子邮件,请添加用户。
一个 API 处理一切,所以我试图将 API 分成两个 API,用户 API 和数据库 API。
如果我使用 json 发送查询,比如
"query" :
["SELECT * FROM USER WHERE email='" + email + "'",
"INSERT INTO USER VALUES('" + email + "', '" + name + "', '" + password + "')"]
和数据库 API 应该同时处理这些查询。
如果 SELECT
有结果,请执行 INSERT
如果没有,请不要 INSERT
vertx有解决办法吗?
提前致谢。
connection.query("SELECT * FROM USER WHERE email='" + email + "'", rs -> {
if(!rs.result().getResults().isEmpty()) {
handler.handle(Future.failedFuture("email already exists"));
} else {
connection.execute("INSERT INTO USER VALUES('" + email + "', '" + name + "', '" + password + "')", ins -> {
if (ins.failed()) {
throw new RuntimeException(ins.cause());
}
// and close the connection
connection.close(done -> {
if (done.failed()) {
throw new RuntimeException(done.cause());
}
});
});
handler.handle(Future.succeededFuture(new JsonObject().put("result", "succeed")));
}
});
首先,我希望您实际上并没有向 API 发送查询,而是希望您使用准备好的语句来防止 SQL 注入。
其次,您可以在没有太多 Vert.x 干预的情况下解决您的问题,方法是向电子邮件列添加唯一键,然后捕获异常。
在您的数据库中:
alter table USER add unique (email)
在您的申请中:
JsonArray params = new JsonArray().add("a@a.com").add("A").add("abcd");
conn.updateWithParams("insert into user (email, name, password) values (?, ?, ?)", params,
(r) -> {
if (r.succeeded()) {
System.out.println("Ok!");
}
else {
if (r.cause() instanceof MySQLException) {
MySQLException cause = (MySQLException) r.cause();
// 1062 is MySQL Duplicate Key
if (cause.errorMessage().errorCode() == 1062) {
// Duplicate key, ignore
}
}
}
// Handle connection closing
});