Connecting to MySQL Database with Vert.x

1. Creating a Verticle Component

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;

public class MyFirstVerticle extends AbstractVerticle {

    private String sql = "SELECT id, name FROM t_school WHERE id IN (";
    private SQLClient sqlClient;

    @Override
    public void start(Future<Void> startFuture) throws Exception {
        JsonObject config = new JsonObject();
        config.put("username", "root")
              .put("password", "your_password")
              .put("host", "192.168.100.91")
              .put("database", "user");

        sqlClient = MySQLClient.createShared(vertx, config);

        Future<SQLConnection> connFuture = Future.future();
        sqlClient.getConnection(connFuture);

        connFuture.setHandler(connection -> {
            if (connection.succeeded()) {
                SQLConnection conn = connection.result();

                Future<SQLRowStream> streamFuture1 = Future.future();
                Future<List<User>> userFuture = Future.future();
                Future<List<JsonArray>> schoolFuture = Future.future();

                conn.queryStream("SELECT id, name, t_school_id FROM t_user", streamFuture1);

                streamFuture1.compose(sqlRowStream -> {
                    List<User> users = new ArrayList<>();
                    sqlRowStream.handler(jsonArray -> {
                        System.out.println(jsonArray);
                        users.add(new User(jsonArray));
                    });
                    System.out.println("User count: " + users.size());
                    userFuture.complete(users);
                    return userFuture;
                }).compose(users -> {
                    List<JsonArray> schoolList = new ArrayList<>();
                    JsonArray schoolIds = users.parallelStream()
                            .map(User::getSchoolId)
                            .collect(JsonArray::new, JsonArray::add, JsonArray::addAll);

                    String sql2 = sql + Utils.placeholder("?", schoolIds.size(), ", ") + ")";

                    conn.queryStreamWithParams(sql2, schoolIds, schoolResult -> {
                        if (schoolResult.failed()) {
                            schoolResult.cause().printStackTrace();
                            return;
                        }
                        schoolResult.result().handler(jsonArray1 -> {
                            if (jsonArray1 != null && jsonArray1.size() > 0) {
                                schoolList.add(jsonArray1);
                            }
                        });
                        schoolFuture.complete(schoolList);
                    });
                    return schoolFuture;
                });

                schoolFuture.setHandler(schoolList -> {
                    conn.close();
                    if (schoolList.failed()) {
                        schoolList.cause().printStackTrace();
                        return;
                    }
                    System.out.println("--- School Data ---");
                    schoolList.result().forEach(System.out::println);
                });

            } else {
                connection.cause().printStackTrace();
                System.err.println(connection.cause().getMessage());
            }
        });
        startFuture.complete();
    }
}

2. User Class

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 Class

package jdbcConnection;

public class Utils {

    private Utils() {}

    /**
     * Generate placeholders for SQL IN clause.
     * Example: placeholder("?", 5, ",") → "?,?,?,?,?"
     *
     * @param symbol    the placeholder symbol (e.g., "?")
     * @param count     number of placeholders
     * @param delimiter delimiter between placeholders (e.g., ",")
     * @return the joined placeholder string
     */
    public static String placeholder(String symbol, Integer count, String delimiter) {
        String[] parts = new String[count];
        for (int i = 0; i < count; i++) {
            parts[i] = symbol;
        }
        return String.join(delimiter, parts);
    }
}

4. Runnner Class

The runner class is a stendard Vert.x bootstrap class providded officially. For more details, refer to the Vert.x documentation.

// Example runner (simplified)
import io.vertx.core.Vertx;

public class Runner {
    public static void runExample(Class<?> clazz) {
        Vertx.vertx().deployVerticle(clazz.getName());
    }
}

Tags: Vert.x MySQL database java sql

Posted on Mon, 31 Aug 2026 16:15:28 +0000 by yakk0