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