Vert.x提供异步访问数据库的API,数据库操作是一个耗时操作,使用传统的同步模型,容易阻塞线程,导致整体性能下降,因此我们对于数据库操作,需要使用Vert.x提供的异步API。
Vert.x提供的API层级非常低,可以说是仅仅在原生JDBC基础上封装了一层异步接口。所有的对数据库操作都需要通过编写SQL来完成,参数的封装和结果的获取都需要手动的来实现,对于习惯使用ORM框架的开发者可能会非常的不习惯。
先来通过一个查询数据库的案例来演示如何使用Vert.x提供的异步API
基本操作
1.引入数据库依赖,我们需要引入两个包,一个是vertx-jdbc,另一个是要真正连接数据库的驱动包,这里以MySQL为例
1
2 io.vertx
3 vertx-jdbc-client
4 3.6.0
5
7
8 mysql
9 mysql-connector-java
10 8.0.13
11
2.抽象出一个DbUtils来方便获取数据库客户端,为了简单,直接就将配置写到代码里了
1 public classJdbcUtils {2
3 //用于操作数据库的客户端
4 privateJDBCClient dbClient;5
6 publicJdbcUtils(Vertx vertx) {7
8 //构造数据库的连接信息
9 JsonObject dbConfig = newJsonObject();10 dbConfig.put("url", "jdbc:mysql://192.168.40.66:3306/test");11 dbConfig.put("driver_class", "com.mysql.jdbc.Driver");
.put("url", "jdbc:mysql://localhost:3306/test4?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT%2B8")
.put("driver_class", "com.mysql.cj.jdbc.Driver")
12 dbConfig.put("user", "xxxx");13 dbConfig.put("password", "xxxx");14
15 //创建客户端16 dbClient =JDBCClient.createShared(vertx, dbConfig);17 }1819 //提供一个公共方法来获取客户端 20 publicJDBCClient getDbClient() {21 returndbClient;22 }23 24 }
通过上面的工具类,可以快速的获取到客户端,看上面的代码也很简单,通过JsonObect构建一些基本的数据库连接信息,然后通过JDBCClient的createShard方法创建一个JDBCClient实例。
3.进行数据库的操作,以查询年龄大于18岁的用户为例
1 public class JdbcTestVerticle extendsAbstractVerticle {2
3 @Override4 public void start() throwsException {5
6 //获取到数据库连接的客户端
7 JDBCClient jdbcClient = newJdbcUtils(vertx).getDbClient();8 String sql = "select * from t_user where age > ?";9 //构造参数
10 JsonArray params = new JsonArray().add(18);11 //执行查询
12 jdbcClient.queryWithParams(sql, params, qryRes->{13 if(qryRes.succeeded()) {14 //获取到查询的结果,Vert.x对ResultSet进行了封装
15 ResultSet resultSet =qryRes.result();16 //把ResultSet转为List形式
17 List rows =resultSet.getRows();18 //输出结果
19 System.out.println(rows);20 } else{21 System.out.println("查询数据库出错!");22 }23 });24
25 }26
27 public static voidmain(String[] args) {28 Vertx vertx =Vertx.vertx();29 vertx.deployVerticle(newJdbcTestVerticle());30 }31 }
JsonArray是一个数组,SQL中用到的参数可以通过构建一个JsonArray来赋值。
JsonObejct是一个Json对象,类似于阿里的fastjson中提供的JSONObject
这两个对象在Vert.x中非常常用,而且非常的好用,但一定要注意空指针的问题,这是非常让人头疼的。
优化
通过上面的三个步骤,就可成功的对数据库进行操作了,但还有些问题需要优化,比如数据库连接信息放到配置文件中,再比如使用数据库连接池等等。
* 使用配置文件
1 {2 "default":{3 "url":"jdbc:mysql://localhost:3306/my_project",4 "driver_class":"com.mysql.cj.jdbc.Driver",5 "user":"root",6 "password":"root"
7 },8 "pr