【Harmony】鸿蒙数据库工具封装ZDbUtil

介绍

ZDbUtil是一款数据库操作工具库

  • 通过注解类和字段,与数据库的表进行关联
  • 支持状态管理(V1)中被@Observed装饰的类
  • 支持状态管理(V2)中被@ObservedV2装饰的类
  • 支持存放复杂类型的数据,通过 json 格式进行存储

链接

源码

示例

效果图

数据库操作2

下载安装

在每个har/hsp模块中,通过ohpm工具下载安装库:

ohpm install @hzw/zdb

注解

Table

表名为类名。

Id

  • 参数
    • primaryKey: 是否主键
    • autoIncrement: 是否自增

Column

  • 参数:
    • type: 列类型,查看ColumnType
      • Integer: 整型
      • Text: 文本类型
      • Boolean: 布尔类型
      • Real: 浮点类型
    • notNull: 是否为空
    • unique: 是否唯一

OneToOne

  • 参数:
    • joinTable: 关联表的类
    • relatedIdProperty: 关联id属性名

ObjToJson

  • 参数:
    • cls: 复杂对象的类信息

使用方法

定义实体类

只要添加了@Table注解,@Id注解,@Column注解
在初始化数据库时,会自动创建表,并添加列。

import { Column, ColumnType, Id, ObjToJson, OneToOne, Table } from '@hzw/zdb';

// 作业本
export class StudentHomeworkBook {
  // 书本名
  name?: string
}

// 父亲
export class StudentFather {
  // 名字
  name?: string
  // 父亲
  @ObjToJson({ cls: StudentFather })
  father?: StudentFather | undefined
}

// 分类
@Table()
export class StudentClassify {
  // id
  @Id({ primaryKey: true, autoIncrement: true })
  @Column({ type: ColumnType.Integer })
  id?: number
  // 名称
  @Column({ type: ColumnType.Text })
  name?: string
  // 创建时间
  @Column({ type: ColumnType.Integer })
  createTime?: number
  // 更新时间
  @Column({ type: ColumnType.Integer })
  editTime?: number | undefined
}

// 学生
@Table()
export class StudentInfo {
  // id
  @Id({ primaryKey: true, autoIncrement: true })
  @Column({ type: ColumnType.Integer })
  id?: number | undefined
  // 标题
  @Column({ type: ColumnType.Text })
  title?: string | undefined
  // 创建时间
  @Column({ type: ColumnType.Integer })
  createTime?: number | undefined
  // 成绩
  @Column({ type: ColumnType.Real })
  score?: number | undefined
  // 是否管理员
  @Column({ type: ColumnType.Boolean })
  isManager?: boolean | undefined
  // 分类id
  @Column({ type: ColumnType.Integer })
  classifyId?: number | undefined
  // 分类
  @OneToOne({ joinTable: StudentClassify, relatedIdProperty: "classifyId" })
  classify?: StudentClassify | undefined
  // 名下作业本
  @ObjToJson({ cls: StudentHomeworkBook })
  homeworkBookList?: StudentHomeworkBook[] | undefined
  // 父亲
  @ObjToJson({ cls: StudentFather })
  father?: StudentFather | undefined
}

初始化数据库并根据被@Table注解的类创建表

ZDbUtil.initDatabase({
  context: this.context
})

创建表

如果类不被@Table注解,则需要手动

// 定义表的数据结构
const student: StudentInfo2 = {
  "id": 0,
  "title": "",
  "createTime": 0,
  "isManager": false,
  "classifyId": 0,
  "score": 0.0,
  "homeworkBookList": [],
  "father": {
    "name": "",
    "father": {
      "name": "",
    }
  }
}
// 创建表
// 第一个参数是表的数据结构
// 第二个参数是表名
// 第三个参数是id名
ZDbUtil.initTableByName(student, "Student", "id").then(() => {
  promptAction.showToast({ message: "创建成功" });
})

查数据

如果查询的数据类型有被@Table注解,则通过这种方式查询数据

ZDbUtil.querySqlBuilder<StudentClassify>(StudentClassify)
  .limitAs(this.pageSize)
  .offsetAs(this.page * this.pageSize)
    // ...
  .query()
  .then((data) => {
  })

