Common SQL interface

通用SQL接口是用来和VertxSQL服务交互的.

通过指定的SQL服务接口我们可以获取一个指定的连接.

The SQL Connection

我们使用SQLConnection表示与一个数据库的连接.

Auto-commit

当连接的auto commit被设置为true. 这意味着每个操作都会在连接自己的事务中被高效地执行.

如果你想要在一个单独的事务中执行多个操作,你应该使用setAutoCommit方法将auto commit被设置为false.

当操作完成之后,我们设置的handler会自动地被调用.

  1. connection.setAutoCommit(false, res -> {
  2. if (res.succeeded()) {
  3. // OK!
  4. } else {
  5. // Failed!
  6. }
  7. });

Executing queries

我们使用query来执行查询操作

query方法的参数是原生SQL语句, 我们不必使用针对不同的数据库使用不同的SQL方言.

当查询完成之后,我们设置的handler会自动地被调用. query的结果使用ResultSet表示.

  1. connection.query("SELECT ID, FNAME, LNAME, SHOE_SIZE from PEOPLE", res -> {
  2. if (res.succeeded()) {
  3. // Get the result set
  4. ResultSet resultSet = res.result();
  5. } else {
  6. // Failed!
  7. }
  8. });

ResultSet实例中的getColumnNames方法可以获得可用列名, getResults可以获得查询真实的结果.

实际上,查询的结果是一个JsonArrayList实例,每一个元素都代表一行结果.

  1. List<String> columnNames = resultSet.getColumnNames();
  2. List<JsonArray> results = resultSet.getResults();
  3. for (JsonArray row: results) {
  4. String id = row.getString(0);
  5. String fName = row.getString(1);
  6. String lName = row.getString(2);
  7. int shoeSize = row.getInteger(3);
  8. }

另外你还可以使用getRows获取一个Json对象实例的List, 这种方式简化了刚才的方式,但是有一点需要注意的是,SQL结果可能包含重复的列名, 如果你的情景是这种情况,你应该使用getResults.

下面给出了一种使用getRows获取结果的示例:

  1. List<JsonObject> rows = resultSet.getRows();
  2. for (JsonObject row: rows) {
  3. String id = row.getString("ID");
  4. String fName = row.getString("FNAME");
  5. String lName = row.getString("LNAME");
  6. int shoeSize = row.getInteger("SHOE_SIZE");
  7. }

Prepared statement queries

我们可以使用queryWithParams来执行prepared statement查询.

下例中,演示了使用方法:

  1. String query = "SELECT ID, FNAME, LNAME, SHOE_SIZE from PEOPLE WHERE LNAME=? AND SHOE_SIZE > ?";
  2. JsonArray params = new JsonArray().add("Fox").add(9);
  3. connection.queryWithParams(query, params, res -> {
  4. if (res.succeeded()) {
  5. // Get the result set
  6. ResultSet resultSet = res.result();
  7. } else {
  8. // Failed!
  9. }
  10. });

Executing INSERT, UPDATE or DELETE

我们可以直接使用update方法进行数据更新操作.

同样update方法的参数同样是原生SQL语句,不必使用SQL方言.

当更新完成之后,我们会获得一个更新结果UpdateResult

我们可以调用更新结果的getUpdated方法获得有多少行发生了改变, 而且如果更新时生成了一些key,那么我们可以通过getKeys获得

  1. List<String> columnNames = resultSet.getColumnNames();
  2. List<JsonArray> results = resultSet.getResults();
  3. for (JsonArray row: results) {
  4. String id = row.getString(0);
  5. String fName = row.getString(1);
  6. String lName = row.getString(2);
  7. int shoeSize = row.getInteger(3);
  8. }

Prepared statement updates

如果想要执行prepared statement更新操作,我们可以使用updateWithParams.

如下例:

  1. String update = "UPDATE PEOPLE SET SHOE_SIZE = 10 WHERE LNAME=?";
  2. JsonArray params = new JsonArray().add("Fox");
  3. connection.updateWithParams(update, params, res -> {
  4. if (res.succeeded()) {
  5. UpdateResult updateResult = res.result();
  6. System.out.println("No. of rows updated: " + updateResult.getUpdated());
  7. } else {
  8. // Failed!
  9. }
  10. });

Executing other operations

如果想要执行其他数据库操作,例如创建数据库,你可以使用execute方法.

同样execute执行的语句也是原生SQL语句.当操作执行完之后,我们设置的handler会被调用.

  1. String sql = "CREATE TABLE PEOPLE (ID int generated by default as identity (start with 1 increment by 1) not null," +
  2. "FNAME varchar(255), LNAME varchar(255), SHOE_SIZE int);";
  3. connection.execute(sql, execute -> {
  4. if (execute.succeeded()) {
  5. System.out.println("Table created !");
  6. } else {
  7. // Failed!
  8. }
  9. });

Using transactions

如果想要使用事务,那么首先要调用setAutoCommitauto-commit设置为false.

接下来你就可以进行事务操作, 例如提交时使用commit, 回滚时使用rollback.

一旦commit/rollback完成之后, 我们设置的handler会被调用, 然后下一个事务会自动开始.

  1. connection.commit(res -> {
  2. if (res.succeeded()) {
  3. // Committed OK!
  4. } else {
  5. // Failed!
  6. }
  7. });

Closing connections

当你执行完全部的操作之后,你应该使用close将连接资源还给连接池.