blob: 117cfde94af5abea12edc9ab95c5ddb37682ba09 [file] [log] [blame]
// Licensed to the Apache Software Foundation (ASF) under one or more
// contributor license agreements. See the NOTICE file distributed with
// this work for additional information regarding copyright ownership.
// The ASF licenses this file to You under the Apache License, Version 2.0
// (the "License"); you may not use this file except in compliance with
// the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
= Java SQL API
In your Java projects, you can use the Java SQL API to execute SQL statements and getting results.
== Creating Tables
Here is an example of how you can create a new table on a cluster:
[source, java]
----
ignite.sql().execute(null, "CREATE TABLE IF NOT EXISTS Person (id int primary key, name varchar, age int);");
----
NOTE: ResultSet is closable, but it is safe to skip `close()` method for DDL and DML queries, as they do not keep server cursor open.
=== Using Sequences
When creating a table, you can designate the primary key column to be filled automatically from the sequence the values for your primary key by using sql sequences:
[source, 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);");
----
== Filling Tables
With Ignite 3, you can fill the table by adding rows one by one, or in a batch. In both cases, you create an `INSERT` statement, and then exeсute it:
[source, 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();
----
=== Using Sequences
When filling a table, you can generate the values for your primary key by using sql sequences:
[source, 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();
----
== Partition-Specific SELECTs
When executing a SELECT operation, you can use the system `\__part` column to only `SELECT` data in a specific partition. To find out partition information, use the SELECT request that explicitly includes the `__part` column as its part:
[source, sql]
----
SELECT city_id, id, "__part" FROM Person;
----
Once you know the partition, you can use it in the `WHERE` clause:
[source, sql]
----
SELECT city_id, id FROM Person WHERE "__part"=23;
----
== Getting Data From Tables
To get data from a table, execute the `SELECT` statement to get a set of results. SqlRow can provide access to column values by column name or column index. You can then iterate through results to get data:
[source, 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));
}
}
----
NOTE: ResultSet may hold server-side cursor open due to lazy query execution. It must be closed manually, or by using the `try-with-resources` statement.
== SQL Scripts
The default API executes SQL statements one at a time. For large SQL statements, pass them to the `executeScript()` method. The statements will be batched together similar to using `SET STREAMING` command in Ignite 8, significantly improving performance when executing a large number of queries at once. These statements will be executed in order.
[tabs]
--
tab:Java[]
[source, 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);
----
--
NOTE: Execution of each statement is considered complete when the first page is ready to be returned. As a result, when working with large data sets, SELECT statement may be affected by later statements in the same script.