上一节我们学习了如何获取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这个包所决定的。如果数据库配置正确,应该就可以在终端中看见数据库的内容了。
文章作者:沃航科技