Connessione a SQL server con Java e Vert.x Reactive

Mattepuffo's logo
Connessione a SQL server con Java e Vert.x Reactive

Connessione a SQL server con Java e Vert.x Reactive

In Vert.x possiamo connetterci ad un database sia usando JDBC, sia usando i Reactive client.

In questo articolo vediamo come connetterci ad un db SQL Server in Java e usando Reactive MSSQL Client.

Se non è già presente, dobbiamo aggiungere la libreria; se usate Maven:

<dependency>
  <groupId>io.vertx</groupId>
  <artifactId>vertx-mssql-client</artifactId>
</dependency>

Poi creiamo due model, uno che rappresenta i dati della tabella, ed uno per eventuali errori.

Il primo è questo:

public class Comune {

  private String nome;

  public String getNome() {
    return nome;
  }

  public void setNome(String nome) {
    this.nome = nome;
  }

}

Il secondo è questo:

public class Errore {

  private String messaggio;

  public String getMessaggio() {
    return messaggio;
  }

  public void setMessaggio(String messaggio) {
    this.messaggio = messaggio;
  }
}

A questo punto abbiamo l'oggetto MSSQLConnectOptions per impostare le opzioni di connessione, e MSSQLPool per inizializzare la connessione.

Metteremo tutto ciò in un metodo apposito.

Qui sotto il codice completo:

import io.vertx.core.AbstractVerticle;
import io.vertx.core.Promise;
import io.vertx.core.http.HttpServerResponse;
import io.vertx.core.json.Json;
import io.vertx.ext.web.Router;
import io.vertx.mssqlclient.MSSQLConnectOptions;
import io.vertx.mssqlclient.MSSQLPool;
import io.vertx.sqlclient.PoolOptions;
import io.vertx.sqlclient.Row;
import io.vertx.sqlclient.RowSet;

import java.util.ArrayList;
import java.util.List;

public class MainVerticle extends AbstractVerticle {

  private MSSQLPool getClient() {
    MSSQLConnectOptions connectOptions = new MSSQLConnectOptions()
      .setPort(1433)
      .setHost("HOST")
      .setDatabase("DB_NOME")
      .setUser("USERNAME")
      .setPassword("PASSWORD");

    PoolOptions poolOptions = new PoolOptions().setMaxSize(5);
    return MSSQLPool.pool(vertx, connectOptions, poolOptions);
  }

  @Override
  public void start(Promise<Void> startPromise) {

    Router router = Router.router(vertx);

    router.route("/").handler(routingContext -> {
      HttpServerResponse response = routingContext.response();

      List<Comune> list = new ArrayList<>();
      getClient()
        .query("SELECT * FROM Comuni")
        .execute(ar -> {
          if (ar.failed()) {
            Errore errore = new Errore();
            errore.setMessaggio("Si è verificato un errore");
            List<Errore> listErrore = new ArrayList<>();
            listErrore.add(errore);
            response
              .putHeader("content-type", "application/json; charset=utf-8")
              .end(Json.encodePrettily(listErrore));
          } else {
            RowSet<Row> result = ar.result();
            if (result.size() > 0) {
              for (Row row : result) {
                Comune c = new Comune();
                c.setNome(row.getString(2));
                list.add(c);
              }

              response
                .putHeader("content-type", "application/json; charset=utf-8")
                .end(Json.encodePrettily(list));

            } else {
              Errore errore = new Errore();
              errore.setMessaggio("Nessun record trovato");
              List<Errore> listErrore = new ArrayList<>();
              listErrore.add(errore);
              response
                .putHeader("content-type", "application/json; charset=utf-8")
                .end(Json.encodePrettily(listErrore));
            }
          }

          getClient().close();
        });
    });

    vertx.createHttpServer()
      .requestHandler(router)
      .listen(8888, http -> {
        if (http.succeeded()) {
          startPromise.complete();
          System.out.println("In ascolto su http://localhost:8888/");
        } else {
          startPromise.fail(http.cause());
        }
      });

  }

}

Tramite Json.encodePrettily inviamo i dati in formato JSON già "formattati".

Ovviamente possiamo migliorare questo codice; io ho messo tutto insieme visto che si tratta di una sola rotta e una sola query.

Enjoy!


Condividi

Commentami!