1:創建一個verticle組件
package jdbcConnection; import io.vertx.core.AbstractVerticle; import io.vertx.core.AsyncResult; import io.vertx.core.Future; import io.vertx.core.Handler; 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 MyFirstVerticle 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(MyFirstVerticle.class); } @Override public void start(Future<Void> startFuture) throws Exception { JsonObject c = new JsonObject(); //配置數據庫連接 c.put("username", "root").put("password", "1367356") .put("host","192.168.100.91").put("database", "user"); sqlClient = MySQLClient.createShared(vertx, c); Future<SQLConnection> sqlConnectionFuture = Future.future(); sqlClient.getConnection(sqlConnectionFuture); sqlConnectionFuture.setHandler(connection -> { if (connection.succeeded()) { SQLConnection conn = connection.result(); Future<SQLRowStream> streamFuture1 = Future.future(); Future<List<User>> streamFuture2 = Future.future(); Future<List<JsonArray>> future = Future.future(); //public interface Future<T> extends AsyncResult<T>, Handler<AsyncResult<T>> conn.queryStream("SELECT id, name, t_school_id FROM t_user", streamFuture1); //前面sql語句執行的結果,交到streamFuture1容器里,或者由handler處理,Future<T>是繼承了Handler<AsyncResult<T>>的。 //T是SQLRowStream,streamFuture1是Future<SQLRowStream>。 streamFuture1.compose(sqlRowStream -> { //處理sqlRowStream // System.out.println(sqlRowStream.column("id")); //0 // System.out.println(sqlRowStream.column("name")); //1 List<User> users = new ArrayList<>(); sqlRowStream.handler(jsonArray -> { //sqlRowStream,轉換為了jsonArray。["23","lisi","yuhuange"] System.out.println(jsonArray); users.add(new User(jsonArray)); }); System.out.println("user size: " + users.size()); //1 streamFuture2.complete(users); }, streamFuture2)//處理完成,有一個結果Future,繼續處理。 .compose(users -> { //處理users List<JsonArray> 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 -> { //將schoolResult轉化為json數據進行處理 if (jsonArray1 != null && jsonArray1.size() > 0) list.add(jsonArray1); }); future.complete(list); }); }, future); future.setHandler(list -> { //異步結果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:user類
package jdbcConnection; import io.vertx.core.json.JsonArray; public class User { private String id; private String name; private String schoolId; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getSchoolId() { return schoolId; } public void setSchoolId(String schoolId) { this.schoolId = 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 + '\'' + '}'; } // .... }
3:utils類
package jdbcConnection; 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); } }
4:runner是vertx官方提供的啟動加載類:參考
https://juejin.im/post/5a309478518825592c081748