En este artículo, veremos cómo usar HSQL en aplicaciones Vert.X, por supuesto, también puede usar cualquier JDBC y usar la API asincrónica proporcionada por VertX-JDBC-Client. El código de este artículo está en GitHub.
¿asincrónico?
Una característica muy importante de vert.x es su asíncrona. Usando una API asincrónica, no necesita esperar a que el resultado regrese. Cuando se devuelve un resultado, Vert.x le notificará activamente. Para ilustrar esto, veamos un ejemplo simple.
Supongamos que hay un método ADD. En términos generales, se usará como int r = add (1, 1). Esta es una API sincrónica, por lo que debe esperar hasta que se devuelva el resultado. La API asíncrona se verá así: Agregar (1, 1, R -> { /*HAGA algo con el resultado* /}). En esta versión, pasa en un controlador, que se llama solo cuando se calcula el resultado. Este método no devuelve nada y lo implementa de la siguiente manera:
public void add (int a, int b, handler <integer> resulthandler) {int r = a + b; resulthandler.handle (r);}Para evitar conceptos confusos, las API asíncronas no son multiproceso. Como vimos en el ejemplo ADD, no hay múltiples lecturas involucradas.
JDBC asíncrono
Después de leer algunas API asincrónicas básicas, ahora comprenda VertX-JDBC-Client. Este componente nos permite interactuar con la base de datos a través del controlador JDBC. Estas interacciones son asíncronas, como antes:
String sql = "select * de productos"; resultset rs = stmt.executeQuery (sql);
Ahora es así:
Connection.Query ("Seleccionar * de productos", resultado -> {// Haz algo con el resultado});Este modelo es más eficiente, y cuando sale el resultado, se notifica a Vert.x, evitando esperar el resultado.
Aumentar las dependencias de Maven
Agregue dos dependencias maven al archivo pom.xml
<Spendency> <ProupId> io.vertx </groupid> <artifactId> vertx-jdbc-client </artifactid> <versión> 3.1.0 </versión> </pendency> <epardency> <proupId> org.hsqldb </groupId> <artifactid> hsqldb </artifactid> <versions> 2.3.3 </versión> </versión>
La primera dependencia proporciona VertX-JDBC-Client, y el segundo proporciona el controlador de HSQL JDBC. Si desea usar otra base de datos, modifique esta dependencia y también debe modificar los nombres de controladores JDBC URL y JDBC.
Inicializar el cliente JDBC
Crea un cliente JDBC:
En la clase MyFirstverticle, declare una nueva variable JDBCClient JDBC y agréguelo en el método de inicio:
jdbc = jdbcclient.createshared (vertx, config (), "my-whisky-colección");
Se creó una instancia de cliente JDBC y el cliente JDBC se configura utilizando el archivo de configuración del vertículo. Este archivo de configuración requiere la siguiente configuración para que el cliente JDBC funcione correctamente:
url-jdbc url, por ejemplo: jdbc: hsqldb: mem: db? shutdown = true
_Driver class-JDBC Driver, por ejemplo: org.hsqldb.jdbcdriver
Con el cliente, debe conectarse a la base de datos a continuación. Conectarse a la base de datos se logra utilizando JDBC.GetConnection, que requiere un parámetro Handler <Asyncresult <SQLConnection>>. Echemos un vistazo más profundo a este tipo. Primero, este es un controlador, por lo que se llamará cuando el resultado esté listo. Este resultado es una instancia de Asyncresult <SqlConnection>. Asyncresult es una estructura proporcionada por Vert.x. Úselo para saber si la operación que se conecta a la base de datos ha tenido éxito o ha fallado. Si tiene éxito, proporciona un resultado, que es una instancia de SQLConnection.
Cuando recibe una instancia de Asyncresult, el código suele ser:
if (ar.failed ()) {system.err.println ("La operación ha fallado ...:"+ ar.cause (). getMessage ());} else {// use el resultado: resultado = ar.result ();}Debe obtener SQLConnection y luego iniciar la aplicación REST. Debido a que se vuelve asincrónico, esto requiere cambiar la forma en que se inicia la aplicación. Entonces, si divide la secuencia de inicio en múltiples bloques:
startbackend ((conexión) -> CreateSomedata (conexión, (nada) -> startWebApp ((http) -> integralStarTup (http, fut)), fut), fut);
startbackend- obtenga el objeto sqlconnection y llame al siguiente paso
CreateSomedata: inicializa la base de datos e inserta datos. Cuando termine, llame al siguiente paso
startWebApp - iniciar una aplicación web
CompleteStartUp- Finalmente completo de inicio
Vert.x pasa FUT para notificar a los problemas que se han iniciado o encontrado durante el inicio.
Método de inicio:
privado void startbackend (handler <asyncresult <sqlconnection>> NEXT, futuro <boid> fut) {jdbc.getConnection (ar -> {if (ar.failed ()) {fut.fail (ar.Cause ());} else {next.handle (futuro.suceedEdFuture (ar.result ());}});});});});});});});});Este método obtiene un objeto SQLConnection para verificar si la operación se completa. Si tiene éxito, se llamará al siguiente paso. Si falla, se informará un error. Otros métodos siguen el mismo patrón:
Verifique si la operación anterior fue exitosa
Manejar la lógica de negocios
Llame al siguiente paso
Sql
El cliente está listo y ahora escribe SQL. Comenzando con el método CreateSomedata, este método también es parte de la secuencia de inicio:
Private void createSomedata (asyncresult <sqlconnection> resultado, handler <asyncresult <void>> next, futuro <void> fut) {if (result.failed ()) {fut.fail (result.Cause ());} else {sqlconnection Connection = result.result (); Connection.ExEcute ("CREAT SIFE TAUL varchar (100), " +" origen varchar (100)), ar -> {if (ar.failed ()) {fut.fail (ar.Cause ()); conexión.close (); return;} Connection.Query ("seleccione * de Whiskey", seleccione -> {if (select.failed ()) {fut.fail (ar.caus (select.Result (). getNumRows () == 0) {insert (nuevo whisky ("Bowmore 15 años laimrig", "Scotland, Islay"), Connection, (V) -> Insert (New Whiskey ("Talisker 57 ° North", "Escocia, Isla"), Connection, (R) ->> {Next.handle (Future. <void> SucceedFuture ()); Connection.Close ();}));Este método verifica si SQLConnection está disponible y luego ejecuta algunas declaraciones SQL. Primero, cree una tabla si no existe. Consulte el siguiente código:
Connection.Execute (Declaración SQL, Handler llamado cuando se ha ejecutado la declaración)
El controlador recibe Asyncresult <Void>, por ejemplo: es solo una notificación, y no hay un resultado de retorno real.
Cerrar la conexión
Después de completar la operación, no olvide cerrar el enlace SQL. Esta conexión se coloca en el grupo de conexión y se puede reutilizar.
En el código de este controlador, verificamos si la declaración se ejecuta correctamente. Si es correcto, verificaremos si la tabla contiene datos. Si no, utilizaremos el método de inserción para insertar los datos:
private void insert(Whisky whisky, SQLConnection connection, Handler<AsyncResult<Whisky>> next) {String sql = "INSERT INTO Whisky (name, origin) VALUES ?, ?";connection.updateWithParams(sql,new JsonArray().add(whisky.getName()).add(whisky.getOrigin()),(ar) -> {if (ar.failed ())) {next.handle (futuro.failedFuture (ar.Cause ())); return;} updaterSult result = ar.Result (); // construir una nueva instancia de whiskey con el id.whisky w = nuevo whiskey (resultado.getKeys (). whisky.getorigin ()); next.handle (Future.SucEdedFuture (w));});}Este método utiliza el método UpdateWithParams con la declaración Insertar (Declaración), y el valor se pasa. Este método evita la inyección SQL. Una vez que se ejecuta la declaración (se creará cuando la base de datos no tenga este dato), se crea un nuevo objeto de whisky y la ID se genera automáticamente.
Descansa con la base de datos (SQL)
Los métodos anteriores son parte de la secuencia de inicio. Pero, ¿qué pasa con el método de llamar a la API REST? Tome el método Getall como ejemplo. Este método es llamado por la aplicación web front-end y recupera todos los productos almacenados:
Private void getall (RoutingContext RoutingContext) {jdbc.getConnection (ar -> {sqlconnection Connection = ar.Result (); Connection.Query ("Seleccionar * de Whiskey", Result -> {List <Whiskeys = Whiskeys = resultado.Result (). getRows (). Stream (). MAP (Whiskey :: New) .Collect (Collectors.tolist ()); RoutingContext.Response (). Putheader ("Content-type", "Aplicación/JSON; Charset = UTF-8"). End (JSON.EncodePretty (Whishys)); });});}Este método obtiene un objeto SQLConnection y emite una consulta. Una vez que se obtenga el resultado de la consulta, escribirá una respuesta HTTP como el método anterior. Los métodos Getone, Deleteone, UpdateOne y Admite son los mismos. Tenga en cuenta que después de la respuesta, debe cerrar la conexión SQL.
Mire los resultados proporcionados por el controlador pasado al método de consulta. Obtenga un conjunto de resultados que contenga los resultados de la consulta. Cada fila es un JsonObject, por lo que si tiene un objeto de datos que usa JSONObject como el único parámetro, entonces crear este objeto es simple.
prueba
El programa de prueba debe actualizarse de manera pequeña y se agrega la configuración de JDBCClient. En la clase myFirstvertIlTestest, modifique el objeto de implementación de implementación creado en el método de configuración a:
ImplementmentOptions options = new implementMentOptions (). SetConfig (new JsonObject (). PUT ("http.port", puerto) .put ("url", "jdbc: hsqldb: mem: test? Shutdown = true"). PUT ("Driver_class", "Org.hsqldb.jdbcdrer");Además de http.port, los controladores JDBC URL y JDBC también están configurados. Durante las pruebas, se utiliza una base de datos en memoria. La misma modificación debe hacerse en el archivo SRC/Test/Resources/My-It-Config.json.
{"http.port": $ {http.port}, "url": "jdbc: hsqldb: mem: it-test? shutdown = true", "driver_class": "org.hsqldb.jdbcdriver"}}}}}El archivo SRC/Main/Conf/My-Application-Conf.json también debe modificarse, no para probar, sino para ejecutar esta aplicación:
{"http.port": 8082, "url": "jdbc: hsqldb: archivo: db/whiskeys", "driver_class": "org.hsqldb.jdbcdriver"}La URL JDBC aquí es un poco diferente del archivo anterior, porque la base de datos debe almacenarse en el disco duro.
¡Mostrar tiempo!
Comience a construir el programa:
Paquete de limpieza MVN
Sin modificar la API (sin cambiar los archivos Java publicados y la interfaz REST), la prueba debe ejecutarse sin problemas.
Iniciar la aplicación:
Java -jar Target/my-first-app-1.0-snapshot-fat.jar -conf src/main/conf/my-aplication-conf.json
Visite http: // localhost: 8082/assets/index.html, y luego puede ver que esta aplicación usa una base de datos. Esta vez, incluso si la aplicación se reinicia, los datos todavía están allí porque el producto de almacenamiento está persistido en el disco duro.
Resumir
En este artículo, sé cómo usar la base de datos JDBC en Vert.X, y no hay muchas cosas complicadas. Es posible que se sorprenda por este modelo de desarrollo asincrónico al principio, pero una vez que comience a usarlo, será difícil para usted volver.
La próxima vez, veremos cómo esta aplicación usa MongoDB para reemplazar HSQL.
Bienvenido a seguir <a href = "http://quanke.name/" rel = "nofollow"> </a>
Grupo de comunicación: 231419585
Indique la fuente al reimprimir, gracias