JS SDK

数据引擎提供不跨网络,通过模型访问数据的 JS SDK。为开发者提供易用的访问数据的接口,通过接口访问 DBRest 的数据查询功能、插入/更新及删除功能。

  • DbrestWrapper:提供类似 Jave 端的 DbrestWrapper 访问的接口,可以链式调用,使用方法与 Java 端类似
  • DbrestFilter:DBRest 数据集过滤条件对象

使用前先添加引用

import {DbrestFilter, DbrestWrapper} from "$UI/wxsys/lib/base/dbrest";

构造方法

DbrestWrapper 接口是为用户提供一个易用的访问数据的接口,通过这个接口访问 DbRest 的查询数据、插入/更新数据、删除数据的方法。

方法:
    constructor(className, pageModel)
描述:
    创建 DbrestWrapper 对象,如果是跨服务访问,需要调用 setServiceName 设置服务名
参数:
    className:要访问的数据模型
    pageModel:组件所在页面的模型

例如:要访问主服务 main 下的订单主表 orderm 的数据,代码如下

  let dbrest = new DbrestWrapper("/main/orderm", this);

查询方法

方法名 含义 代码 案例
selectAll 返回所有满足条件的记录数组 selectAll() 例: dbrest.selectAll()
selectPage 返回所有满足条件的指定范围的记录数组、分页信息和总记录数 selectPage(offset, limit) 例: dbrest.selectPage(0, 10)
selectOne 返回满足条件的第一条记录(不是数组) selectOne() 例: dbrest.selectOne()

例:查询订单主表orderm的全部数据、第一页10条数据和第一条数据

async onButton1Click(event{
  let dbrest = new DbrestWrapper("/main/orderm", this);
  let data1 = await dbrest.selectAll();
  console.log(data1);
  let data2 = await dbrest.selectPage(0,10);
  console.log(data2);
  let data3 = await dbrest.selectOne();
  console.log(data3);
}

过滤条件操作符

查询数据时,可以设置过滤条件,过滤条件的操作符见下表

操作符 含义 代码 案例
eq 等于 = eq(field, value) 例: eq("name", "老王")--->name = '老王'
neq 不等于 <> neq(field, value) 例: neq("name", "老王")--->name <> '老王'
gt 大于 > gt(field, value) 例: gt("age", 18)--->age > 18
gte 大于等于 >= gte(field, value) 例: gte("age", 18)--->age >= 18
lt 小于 < lt(field, value) 例: lt("age", 18)--->age < 18
lte 小于等于 <= lte(field, value) 例: lte("age", 18)--->age <= 18
like LIKE '%值%' like(field, value) 例: like("name", "王")--->name like '%王%'
notLike NOT LIKE '%值%' notLike(field, value) 例: notLike("name", "王")--->name not like '%王%'
leftlike LIKE '%值' leftLike(field, value) 例: leftLike("name", "王")--->name like '%王'
rightLike LIKE '值%' rightLike(field, value) 例: rightLike("name", "王")--->name like '王%'
in 字段 IN (value.get(0), value.get(1), ...) in(field, value) 例: in("age","1,2,3")-->age in (1,2,3)
notIn 字段 NOT IN (value.get(0), value.get(1), ...) notIn(field, value) 例: notIn("age","1,2,3")--->age not in (1,2,3)
between BETWEEN 值1 AND 值2 between(field, value1, value2) 例: between("age", 18, 30)--->age between 18 and 30
notBetween NOT BETWEEN 值1 AND 值2 notBetween(field, value1, value2) 例: notBetween("age", 18, 30)--->age not between 18 and 30
isNull 字段 IS NULL isNull(field) 例: isNull("name")--->name is null
isNotNull 字段 IS NOT NULL isNotNull(field) 例: isNotNull("name")--->name is not null
or OR 嵌套 or(DbrestFilter) 例: eq("name", "李白").or(new DbrestFilter().neq("status", "活着"))--->name = '李白' or status <> '活着')
and AND 嵌套 and(DbrestFilter) 例: eq("name", "李白").and(new DbrestFilter().neq("status", "活着"))--->name = '李白' and status <> '活着')

