Creating Tables from Java Classes
Overview
While SQL DDL supports a comprehensive set of table manipulation commands, you can also create tables and build indexes directly from a POJO using a simple Java API.
This API supports custom annotations and simple builders; it works seamlessly with the Mapper interface, thus facilitating KeyValueView and RecordView.
The Java API lets you perform the following operations:
-
CREATE ZONE
-
CREATE TABLE
-
CREATE INDEX
-
DROP ZONE
-
DROP TABLE
-
DROP INDEX
-
CREATE SCHEMA
-
DROP SCHEMA
Use the @Table and other annotations located in the org.apache.ignite.catalog.annotations package.
Examples
Key-Value POJO Compatible with KeyValueView
The example below creates a table called kv_pojo by using the POJO compatible with KeyValueView:
@Table(value = "kv_pojo",
zone = @Zone(value = "zone_test", replicas = 2, storageProfiles = "default"),
colocateBy = {@ColumnRef("id"), @ColumnRef("id_str")},
indexes = @Index(value = "ix", columns = {@ColumnRef("f_name"), @ColumnRef("l_name")}))
public static class PojoKey {
@Id
Integer id;
@Id(SortOrder.DEFAULT)
@Column(value = "id_str", length = 20)
String idStr;
public PojoKey(Integer id, String idStr) {
this.id = id;
this.idStr = idStr;
}
}
public static class PojoValue {
@Column("f_name")
private String firstName;
@Column("l_name")
private String lastName;
public PojoValue(String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
}
public static void main(String[] args) {
System.out.println("\nConnecting to server...");
try (IgniteClient client = IgniteClient.builder()
.addresses("127.0.0.1:10800")
.build()
) {
org.apache.ignite.table.Table myTable = client.catalog().createTable(PojoKey.class, PojoValue.class);
KeyValueView<PojoKey, PojoValue> kvView = myTable.keyValueView(PojoKey.class, PojoValue.class);
PojoKey key = new PojoKey(1, "sample");
PojoValue putValue = new PojoValue("John", "Smith");
kvView.put(null, key, putValue);
PojoValue getValue = kvView.get(null, key);
System.out.println(
"\nRetrieved values:\n"
+ " Account ID: " + key.id + '\n'
+ " First name: " + getValue.firstName + '\n'
+ " Last name" + getValue.lastName);
}
}
|
Note
|
You need to create a storage profile in node configuration by using the CLI tool. |
The result is equivalent to the following SQL multi-statement:
CREATE ZONE IF NOT EXISTS zone_test WITH PARTITIONS=2, STORAGE_PROFILES='default';
CREATE TABLE IF NOT EXISTS kv_pojo (
id int,
id_str varchar(20),
f_name varchar,
l_name varchar,
str varchar,
PRIMARY KEY (id, id_str)
)
COLOCATE BY (id, id_str)
WITH PRIMARY_ZONE='ZONE';
CREATE INDEX ix (f_name, l_name desc nulls last);
Single POJO Compatible with RecordView
The example below creates the pojo_sample table by using the POJO compatible with RecordView:
@Table(value = "pojo_sample",
zone = @Zone(value = "zone_test", replicas = 2, storageProfiles = "default"),
colocateBy = {@ColumnRef("id"), @ColumnRef("id_str")},
indexes = @Index(value = "ix_sample", columns = {@ColumnRef("f_name"), @ColumnRef("l_name")}))
public static class Pojo {
@Id
Integer id;
@Id(SortOrder.DEFAULT)
@Column(value = "id_str", length = 20)
String idStr;
@Column("f_name")
String firstName;
@Column("l_name")
String lastName;
String str;
}
public static void main(String[] args) {
System.out.println("\nConnecting to server...");
try (IgniteClient client = IgniteClient.builder()
.addresses("127.0.0.1:10800")
.build()
) {
org.apache.ignite.table.Table myTable = client.catalog().createTable(Pojo.class);
RecordView<Tuple> view = myTable.recordView();
Tuple insertTuple = Tuple.create()
.set("id", 1)
.set("id_str", "sample")
.set("f_name", "John")
.set("l_name", "Smith");
view.insert(null, insertTuple);
Tuple getTuple = view.get(null, insertTuple);
System.out.println(
"\nRetrieved record: " +
getTuple.stringValue("f_name")
);
}
}
The Builder Alternative to the @Table Annotation
The example below uses a builder to create a table instead on creating it from a Java class:
|
Note
|
When using builders, only the @Id and @Column annotations on fields are supported.
|
IgniteCatalog catalog = client.catalog();
catalog.createTable(
TableDefinition.builder("sampleTable3")
.primaryKey("myKey")
.columns(
column("myKey", ColumnType.INT32),
column("myValue", ColumnType.VARCHAR)
)
.build()
);
Table myTable = client.tables().table("sampleTable3");
myTable.keyValueView().put(null, Tuple.create().set("myKey", 1), Tuple.create().set("myValue", "John"));
Tuple value = myTable.keyValueView().get(null, Tuple.create().set("myKey", 1));
System.out.println(
"\nRetrieved value:\n" +
value.stringValue("myValue")
);
Next Steps
Once you have created a table using the Java API, you can manipulate it using the SQL commands.
Apache, Apache Ignite, the Apache feather and the Apache Ignite logo are either registered trademarks or trademarks of The Apache Software Foundation.
