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!
java vertx sql server mssqlpool maven
Commentami!