例如:查询订单主表 orderm 订单编号 orderNo 等于1的数据

async onButton1Click(event){
  let dbrest = new DbrestWrapper("/main/orderm", this);
  dbrest.eq("orderNo","1");
  let data1 = await dbrest.selectAll();
  console.log(data1);
}

例如:查询订单主表 orderm 订单状态 status 等于已完成且订单金额大于等于150的数据

async onButton1Click(event){
  let dbrest = new DbrestWrapper("/main/orderm", this);
  dbrest.eq("status","已完成").gte("totalMoney",150);
  let data1 = await dbrest.selectAll();
  console.log(data1);
}

例如:查询订单主表 orderm 订单状态 status 等于已完成或订单金额大于等于100的数据

async onButton1Click(event){
  let dbrest = new DbrestWrapper("/main/orderm", this);
  dbrest.eq("status","已完成").or(new DbrestFilter().gte("totalMoney",100));
  let data1 = await dbrest.selectAll();
  console.log(data1);
}

排序方法

方法名 含义 代码 案例
orderByAsc 排升序:ORDER BY 字段 orderByAsc(val) 例: orderByAsc("name")--->order by name ASC
orderByDesc 排降序:ORDER BY 字段 desc orderByDesc(val) 例: orderByDesc("name")--->order by name DESC

例如:查询订单主表 orderm,先按订单状态 status 排升序,再按订单金额 totalMoney 排降序

async onButton1Click(event){
  let dbrest = new DbrestWrapper("/main/orderm", this);
  dbrest.orderByAsc("status").orderByDesc("totalMoney");
  let data1 = await dbrest.selectAll();
  console.log(data1);
}

分组统计

方法名 含义 代码 案例
columns 查询列,以逗号分隔,可以使用 AS 重命名 columns(val) 例: columns("id,name")--->select id,name
groupBy 分组:GROUP BY 字段 groupBy(val) 例: groupBy("name")--->group by name
having 包含:HAVING ( DBRest 过滤表达式 ) having(val) 例: having("sum(money)=gte.100")--->having sum(money) >= 100

例如:查询订单主表 orderm,按订单状态 status 分组,统计订单金额的合计

async onButton1Click(event){
  let dbrest = new DbrestWrapper("/main/orderm", this);
  dbrest.columns("status,sum(totalMoney) as total").groupBy("status");
  let data1 = await dbrest.selectAll();
  console.log(data1);
}

例如:查询订单主表 orderm,按订单状态 status 分组,统计订单金额的合计,取订单金额合计大于100的数据

async onButton1Click(event){
  let dbrest = new DbrestWrapper("/main/orderm", this);
  dbrest.columns("status,sum(totalMoney) as total").groupBy("status").having("sum(totalMoney)=gte.100");
  let data1 = await dbrest.selectAll();
  console.log(data1);
}

关联查询

方法 含义 代码 案例
setMainTableAlias 设置主表的别名 setMainTableAlias(name) 例: setMainTableAlias("A")
leftJoin 左连接 leftJoin(table) 例: leftJoin("customer")
rightJoin 右连接 rightJoin(table) 例: rightJoin("customer")
innerJoin 内连接 innerJoin(table) 例: innerJoin("customer")
fullJoin 全连接 fullJoin(table) 例: fullJoin("customer")
alias 设置右表的别名 alias(alias) 例: alias("B")
setLeftAliasUsed 使用已设置的别名设置左表 setLeftAliasUsed(name) 例: setLeftAliasUsed("B")
on 关联条件 注意事项:on上的表达方式只能使用Dbrest的格式 left_table_field.op.right_table_field left_table_field.op.{{{常量}}}{{{常量}}}.op.right_table_field op 为过滤条件操作符 常量写成{{{常量}}} on(onCondition) 例: on("fid.eq.fid")--->left.fid = right.fid 例: on("fid.eq.fid").on("name.lt.name")--->left.fid = right.fid and left.name<right.name

