2.3.3 JS SDK

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

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

使用前先添加引用

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

2.3.2.1 DbrestWrapper的构造方法

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

  • constructor(className, pageModel)
    • className是要访问的数据模型
    • pageModel是组件所在页面的模型
    • 如果是跨服务访问,需要调用setServiceName设置服务名
  • 例:要访问主服务main下的订单主表orderm的数据

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

2.3.2.2 DbrestWrapper的查询方法

方法名 含义 代码 案例
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);
      }
    

2.3.2.3 过滤条件操作符

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

操作符 含义 代码 案例
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);
      }
    

2.3.2.4 DbrestWrapper的排序方法

方法名 含义 代码 案例
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);
      }
    

2.3.2.5 DbrestWrapper的分组统计

方法名 含义 代码 案例
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);
      }
    

2.3.2.6 DbrestWrapper的关联查询

方法 含义 代码 案例
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);
      }
    

2.3.2.7 DbrestWrapper的子查询

方法 含义 代码 案例
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);
      }
    

2.3.2.8 DbrestWrapper的去重查询

方法 含义 代码 案例
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);
      }
    

2.3.2.9 DbrestWrapper的统计方法

方法 含义 代码 案例
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);
      }
    

2.3.2.10 DbrestWrapper的插入、更新、删除方法

  • insert(data)
    • 插入记录
  • upsert(data)
    • 插入或更新记录
  • deleteByCondition()
    • 根据条件删除记录
  • delete(data)

    • 根据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);        
      }
    

2.3.2.11 DbrestWrapper的其它方法

方法名 含义 代码 案例
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);
      }
    

2.3.2.12 在Dbrest组件中使用DbrestFilter

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

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

    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 ""

    results matching ""

      No results matching ""