直接跳到内容

数据库数据源

介绍

数据库数据源模块(database)提供本地数据库能力,基于 IBest-ORM 实现。它定义实体、数据源接口与实现,通过 repository 对外提供数据访问能力。

实体定义示例

文件位置:foundation/database/src/main/ets/entity/DemoEntity.ets

ts
import { Column, ColumnType, CreatedAt, PrimaryKey, Table, UpdatedAt } from "@ibestservices/ibest-orm";

/**
 * @file Demo 表实体定义
 */
@Table({ name: "demo_items" })
export class DemoEntity {
  /**
   * 主键 ID
   */
  @PrimaryKey({ autoIncrement: true })
  id?: number;

  /**
   * 标题
   */
  @Column({ type: ColumnType.TEXT })
  title?: string;

  /**
   * 描述
   */
  @Column({ type: ColumnType.TEXT })
  description?: string;

  /**
   * 创建时间
   */
  @CreatedAt()
  createdAt?: string;

  /**
   * 更新时间
   */
  @UpdatedAt()
  updatedAt?: string;
}

数据源接口示例

文件位置:foundation/database/src/main/ets/datasource/demo/DemoLocalDataSource.ets

ts
import { DemoEntity } from "../../entity/DemoEntity";

/**
 * @file Demo 数据源接口
 */
export interface DemoLocalDataSource {
  /**
   * 新增记录
   */
  createItem(title: string, description?: string): Promise<number>;

  /**
   * 更新记录
   */
  updateItem(entity: DemoEntity): Promise<void>;

  /**
   * 删除记录
   */
  deleteById(id: number): Promise<void>;

  /**
   * 清空表
   */
  clearAll(): Promise<number>;

  /**
   * 查询全部
   */
  getAllItems(): Promise<DemoEntity[]>;

  /**
   * 根据 ID 查询
   */
  getItemById(id: number): Promise<DemoEntity | undefined>;
}

数据源实现示例

文件位置:foundation/database/src/main/ets/datasource/demo/DemoLocalDataSourceImpl.ets

ts
import { getORM } from "@ibestservices/ibest-orm";
import { DemoEntity } from "../../entity/DemoEntity";
import { DemoLocalDataSource } from "./DemoLocalDataSource";

/**
 * @file Demo 数据源实现
 */
export class DemoLocalDataSourceImpl implements DemoLocalDataSource {
  private static migrated: boolean = false;
  private orm = getORM();

  constructor() {
    this.ensureMigrated();
  }

  private ensureMigrated(): void {
    if (!DemoLocalDataSourceImpl.migrated) {
      this.orm.migrate(DemoEntity);
      DemoLocalDataSourceImpl.migrated = true;
    }
  }

  async createItem(title: string, description: string = ""): Promise<number> {
    const entity = new DemoEntity();
    entity.title = title;
    entity.description = description;
    return this.orm.insert(entity);
  }

  async updateItem(entity: DemoEntity): Promise<void> {
    this.orm.save(entity);
  }

  async deleteById(id: number): Promise<void> {
    this.orm.deleteById(DemoEntity, id);
  }

  async clearAll(): Promise<number> {
    return this.orm.query(DemoEntity).delete();
  }

  async getAllItems(): Promise<DemoEntity[]> {
    return this.orm.query(DemoEntity).find();
  }

  async getItemById(id: number): Promise<DemoEntity | undefined> {
    const result = this.orm.query(DemoEntity).where("id", id).find();
    return result[0];
  }
}

如何新增数据表

  1. foundation/database/src/main/ets/entity/ 下新增实体类。
  2. 使用 @Table@Column@PrimaryKey 等装饰器定义表结构。
  3. datasource/ 下新增数据源接口与实现。
  4. Index.ets 中导出实体和数据源。
  5. 在 repository 中使用该数据源。

IBest-ORM 文档

详细数据库使用请参考官方文档:https://ibest-orm.ibestservices.com/

注意事项

  • 数据库模块不直接给业务层使用,业务通过 repository 访问。
  • 首次使用实体前需要调用 orm.migrate() 完成建表。
  • 数据源接口与实现分离,便于测试和替换。