Skip to content

用Java代码创建表

1.概述

虽然 DDL语句支持完整的表操作命令,但也可以使用简单的 Java API 直接从 POJO 创建表和构建索引。该 API 支持自定义注解和简单构建器,它与 Mapper 接口一起,方便了键值视图和记录视图的使用。

Java API 可以执行以下操作:

  • CREATE ZONE
  • CREATE TABLE
  • CREATE INDEX
  • DROP ZONE
  • DROP TABLE
  • DROP INDEX

可以使用位于org.apache.ignite.catalog.annotations包中的@Table以及其他的注解。

2.示例

2.1.兼容键值视图的KV POJO

下面的示例从Java代码创建了一个名为kv_pojo的表:

java
class ZoneTest {}

class PojoKey {
    @Id
    Integer id;

    @Id(sort = DESC)
    @Column(value = "id_str", length = 20)
    String idStr;
}

@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(value = "f_name"),
                    @ColumnRef(value = "l_name") })
    }
)
class PojoValue {
    @Column("f_name")
    String firstName;

    @Column("l_name")
    String lastName;

    String str;
}

Table myTable = ignite.catalog().create(PojoKey.class, PojoValue.class);

ignite.tables().table(myTable).keyValueView(PojoKey.class, PojoValue.class);

提示

需要使用命令行工具在节点配置中创建存储配置。

结果等价于以下多个 SQL 语句:

sql
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);

2.2.兼容记录视图的单个POJO

下面的示例使用与记录视图兼容的 POJO 创建pojo_sample表:

java
@Table(
    value = "pojo_sample",
    zone = zone = @Zone(
		value = "zone_test",
		replicas = 2,
		storageProfiles = "default"
   ),
    colocateBy = { @ColumnRef("id"), @ColumnRef("id_str") },
    indexes = { @Index(value = "ix_sample", columns = {
                      @ColumnRef(value = "f_name"),
                      @ColumnRef(value = "l_name")}
    }
)
class Pojo {
    @Id
    Integer id;

    @Id(sort = DESC)
    @Column(value = "id_str", length = 20)
    String idStr;

    @Column("f_name")
    String firstName;

    @Column("l_name")
    String lastName;

    String str;
}

Table myTable = ignite.catalog().create(Pojo.class);

ignite.tables().table(myTable).recordView(Pojo.class)

2.3.@Table注解的Builder替代方案

下面的示例使用构建器创建表:

提示

使用构建器时,仅支持字段上的@Id注解和@Column注解。

java
class Pojo {
    @Id
    Integer id;

    @Id(sort = DESC)
    @Column(value = "id_str", length = 20)
    String idStr;

    @Column("f_name")
    String firstName;

    @Column("l_name")
    String lastName;

    String str;
}

ignite.catalog()
  .create(ZoneDefinition.builder("zone_test")
    .partitions(2))
  .execute();

ignite.catalog()
  .create(TableDefinition.builder("pojo_test")
    .ifNotExists()
  	.colocateBy("id", "id_str")
  	.zone("zone_test")
    .record(Pojo.class) // .key(Key.class).value(Value.class)
    .build())

3.下一步

使用 Java API 创建表后,就可以使用 SQL 命令对其进行操作。

18624049226