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