例如:通过订单主表 orderm 的客户 id 列左关联客户表的 id 列,查询出客户名称列

async onButton1Click(event){
  let dbrest = new DbrestWrapper("/main/orderm", this);
  dbrest.columns("o.*,c.name");
  dbrest.setMainTableAlias("o").leftJoin("customer").alias("c").on("customerId.eq.id");
  let data1 = await dbrest.selectAll();
  console.log(data1);
}

例如:通过订单主表 orderm 的项目 id 列左关联项目表的 id 列,且项目表的状态 status 等于1,查询出项目名称列


async onButton1Click(event){
  let dbrest = new DbrestWrapper("/main/orderm", this);
  dbrest.columns("o.*,p.name").setMainTableAlias("o");
  dbrest.leftJoin("project").alias("p").on("projectId.eq.id").on("{{{1}}}.eq.status");
  let data1 = await dbrest.selectAll();
  console.log(data1);
}

例如:通过订单主表 orderm 的客户 id 列左关联客户表的 id 列,再通过订单主表的项目 id 列左关联项目表的 id 列,查询出客户名称、项目名称列

async onButton1Click(event){
  let dbrest = new DbrestWrapper("/main/orderm", this);
  dbrest.columns("o.*,c.name,p.name").setMainTableAlias("o");
  dbrest.leftJoin("customer").alias("c").on("customerId.eq.id");
  dbrest.leftJoin("project").alias("p").on("projectId.eq.id");
  let data1 = await dbrest.selectAll();
  console.log(data1);
}

例如:通过订单主表 orderm 的客户 id 列左关联客户表的 id 列,再通过客户表的项目 id 列左关联项目表的 id 列,查询出客户名称、项目名称列

async onButton11Click(event){
  let dbrest = new DbrestWrapper("/main/orderm", this);
  dbrest.columns("o.*,c.name,p.name").setMainTableAlias("o");
  dbrest.leftJoin("customer").alias("c").on("customerId.eq.id");
  dbrest.setLeftAliasUsed("c").leftJoin("project").alias("p").on("projectId.eq.id");
  let data1 = await dbrest.selectAll();
  console.log(data1);
}

子查询

方法 含义 代码 案例
addSubQueryWrapper 添加子查询 addSubQueryWrapper(subQueryName, wrapper) 例:addSubQueryWrapper("subquery1", subquery1)
SubQueryPrefix 常量 DbrestWrapper.SubQueryPrefix="$subquery:" 例:DbrestWrapper.SubQueryPrefix

例如:使用子查询,查询订单明细中包括办公桌的订单,其中 dbrestSub.columns("orderm") 指的是订单明细表中的外键列

async onButton1Click(event){
  let dbrest = new DbrestWrapper("/main/orderm", this);
  let dbrestSub = new DbrestWrapper("/main/orderd", this);
  dbrestSub.columns("orderm").eq("product","办公桌");
  dbrest.addSubQueryWrapper("subquery1", dbrestSub);
  dbrest.in("fid", DbrestWrapper.SubQueryPrefix + "subquery1");
  let data1 = await dbrest.selectAll();
  console.log(data1);
}

去重查询

方法 含义 代码 案例
columns 查询列,以逗号分隔,可以使用 AS 重命名 columns(val) 例: columns("id,name")--->select id,name
useDistinct 去重 useDistinct() 例:useDistinct()

例如:使用去重查询,查询订单主表中有哪些订单状态

async onButton8Click(event){
  let dbrest = new DbrestWrapper("/main/orderm", this);
  dbrest.columns("status").useDistinct();
  let data1 = await dbrest.selectAll();
  console.log(data1);
}

统计方法

