文章背景
- 消除回调地狱
- 先查询学生(包含学校的Id),然后使用学校的ID,去学校表查询学校的详细信息
1. DbVerticle.java
import com.xiaoniu.db.entity.User;
import com.xiaoniu.db.utils.Utils;
import io.vertx.core.AbstractVerticle;
import io.vertx.core.Future;
import io.vertx.core.json.JsonArray;
import io.vertx.core.json.JsonObject;
import io.vertx.ext.asyncsql.MySQLClient;
import io.vertx.ext.sql.SQLClient;
import io.vertx.ext.sql.SQLConnection;
import io.vertx.ext.sql.SQLRowStream;
import java.util.ArrayList;
import java.util.List;
/**
* Created by sweet on 2017/9/13.
*/
public class DbVerticle extends AbstractVerticle {
private String sql = "SELECT id, name FROM t_school WHERE id IN (";
private SQLClient sqlClient;
public static void main(String[] args) {
Runner.runExample(DbVerticle.class);
}
@Override
public void start(Future startFuture) throws Exception {
JsonObject c = new JsonObject();
c.put("username", "root").put("password", "main")
.put("host","127.0.0.1").put("database", "sqldemo2");
sqlClient = MySQLClient.createShared(vertx, c);
Future sqlConnectionFuture = Future.future();
sqlClient.getConnection(sqlConnectionFuture);
sqlConnectionFuture.setHandler(connection -> {
if (connection.succeeded()) {
SQLConnection conn = connection.result();
Future streamFuture1 = Future.future();
Future> streamFuture2 = Future.future();
Future> future = Future.future();
conn.queryStream("SELECT id, name, t_school_id FROM t_user", streamFuture1);
streamFuture1.compose(sqlRowStream -> {
List users = new ArrayList<>();
sqlRowStream.handler(jsonArray -> {
System.out.println(jsonArray);
users.add(new User(jsonArray));
});
System.out.println("user size: " + users.size());
streamFuture2.complete(users);
}, streamFuture2).compose(users -> {
List list = new ArrayList<>();
JsonArray collect = users.parallelStream()
.map(User::getSchoolId)
.collect(JsonArray::new, JsonArray::add, JsonArray::addAll);
String sql2 = sql += Utils.placeholder("?", collect.size(), ", ") + ")";
conn.queryStreamWithParams(sql2, collect, schoolResult -> {
if (schoolResult.failed()){
schoolResult.cause().printStackTrace();
return;
}
schoolResult.result().handler(jsonArray1 -> {
if (jsonArray1 != null && jsonArray1.size() > 0)
list.add(jsonArray1);
});
future.complete(list);
});
}, future);
future.setHandler(list -> {
conn.close(); // 关闭流
if (list.failed()) {
list.cause().printStackTrace();
return;
}
System.out.println("-----");
list.result().forEach(System.out::println);
});
} else {
connection.cause().printStackTrace();
System.err.println(connection.cause().getMessage());
}
});
startFuture.complete();
}
}
复制代码
2. Utils.java
public class Utils {
public static void main(String[] args) {
System.out.println(placeholder("?", 5, ","));
}
private Utils(){}
/**
* 生成占位符
* (?, 5, ",")
* ?,?,?,?,?
* @param symbol ?
* @param count 出现个数
* @param delimiter 分割符
* @return
*/
public static String placeholder(String symbol, Integer count, String delimiter) {
String[] s = new String[count];
for (int i = 0; i < count; i++) {
s[i] = symbol;
}
return String.join(delimiter, s);
}
}
复制代码
3. User.java
public class User {
private String id;
private String name;
private String schoolId;
public User() {
}
public User(String id, String name) {
this.id = id;
this.name = name;
}
public User(JsonArray jsonArray) {
this.id = jsonArray.getString(0);
this.name = jsonArray.getString(1);
this.schoolId = jsonArray.getString(2);
}
@Override
public String toString() {
return "User{" +
"id='" + id + '\'' +
", name='" + name + '\'' +
", schoolId='" + schoolId + '\'' +
'}';
}
// ....
}
复制代码
4. pom.xml
<dependencies>
<dependency>
<groupId>io.vertxgroupId>
<artifactId>vertx-coreartifactId>
<version>3.4.2version>
dependency>
<dependency>
<groupId>io.vertxgroupId>
<artifactId>vertx-mysql-postgresql-clientartifactId>
<version>3.4.2version>
dependency>
<dependency>
<groupId>org.slf4jgroupId>
<artifactId>slf4j-apiartifactId>
<version>1.7.25version>
dependency>
<dependency>
<groupId>org.apache.logging.log4jgroupId>
<artifactId>slf4j-implartifactId>
<version>RELEASEversion>
dependency>
dependencies>
复制代码
5. Runner.java
这个文件是官方提供的 方便在 IDE中运行的类,https://github.com/vert-x3/vertx-examples/blob/master/core-examples/src/main/java/io/vertx/example/util/Runner.java。