This is an automated email from the ASF dual-hosted git repository.

sk0x50 pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/ignite-3.git


The following commit(s) were added to refs/heads/main by this push:
     new 62642ac8ed4 IGNITE-25689 Add java api intro (#6060)
62642ac8ed4 is described below

commit 62642ac8ed4635cc7a09066907119f723bf8648f
Author: IgGusev <[email protected]>
AuthorDate: Wed Jun 18 17:58:04 2025 +0400

    IGNITE-25689 Add java api intro (#6060)
---
 docs/_data/toc.yaml                  |   2 +
 docs/_docs/quick-start/java-api.adoc | 370 +++++++++++++++++++++++++++++++++++
 2 files changed, 372 insertions(+)

diff --git a/docs/_data/toc.yaml b/docs/_data/toc.yaml
index d293012e391..0ad52fea298 100644
--- a/docs/_data/toc.yaml
+++ b/docs/_data/toc.yaml
@@ -36,6 +36,8 @@
       url: quick-start/explore-sql
     - title: Persist Your Data
       url: quick-start/persist-data
+    - title: Use Java API
+      url: quick-start/java-api
 - title: Embedded Mode
   url: quick-start/embedded-mode
 - title: Ignite CLI Tool
diff --git a/docs/_docs/quick-start/java-api.adoc 
b/docs/_docs/quick-start/java-api.adoc
new file mode 100644
index 00000000000..8aa9ae3a718
--- /dev/null
+++ b/docs/_docs/quick-start/java-api.adoc
@@ -0,0 +1,370 @@
+= Getting Started with Ignite 3 Using Java API
+
+This guide walks you through creating a Java application that connects to an 
Ignite 3 cluster, demonstrating key patterns for working with data using Ignite 
Java API.
+
+== Prerequisites
+
+* JDK 17 or later;
+* Maven;
+* Up-to-date versions of Docker and Docker Compose.
+
+== Setting Up Ignite 3 Cluster
+
+Create a Docker Compose file to run a three-node Ignite cluster:
+
+[source, yaml]
+----
+# docker-compose.yml
+name: ignite3
+
+x-ignite-def: &ignite-def
+  image: apacheignite/ignite:3.0.0
+  environment:
+    JVM_MAX_MEM: "4g"
+    JVM_MIN_MEM: "4g"
+  configs:
+    - source: node_config
+      target: /opt/ignite/etc/ignite-config.conf
+
+services:
+  node1:
+    <<: *ignite-def
+    command: --node-name node1
+    ports:
+      - "10300:10300"  # REST API port
+      - "10800:10800"  # Client port
+  node2:
+    <<: *ignite-def
+    command: --node-name node2
+    ports:
+      - "10301:10300"
+      - "10801:10800"
+  node3:
+    <<: *ignite-def
+    command: --node-name node3
+    ports:
+      - "10302:10300"
+      - "10802:10800"
+
+configs:
+  node_config:
+    content: |
+      ignite {
+        network {
+          port: 3344
+          nodeFinder.netClusterNodes = ["node1:3344", "node2:3344", 
"node3:3344"]
+        }
+      }
+----
+
+=== Starting and Initializing the Cluster
+
+1. Start the cluster:
++
+[source, bash]
+----
+docker compose up -d
+----
++
+2. Run the Ignite CLI and initialize the cluster:
++
+[source, bash]
+----
+docker run --rm -it --network=host -e LANG=C.UTF-8 -e LC_ALL=C.UTF-8 
apacheignite/ignite:3.0.0 cli
+----
+3. Inside the CLI, confirm the connection to the default node.
+4. Initialize the cluster:
++
+[source, bash]
+----
+cluster init --name=ignite3 --metastorage-group=node1,node2,node3
+----
++
+5. Enter the SQL mode:
++
+[source, bash]
+----
+sql
+----
++
+6. Create a sample table and insert data:
++
+[source, bash]
+----
+CREATE TABLE Person (id INT PRIMARY KEY, name VARCHAR);
+INSERT INTO Person (id, name) VALUES (1, 'John');
+----
++
+7. Exit the SQL mode and CLI tool:
++
+[source, bash]
+----
+exit;
+exit
+----
+
+== Setting Up Your Java Project
+
+=== Create a Maven Project
+
+First, create a simple Maven project. Below is the example of the project we 
will be using:
+
+```
+ignite3-java-demo/
+├── pom.xml
+└── src/
+    └── main/
+        └── java/
+            └── com/
+                └── example/
+                    └── Main.java
+```
+
+=== Configure Maven Dependencies
+
+Include the Ignite client dependency in your `pom.xml` file:
+
+[source, xml, subs="attributes,specialchars"]
+----
+<dependencies>
+    <!-- Ignite 3 Client -->
+    <dependency>
+        <groupId>org.apache.ignite</groupId>
+        <artifactId>ignite-client</artifactId>
+        <version>3.0.0</version>
+    </dependency>
+</dependencies>
+----
+
+== Building Your Java Application
+
+Now, let's create a Java application that connects to our Ignite cluster and 
performs various data operations.
+
+=== Main Application Class
+
+Create a `Main.java` file with the following code:
+
+TIP: See the structure example above for the expected file location. This 
examples contains the full class file.
+
+[source, java]
+----
+package com.example;
+
+import org.apache.ignite.catalog.ColumnType;
+import org.apache.ignite.catalog.definitions.ColumnDefinition;
+import org.apache.ignite.catalog.definitions.TableDefinition;
+import org.apache.ignite.client.IgniteClient;
+import org.apache.ignite.table.KeyValueView;
+import org.apache.ignite.table.RecordView;
+import org.apache.ignite.table.Table;
+import org.apache.ignite.table.Tuple;
+
+/**
+ * This example demonstrates connecting to an Ignite 3 cluster
+ * and working with data using different table view patterns.
+ */
+public class Main {
+    public static void main(String[] args) {
+        // Create an array of connection addresses for fault tolerance
+        String[] addresses = {
+                "localhost:10800",
+                "localhost:10801",
+                "localhost:10802"
+        };
+
+        // Connect to the Ignite cluster using the client builder pattern
+        try (IgniteClient client = IgniteClient.builder()
+                .addresses(addresses)
+                .build()) {
+
+            System.out.println("Connected to the cluster: " + 
client.connections());
+
+            // Demonstrate querying existing data using SQL API
+            queryExistingTable(client);
+
+            // Create a new table using Java API
+            Table table = createTable(client);
+
+            // Demonstrate different ways to interact with tables
+            populateTableWithDifferentViews(table);
+
+            // Query the new table using SQL API
+            queryNewTable(client);
+        }
+    }
+
+    /**
+     * Queries the pre-created Person table using SQL
+     */
+    private static void queryExistingTable(IgniteClient client) {
+        System.out.println("\n--- Querying Person table ---");
+        client.sql().execute(null, "SELECT * FROM Person")
+                .forEachRemaining(row -> System.out.println("Person: " + 
row.stringValue("name")));
+    }
+
+    /**
+     * Creates a new table using the Java API
+     */
+    private static Table createTable(IgniteClient client) {
+        System.out.println("\n--- Creating Person2 table ---");
+        return client.catalog().createTable(
+                TableDefinition.builder("Person2")
+                        .ifNotExists()
+                        .columns(
+                                ColumnDefinition.column("ID", 
ColumnType.INT32),
+                                ColumnDefinition.column("NAME", 
ColumnType.VARCHAR))
+                        .primaryKey("ID")
+                        .build());
+    }
+
+    /**
+     * Demonstrates different ways to interact with tables
+     */
+    private static void populateTableWithDifferentViews(Table table) {
+        System.out.println("\n--- Populating Person2 table using different 
views ---");
+
+        // 1. Using RecordView with Tuples
+        RecordView<Tuple> recordView = table.recordView();
+        recordView.upsert(null, Tuple.create().set("id", 2).set("name", 
"Jane"));
+        System.out.println("Added record using RecordView with Tuple");
+
+        // 2. Using RecordView with POJOs
+        RecordView<Person> pojoView = table.recordView(Person.class);
+        pojoView.upsert(null, new Person(3, "Jack"));
+        System.out.println("Added record using RecordView with POJO");
+
+        // 3. Using KeyValueView with Tuples
+        KeyValueView<Tuple, Tuple> keyValueView = table.keyValueView();
+        keyValueView.put(null, Tuple.create().set("id", 4), 
Tuple.create().set("name", "Jill"));
+        System.out.println("Added record using KeyValueView with Tuples");
+
+        // 4. Using KeyValueView with Native Types
+        KeyValueView<Integer, String> keyValuePojoView = 
table.keyValueView(Integer.class, String.class);
+        keyValuePojoView.put(null, 5, "Joe");
+        System.out.println("Added record using KeyValueView with Native 
Types");
+    }
+
+    /**
+     * Queries the newly created Person2 table using SQL
+     */
+    private static void queryNewTable(IgniteClient client) {
+        System.out.println("\n--- Querying Person2 table ---");
+        client.sql().execute(null, "SELECT * FROM Person2")
+                .forEachRemaining(row -> System.out.println("Person2: " + 
row.stringValue("name")));
+    }
+
+    /**
+     * POJO class representing a Person
+     */
+    public static class Person {
+        // Default constructor required for serialization
+        public Person() { }
+
+        public Person(Integer id, String name) {
+            this.id = id;
+            this.name = name;
+        }
+
+        Integer id;
+        String name;
+    }
+}
+----
+
+== Running the Application
+
+To run your application:
+
+1. Make sure your Ignite cluster is up and running;
+2. Compile and run your Java application:
+
+[source, bash]
+----
+mvn compile exec:java -Dexec.mainClass="com.example.Main"
+----
+
+== Expected Output
+
+You should see output similar to this:
+
+[source, text]
+----
+Connected to the cluster: Connections{active=1, total=1}
+
+--- Querying Person table ---
+Person: John
+
+--- Creating Person2 table ---
+
+--- Populating Person2 table using different views ---
+Added record using RecordView with Tuple
+Added record using RecordView with POJO
+Added record using KeyValueView with Tuples
+Added record using KeyValueView with Native Types
+
+--- Querying Person2 table ---
+Person2: Jane
+Person2: Jack
+Person2: Jill
+Person2: Joe
+----
+
+== Understanding Table Views in Ignite 3
+
+Ignite 3 provides multiple view patterns for interacting with tables on top of 
providing a robust SQL API. Examples below showcase how you can work with 
Ignite tables from your project without SQL. For examples of working with SQL, 
see the link:get-started/explore-sql[Getting Started with SQL] tutorial.
+
+=== RecordView Pattern
+
+RecordView treats tables as a collection of records, perfect for operations 
that work with entire rows:
+
+[source, java]
+----
+// Get RecordView for Tuple objects (schema-less)
+RecordView<Tuple> recordView = table.recordView();
+recordView.upsert(null, Tuple.create().set("id", 2).set("name", "Jane"));
+
+// Get RecordView for mapped POJO objects (type-safe)
+RecordView<Person> pojoView = table.recordView(Person.class);
+pojoView.upsert(null, new Person(3, "Jack"));
+----
+
+=== KeyValueView Pattern
+
+KeyValueView treats tables as a key-value store, ideal for simple lookups:
+
+[source, java]
+----
+// Get KeyValueView for Tuple objects
+KeyValueView<Tuple, Tuple> keyValueView = table.keyValueView();
+keyValueView.put(null, Tuple.create().set("id", 4), Tuple.create().set("name", 
"Jill"));
+
+// Get KeyValueView for native Java types
+KeyValueView<Integer, String> keyValuePojoView = 
table.keyValueView(Integer.class, String.class);
+keyValuePojoView.put(null, 5, "Joe");
+----
+
+== Cleaning Up
+
+To stop your cluster when you are done:
+
+[source, bash]
+----
+docker compose down
+----
+
+== Troubleshooting
+
+If you encounter connection issues:
+
+* Verify your Docker containers are running with `docker compose ps` command;
+* Check if the exposed ports match those in your client configuration;
+* Ensure that the `localhost` interface can access the Docker container 
network.
+
+== Next Steps
+
+Now that you've explored the basics of connecting to Ignite and interacting 
with data:
+
+* Try implementing transactions;
+* Experiment with more complex schemas and data types;
+* Explore data partitioning strategies;
+* Investigate distributed computing capabilities.
\ No newline at end of file

Reply via email to