上一节我们学习了如何获取vert.x的值,现在我们要学习下vert.x如何操作数据库。
vert.x提供了两种调用数据库的方式,一种是jdbc,老式的java调用数据库方式,这种方式的好处是通用,无论是哪种数据库,都可以使用这个调用。
另一种是针对mysql与pgsql的方式,这种方式比jdbc更轻,但是性能更好些。
这一节我们使用vert.x的jdbc库调用mysql数据库为例,vert.x操作io全是异步操作。控制mysql也是。
首先,我们需要先引入依赖,一个是vert.x的jdbc支持库,另一个是mysql的支持库build.gradle文件如下:
repositories { mavenCentral() } dependencies { compile "io.vertx:vertx-core:3.7.1" compile "io.vertx:vertx-jdbc-client:3.7.1" compile "mysql:mysql-connector-java:8.0.16" }
其中版本版本可以根据项目实际情况调整。
然后新建一个jdbc的连接池文件,以后所有的数据库请求全部通过这个文件执行。vert.x的jdbc连接池默认使用的C3P0,是一个老牌的java数据库连接池。
源码方式如下:
package JDBC; import io.vertx.core.Vertx; import io.vertx.core.json.JsonObject; import io.vertx.ext.jdbc.JDBCClient; import io.vertx.ext.sql.ResultSet; import io.vertx.ext.sql.SQLClient; import io.vertx.ext.sql.SQLConnection; import java.util.List; public class Jdbc { private static SQLClient client = null; public static void Init (Vertx vertx) { // 这里需要在主函数中调用,以初始化连接池 client = JDBCClient.createShared(vertx, new JsonObject() .put("driver_class", "com.mysql.cj.jdbc.Driver") .put("url", "jdbc:mysql://localhost:3306/homepage?serverTimezone=Asia/Shanghai") .put("user", "root") .put("password", "root")); } public static void QuerySql (String sql) { // 这里是调用执行数据库语句的位置 client.getConnection(res -> { if (res.succeeded()) { SQLConnection connection = res.result(); connection.query(sql, res2 -> { if (res2.succeeded()) { ResultSet rs = res2.result(); System.out.println("Run sql success"); List<JsonObject> rows = rs.getRows(); for(int i = 0 ; i < rows.size() ; i++) { System.out.println(rows.get(i)); } } else { System.out.println("Run sql fail"); } }); } else { System.out.println("Failed to get connection"); } }); } }
主函数对应修改为:
import JDBC.Jdbc; import io.vertx.core.Vertx; public class Main { public static void main (String args[]) { System.out.println("Hello world"); // Create an HTTP server which simply returns "Hello World!" to each request. Vertx vertx = Vertx.vertx(); Jdbc.Init(vertx); // 初始化数据库连接池 vertx.createHttpServer() .requestHandler(req -> { req.bodyHandler(body -> { Jdbc.QuerySql("SELECT * FROM `config`"); // 执行数据库查询语句 req.response() .putHeader("content-type", "text/plain") .putHeader("Access-Control-Allow-Origin", "*") .end("mothod:" + req.method() + " path:" + req.path() + " body:" + body); }); }) .listen(8080, handler -> { if (handler.succeeded()) { System.out.println("create httpserver success"); } else { System.err.println("create httpserver fail"); } }); } }
大家需要注意的是,数据库连接的url中,需要serverTimezone这个参数,这是mysql-connector-java这个包所决定的。如果数据库配置正确,应该就可以在终端中看见数据库的内容了。
文章作者:沃航科技