`

Vertx Jdbc操作 官网Demo Java版

阅读更多
/*
 * Copyright 2014 Red Hat, Inc.
 *
 *  All rights reserved. This program and the accompanying materials
 *  are made available under the terms of the Eclipse Public License v1.0
 *  and Apache License v2.0 which accompanies this distribution.
 *
 *  The Eclipse Public License is available at
 *  http://www.eclipse.org/legal/epl-v10.html
 *
 *  The Apache License v2.0 is available at
 *  http://www.opensource.org/licenses/apache2.0.php
 *
 *  You may elect to redistribute this code under either of these licenses.
 */

package io.vertx.example.web.jdbc;

import io.vertx.core.AbstractVerticle;
import io.vertx.core.Handler;
import io.vertx.core.http.HttpServerResponse;
import io.vertx.core.json.JsonArray;
import io.vertx.core.json.JsonObject;
import io.vertx.example.util.Runner;
import io.vertx.ext.jdbc.JDBCClient;
import io.vertx.ext.sql.SQLConnection;
import io.vertx.ext.web.Router;
import io.vertx.ext.web.RoutingContext;
import io.vertx.ext.web.handler.BodyHandler;

/**
 * @author <a href="mailto:pmlopes@gmail.com">Paulo Lopes</a>
 */
public class Server extends AbstractVerticle {

  // Convenience method so you can run it in your IDE
  public static void main(String[] args) {
    Runner.runExample(Server.class);
  }

  private JDBCClient client;

  @Override
  public void start() {

    Server that = this;

    // Create a JDBC client with a test database
    client = JDBCClient.createShared(vertx, new JsonObject()
      .put("url", "jdbc:hsqldb:mem:test?shutdown=true")
      .put("driver_class", "org.hsqldb.jdbcDriver"));

    setUpInitialData(ready -> {
      Router router = Router.router(vertx);

      router.route().handler(BodyHandler.create());

      // in order to minimize the nesting of call backs we can put the JDBC connection on the context for all routes
      // that match /products
      // this should really be encapsulated in a reusable JDBC handler that uses can just add to their app
      router.route("/products*").handler(routingContext -> client.getConnection(res -> {
        if (res.failed()) {
          routingContext.fail(res.cause());
        } else {
          SQLConnection conn = res.result();

          // save the connection on the context
          routingContext.put("conn", conn);

          // we need to return the connection back to the jdbc pool. In order to do that we need to close it, to keep
          // the remaining code readable one can add a headers end handler to close the connection. The reason to
          // choose the headers end is that if the close of the connection or say for example end of transaction
          // results in an error, it is still possible to return back to the client an error code and message.
          routingContext.addHeadersEndHandler(done -> conn.close(close -> {
            if (close.failed()) {
              done.fail(close.cause());
            } else {
              done.complete();
            }
          }));

          routingContext.next();
        }
      })).failureHandler(routingContext -> {
        SQLConnection conn = routingContext.get("conn");
        if (conn != null) {
          conn.close(v -> {
          });
        }
      });

      router.get("/products/:productID").handler(that::handleGetProduct);
      router.post("/products").handler(that::handleAddProduct);
      router.get("/products").handler(that::handleListProducts);

      vertx.createHttpServer().requestHandler(router::accept).listen(8080);
    });
  }

  private void handleGetProduct(RoutingContext routingContext) {
    String productID = routingContext.request().getParam("productID");
    HttpServerResponse response = routingContext.response();
    if (productID == null) {
      sendError(400, response);
    } else {
      SQLConnection conn = routingContext.get("conn");

      conn.queryWithParams("SELECT id, name, price, weight FROM products where id = ?", new JsonArray().add(Integer.parseInt(productID)), query -> {
        if (query.failed()) {
          sendError(500, response);
        } else {
          if (query.result().getNumRows() == 0) {
            sendError(404, response);
          } else {
            response.putHeader("content-type", "application/json").end(query.result().getRows().get(0).encode());
          }
        }
      });
    }
  }

  private void handleAddProduct(RoutingContext routingContext) {
    HttpServerResponse response = routingContext.response();

    SQLConnection conn = routingContext.get("conn");
    JsonObject product = routingContext.getBodyAsJson();

    conn.updateWithParams("INSERT INTO products (name, price, weight) VALUES (?, ?, ?)",
      new JsonArray().add(product.getString("name")).add(product.getFloat("price")).add(product.getInteger("weight")), query -> {
        if (query.failed()) {
          sendError(500, response);
        } else {
          response.end();
        }
      });
  }

  private void handleListProducts(RoutingContext routingContext) {
    HttpServerResponse response = routingContext.response();
    SQLConnection conn = routingContext.get("conn");

    conn.query("SELECT id, name, price, weight FROM products", query -> {
      if (query.failed()) {
        sendError(500, response);
      } else {
        JsonArray arr = new JsonArray();
        query.result().getRows().forEach(arr::add);
        routingContext.response().putHeader("content-type", "application/json").end(arr.encode());
      }
    });
  }

  private void sendError(int statusCode, HttpServerResponse response) {
    response.setStatusCode(statusCode).end();
  }

  private void setUpInitialData(Handler<Void> done) {
    client.getConnection(res -> {
      if (res.failed()) {
        throw new RuntimeException(res.cause());
      }

      final SQLConnection conn = res.result();

      conn.execute("CREATE TABLE IF NOT EXISTS products(id INT IDENTITY, name VARCHAR(255), price FLOAT, weight INT)", ddl -> {
        if (ddl.failed()) {
          throw new RuntimeException(ddl.cause());
        }

        conn.execute("INSERT INTO products (name, price, weight) VALUES ('Egg Whisk', 3.99, 150), ('Tea Cosy', 5.99, 100), ('Spatula', 1.00, 80)", fixtures -> {
          if (fixtures.failed()) {
            throw new RuntimeException(fixtures.cause());
          }

          done.handle(null);
        });
      });
    });
  }
}

 

分享到:
评论

相关推荐

    vertx-service-demo

    vertx-service-demo

    vertx-h2-httpclient-demo.zip

    解压后的`vertx-demo`目录应该包含了这些组成部分,展示了如何组织和构建一个Vert.x项目。 6. **依赖管理**: 使用Gradle或Maven等构建工具,我们可以管理项目所依赖的库,包括Vert.x核心、Web模块和H2数据库驱动。...

    vertx-jdbc:顶点 3.0 JDBC

    Vertx JDBC 执行器 JDBC Executor 为通过 Vertx 3.0 事件总线访问任何符合 JDBC 的数据源提供了一种快速有效的方法。 与 Executor 的所有交互都应该是原子的,并且尽可能“简短而甜蜜”,以尽量减少对共享(JDBC ...

    vertx-cluster-demo:基于Hazelcast的群集管理器的Vert.x示例

    【标题解析】 "vertx-cluster-demo"是一...通过深入学习和实践`vertx-cluster-demo`,开发者可以掌握如何在Java环境中使用Vert.x和Hazelcast构建高可用、可伸缩的分布式系统,这对于开发现代云应用具有极大的实际价值。

    vertx-core-3.9.0-API文档-中文版.zip

    标签:vertx、core、中文文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。

    vertx-web-3.9.0-API文档-中文版.zip

    标签:vertx、web、中文文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。

    Java vertx

    Java API 版本的Vert.x Core 手册, Java API 版本的Vert.x Core 手册, Java API 版本的Vert.x Core 手册, Java API 版本的Vert.x Core 手册, Java API 版本的Vert.x Core 手册

    分布式游戏服务端 Vertx3

    - 数据库集成可能通过Vertx的JDBC客户端进行,实现异步的数据库操作。 - 可能包含配置文件、测试用例、部署脚本等辅助资源。 4. **开发环境与工具**: - 开发者通常会使用Java 8或更高版本,因为Vert.x 3支持...

    java MQTT server ,MQTT client 直接使用java实现,快速连接物联网

    基于 t-io 实现的低延迟、高性能的 mqtt 物联网组件 ... MQTT 客户端 阿里云 mqtt 连接 demo。 支持 GraalVM 编译成本机可执行程序。 支持 Spring boot 项目快速接入 基于 redis pub/sub 实现集群。

    vertx-web-3.9.0-API文档-中英对照版.zip

    标签:vertx、web、中英对照文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。...

    vertx-core-3.9.0-API文档-中英对照版.zip

    标签:vertx、core、中英对照文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用...

    vertx集成mybatis架构

    【描述】:“自己写的一个java+vertx+mybatis的网关、服务分发,用于app后台接口开发的基本框架,仅供参考,请不要用于商业用途。” 这个描述表明作者创建了一个基于Java、Vert.x和MyBatis的框架,该框架主要用于...

    JDBC数据源连接池的配置和使用示例

    - HikariCP:被誉为“最快的Java JDBC连接池”,以其高效和低延迟而闻名。 - Druid:阿里巴巴开源的数据库连接池,提供了监控和扩展功能,广泛应用于各种Java Web项目。 ### 3. 配置数据源连接池 以HikariCP为例,...

    vertx-mod-jersey-2.4.0-final.zip

    【标题】"vertx-mod-jersey-2.4.0-final.zip" 是一个基于 Vert.x 框架的 Jersey 模块的发布版本。Vert.x 是一个轻量级、高性能且反应式的 Java 开发平台,它允许开发人员构建分布式系统,而Jersey 则是 Java 世界中...

    vertx学习示例

    1. **非阻塞I/O**:Vertx采用反应式编程模型,利用Java NIO库实现非阻塞I/O操作,极大地提高了系统的并发能力。通过事件循环(Event Loop)处理并发请求,避免了线程池的创建和管理,降低了资源消耗。 2. **模块化...

    vertx-bridge-common-3.9.0-API文档-中文版.zip

    标签:vertx、bridge、common、中文文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请...

    vertx-auth-common-3.9.0-API文档-中文版.zip

    标签:vertx、auth、common、中文文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心...

    用vertx构建最小的wiki

    【标题】"用vertx构建最小的wiki"的项目是一个基于Java编程语言,利用Vert.x框架来搭建的轻量级维基系统。Vert.x是一个高度可扩展的、反应式的应用平台,适合构建现代的、非阻塞式的服务。在这个项目中,开发环境...

    javascript Vertx开发教程

    JavaScript Vertx开发教程 在现代Web开发中,Vert.x是一个重要的工具,它是一个轻量级、反应式的事件驱动框架,专为构建分布式系统而设计。本教程将深入探讨如何使用JavaScript来利用Vert.x的强大功能,以创建高效...

    vertx应用开发实例教程-完整版

    本资源为 Vert.x应用开发实例教程(吕海东,张坤 著)全高清完整版pdf 。 《Vert.x应用开发实例教程》全面采用案例驱动,主要知识的讲解都辅助以实际案例应用编程,便于读者的理解和自主学习和运用。  知识讲解通俗...

Global site tag (gtag.js) - Google Analytics