方法 含义 代码 案例
sumField 计算列合计 sumField(field) 例: sumField("money")--->select sum(money)
countField 计算列行数 countField(field) 例: countField("money")--->select count(money)
avgField 计算列平均值 avgField(field) 例: avgField("money")--->select avg(money)
minField 计算列最小值 minField(field) 例: minField("money")--->select min(money)
maxField 计算列最大值 maxField(field) 例: maxField("money")--->select max(money)

例如:计算订单主表订单金额列的合计以及订单主表的记录数

async onButton9Click(event){
  let dbrest = new DbrestWrapper("/main/orderm", this);
  dbrest.sumField("totalMoney").countField("fid");
  let data1 = await dbrest.selectAll();
  console.log(data1);
}

插入、更新、删除方法

方法 含义 代码
insert 插入记录 insert(data)
upsert 插入或更新记录 upsert(data)
deleteByCondition 根据条件删除记录 deleteByCondition()
delete 根据 data 生成条件删除记录 delete(data)

例如:订单主表 orderm 插入一条记录

async onButton2Click(event){
  let dbrest = new DbrestWrapper("/main/orderm", this);
  let data = await dbrest.insert({"fid":wx.UUID.createUUID(), "orderNo":"123","orderDate": new Date()});
  console.log(data);
}

例如:订单主表 orderm 修改一条记录

async onButton3Click(event){
  let dbrest = new DbrestWrapper("/main/orderm", this);
  let data = await dbrest.upsert([{"fid":"CA10BE6CFDB000011C60DA901F605CC0", "orderNo":"33","orderDate": new Date()}]);
  console.log(data);
}

例如:订单主表 orderm 使用 deleteByCondition 方法删除订单编号 orderNo 等于123的记录

async onButton4Click(event/){
  let dbrest = new DbrestWrapper("/main/orderm", this);
  dbrest.eq("orderNo", "123");
  let data = await dbrest.deleteByCondition();
  console.log(data);
}

例如:订单主表 orderm 使用 delete 方法删除订单编号 orderNo 等于1的记录

async onButton5Click(event){
  let dbrest = new DbrestWrapper("/main/orderm", this);
  dbrest.eq("orderNo", "123");
  let data1 = await dbrest.selectAll()
  console.log(data1);
  let data2 = await dbrest.delete(data1);
  console.log(data2);
}

其它方法

方法名 含义 代码 案例
setServiceName 设置要访问数据所在应用(服务) setServiceName(name) 例: setServiceName("entry")
columns 查询列,以逗号分隔,可以使用 AS 重命名 columns(val) 例: columns("id,name")--->select id,name
getTotal 返回所有满足条件的记录数 getTotal() 例: dbrest.getTotal()
getStartNo 返回起始记录索引 getStartNo() 例: dbrest.getStartNo()
getEndNo 返回结束记录索引 getEndNo() 例: dbrest.getEndNo()

例如:查询企业门户应用 entry 中 uaa 模块下的组织机构 orgs 表

async onButton6Click(event){
  let dbrest = new DbrestWrapper("/uaa/orgs", this);
  dbrest.setServiceName("entry");
  let data1 = await dbrest.selectPage(0,10);
  console.log("total:", dbrest.getTotal());
  console.log(data1);
}

使用 DbrestFilter 构造过滤条件

在数据组件的 setFilter 方法中,可以使用 DbrestFilter 构造过滤条件,支持链式调用,可以使用上面介绍的过滤条件操作符

例如:查询订单主表 orderm 的订单编号 orderNo 等于1的数据

使用 DbrestFilter 的写法如下:

    let data = this.comp("restData0");
    data.setFilter("dbrestFilter", new DbrestFilter().eq("orderNo", "1"));
    data.refreshData();

不使用 DbrestFilter 的写法如下:

    let data = this.comp("restData0");
    data.setFilter("dbrestFilter",[{name:"orderNo",value:"1",op:"eq"}]);
    data.refreshData();

results matching ""

    No results matching ""