否则通过这种方式查询数据

// 定义表的数据结构
const student: StudentInfo2 = {
  "id": 0,
  "title": "",
  "createTime": 0,
  "isManager": false,
  "classifyId": 0,
  "score": 99.9,
  "homeworkBookList": [],
  "father": {}
}
// 定义关联表的数据结构
const classify: StudentClassify2 = {
  "id": 0,
  "name": "",
  "createTime": 0,
  "editTime": 0,
}
// 查询表
// 第一个参数是表的数据结构
// 第二个参数是表名
// 第三个参数是id名
ZDbUtil.querySqlObjBuilder(student, "Student", "id")
  // 关联表
  // 第一个参数是关联表的数据结构
  // 第二个参数是关联表的表名
  // 第三个参数是关联表的id名
  // 第四个参数是与关联表关联的id字段名
  // 第五个参数是存放关联表数据的字段名
  .initJoinTableInfo(classify, "Classify", "id", "classifyId", "classify")
  .limitAs(this.pageSize)
  .offsetAs(this.page * this.pageSize)
  .query()
  .then((data) => {
    this.list = data;
  })

插入数据

data类型确定,且被@Table注解,直接插入数据

ZDbUtil.insertOrReplace(data).then(() => {
  promptAction.showToast({ message: "添加成功" });
})

data类型是Object,通过传入被@Table注解的类,插入数据

// 插入数据
// 第一个参数为插入的数据
// 第二个参数为被@Table注解的类,数据将会被插入到与注解类关联的表中
ZDbUtil.insertOrReplaceByCls(data, StudentClassify).then(() => {
  promptAction.showToast({ message: "添加成功" });
})

data类型是Object,通过传入表名插入数据

// 插入数据到数据库
// 第一个参数是插入的数据
// 第二个参数是表名
ZDbUtil.insertOrReplaceByName(data, "Student").then(() => {
  promptAction.showToast({ message: "添加成功" });
  this.loadData()
})

批量插入数据

data类型确定,且被@Table注解,直接插入数据

ZDbUtil.batchInsert(data).then(() => {
  promptAction.showToast({ message: "添加成功" });
})

data类型是Object,通过传入被@Table注解的类,插入数据

// 批量插入数据
// 第一个参数为插入的数据
// 第二个参数为被@Table注解的类,数据将会被插入到与注解类关联的表中
ZDbUtil.batchInsertByCls(data, StudentClassify).then(() => {
  promptAction.showToast({ message: "添加成功" });
})

data类型是Object,通过传入表名插入数据

// 批量插入数据到数据库
// 第一个参数是插入的数据
// 第二个参数是表名
ZDbUtil.batchInsertByName(data, "Student").then(() => {
  promptAction.showToast({ message: "添加成功" });
  this.loadData()
})

删除数据

data类型确定,且被@Table注解,直接删除数据

ZDbUtil.delete(item).then(() => {
  promptAction.showToast({ message: "删除成功" });
})

data类型是Object,通过传入被@Table注解的类,删除数据

ZDbUtil.deleteByCls(data, StudentInfo).then(() => {
  promptAction.showToast({ message: "删除成功" });
})

直接通过传入表名,id名,id的值删除数据

// 第一个参数是表名
// 第二个参数是id名
// 第三个参数是id的值
ZDbUtil.deleteByName("Student", "id", item.id).then(() => {
  promptAction.showToast({ message: "删除成功" });
  this.loadData()
})

清空数据

根据被@Table注解的类,清空与之关联的表的所有数据

ZDbUtil.clear(StudentInfo).then(() => {
  promptAction.showToast({ message: "清空成功" });
})

根据表名,清空该表的所有数据

ZDbUtil.clearByName("Classify").then(() => {
  promptAction.showToast({ message: "清空成功" });
  this.selectClassify = undefined
  this.loadClassify()
  this.loadData()
})

联系我们

欢迎大家提交issue、PR(可以统一收集问题,方便更多人查阅,会第一时间回复处理) ,或进群交流(+v: _hhbin)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值