Skip to content

Java SQL API

在 Java 项目中,可以使用 Java SQL API 执行 SQL 语句并获取结果。

1.创建表

以下是如何在集群上创建新表的示例:

java
ignite.sql().execute(null, "CREATE TABLE IF NOT EXISTS Person (id int primary key, name varchar, age int);");

提示

ResultSet 是可关闭的,但可以安全地跳过 DDL 和 DML 查询的 close() 方法,因为这时服务端的游标不会保持打开的状态。

1.1.使用序列

创建表时,可以使用序列来指定自动填充主键值的主键列:

java
ignite.sql().execute(null, "CREATE SEQUENCE IF NOT EXISTS defaultSequence;");
ignite.sql().execute(null, "CREATE TABLE IF NOT EXISTS Person (id bigint default NEXTVAL('defaultSequence') primary key, city_id bigint, name varchar, age int, company varchar);");

2.填充表

Ignite 3 中可以通过逐行或批量添加来填充表。两者都需要创建一个INSERT语句,然后执行:

java
long rowsAdded = Arrays.stream(client.sql().executeBatch(null,
    "INSERT INTO Person (id, name, age) values (?, ?, ?)",
    BatchedArguments.of(1, "John", 46)
        .add(2, "Jane", 28)
        .add(3, "Mary", 51)
        .add(4, "Richard", 33)))
    .sum();

2.1.使用序列

在填充表时,可以使用序列生成主键的值:

java
ignite.sql().execute(null, "CREATE SEQUENCE IF NOT EXISTS defaultSequence;");

ignite.sql().execute(null, "CREATE TABLE IF NOT EXISTS Person (id bigint default NEXTVAL('defaultSequence') primary key, city_id bigint, name varchar, age int, company varchar);");

long rowsAdded = Arrays.stream(client.sql().executeBatch(null,
    "INSERT INTO Person (city_id, name, age, company) values (?, ?, ?, ?)",
    BatchedArguments.of(1, "John", 46, "oldCorp")
        .add(2, "Jane", 28, "newCorp")
        .add(3, "Mary", 51, "newCorp")
        .add(4, "Richard", 33, "oldCorp")))
    .sum();

3.指定分区的查询

执行查询操作时,可以使用系统的__part列来仅查询指定分区中的数据。要查找分区信息,需要在查询语句中显式包含 __part 列:

sql
SELECT city_id, id, "__part"  FROM Person;

知道分区后就可以在 WHERE 子句中使用它:

sql
SELECT city_id, id FROM Person WHERE "__part"=23;

4.从表中获取数据

执行 SELECT 语句可以从表中获取数据,SqlRow 可以根据列名或列索引访问列值,然后就可以迭代结果以获取数据:

java
try (ResultSet<SqlRow> rs = client.sql().execute(null, "SELECT id, name, age FROM Person")) {
    while (rs.hasNext()) {
        SqlRow row = rs.next();
        System.out.println("    "
            + row.value(1) + ", "
            + row.value(2));
    }
}

提示

由于查询的延迟执行,ResultSet 可能会使服务端游标保持打开状态,所以必须手动关闭它,或使用try-with-resources语句关闭它。

5.SQL 脚本

API 默认一次执行一个 SQL 语句。对于大型 SQL 语句,可以将其传递给 executeScript() 方法。这些语句将一起批处理,类似于在 Ignite 2 中使用 SET STREAMING 命令,从而显著提高一次执行大量查询时的性能,这些语句将按顺序执行。

java
String script = "CREATE TABLE IF NOT EXISTS Person (id int primary key, name varchar, age int default 0);"
              + "INSERT INTO Person (id, name, age) VALUES ('1', 'John', '46');";
client.sql().executeScript(script);

提示

当第一页准备好返回时,会认为每个语句的执行都已完成。因此,在处理大型数据集时,SELECT 语句可能会受到同一脚本中后续语句的影响。

18624049226