vertx連接mysql數據庫


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

   


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM