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