2.3.2 java SDK

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

  • com.justep.tools.mybatis.DbrestWrapper:用于生成查询的过滤条件,完全基于MyBatis-Plus的QueryWrapper,并扩展了关联查询和子查询的部分。与QueryWrapper不同的是,它不支持实体类
  • com.justep.tools.mybatis.DbrestUtil:用于查询、插入、更新、删除数据
  • com.justep.tools.mybatis.DbrestResult:返回结果

使用前先添加依赖设置

引入系统工具类

组名称 名称 版本号
com.justep tools 1.0.0

2.3.2.1 QueryWrapper的方法

  • 支持的查询方法
方法名 含义 代码 案例
select 设置查询字段 select(String... sqlSelect) 例: select("id", "name", "age")
groupBy 分组:GROUP BY 字段, ... groupBy(R... columns)
groupBy(boolean condition, R... columns)
例: groupBy("id", "name")--->group by id,name
orderByAsc 排序:ORDER BY 字段, ... ASC orderByAsc(R... columns)
orderByAsc(boolean condition, R... columns)
例: orderByAsc("id", "name")--->order by id ASC,name ASC
orderByDesc 排序:ORDER BY 字段, ... DESC orderByDesc(R... columns)
orderByDesc(boolean condition, R... columns)
例: orderByDesc("id", "name")--->order by id DESC,name DESC
orderBy 排序:ORDER BY 字段, ... orderBy(boolean condition, boolean isAsc, R... columns) 例: orderBy(true, true, "id", "name")--->order by id ASC,name ASC
having HAVING ( sql语句 ) having(String sqlHaving, Object... params)
having(boolean condition, String sqlHaving, Object... params)
例: having("sum(age) > 10")--->having sum(age) > 10
例: having("sum(age) > {0}", 11)--->having sum(age) > 11
  • 支持的条件操作符
操作符 含义 代码 案例
eq 等于 = eq(R column, Object val)
eq(boolean condition, R column, Object val)
例: eq("name", "老王")--->name = '老王'
ne 不等于 <> ne(R column, Object val)
ne(boolean condition, R column, Object val)
例: ne("name", "老王")--->name <> '老王'
gt 大于 > gt(R column, Object val)
gt(boolean condition, R column, Object val)
例: gt("age", 18)--->age > 18
ge 大于等于 >= ge(R column, Object val)
ge(boolean condition, R column, Object val)
例: ge("age", 18)--->age >= 18
lt 小于 < lt(R column, Object val)
lt(boolean condition, R column, Object val)
例: lt("age", 18)--->age < 18
le 小于等于 <= le(R column, Object val)
le(boolean condition, R column, Object val)
例: le("age", 18)--->age <= 18
like LIKE '%值%' like(R column, Object val)
like(boolean condition, R column, Object val)
例: like("name", "王")--->name like '%王%'
notLike NOT LIKE '%值%' notLike(R column, Object val)
notLike(boolean condition, R column, Object val)
例: notLike("name", "王")--->name not like '%王%'
likeLeft LIKE '%值' likeLeft(R column, Object val)
likeLeft(boolean condition, R column, Object val)
例: likeLeft("name", "王")--->name like '%王'
likeRight LIKE '值%' likeRight(R column, Object val)
likeRight(boolean condition, R column, Object val)
例: likeRight("name", "王")--->name like '王%'
between BETWEEN 值1 AND 值2 between(R column, Object val1, Object val2)
between(boolean condition, R column, Object val1, Object val2)
例: between("age", 18, 30)--->age between 18 and 30
notBetween NOT BETWEEN 值1 AND 值2 notBetween(R column, Object val1, Object val2)
notBetween(boolean condition, R column, Object val1, Object val2)
例: notBetween("age", 18, 30)--->age not between 18 and 30
isNull 字段 IS NULL isNull(R column)
isNull(boolean condition, R column)
例: isNull("name")--->name is null
isNotNull 字段 IS NOT NULL isNotNull(R column)
isNotNull(boolean condition, R column)
例: isNotNull("name")--->name is not null
in 字段 IN (value.get(0), value.get(1), ...) in(R column, Collection<?> value)
in(boolean condition, R column, Collection<?> value)
例: in("age",{1,2,3})-->age in (1,2,3)
in 字段 IN (v0, v1, ...) in(R column, Object... values)
in(boolean condition, R column, Object... values)
例: in("age", 1, 2, 3)--->age in (1,2,3)
notIn 字段 NOT IN (value.get(0), value.get(1), ...) notIn(R column, Collection<?> value)
notIn(boolean condition, R column, Collection<?> value)
例: notIn("age",{1,2,3})--->age not in (1,2,3)
notIn 字段 NOT IN (v0, v1, ...) notIn(R column, Object... values)
notIn(boolean condition, R column, Object... values)
例: notIn("age", 1, 2, 3)--->age not in (1,2,3)
inSql 字段 IN ( 不支持sql语句 ) inSql(R column, String inValue)
inSql(boolean condition, R column, String inValue)
例: inSql("age", "1,2,3,4,5,6")--->age in (1,2,3,4,5,6)
notInSql 字段 NOT IN ( 不支持sql语句 ) notInSql(R column, String inValue)
notInSql(boolean condition, R column, String inValue)
例: notInSql("age", "1,2,3,4,5,6")--->age not in (1,2,3,4,5,6)
or 拼接 OR
注意事项:主动调用 or 表示紧接着下一个方法不是用 and 连接(不调用or则默认为使用and连接)
or()
or(boolean condition)
例: eq("id",1).or().eq("name","老王")--->id = 1 or name = '老王'
or OR 嵌套 or(Consumer consumer)
or(boolean condition, Consumer consumer)
例: or(i -> i.eq("name", "李白").ne("status", "活着"))--->or (name = '李白' and status <> '活着')
and AND 嵌套 and(Consumer consumer)
and(boolean condition, Consumer consumer)
例: and(i -> i.eq("name", "李白").ne("status", "活着"))--->and (name = '李白' and status <> '活着')
nested 正常嵌套 不带 AND 或者 OR nested(Consumer consumer)
nested(boolean condition, Consumer consumer)
例: nested(i -> i.eq("name", "李白").ne("status", "活着"))--->(name = '李白' and status <> '活着')

目前不支持的操作符有:func、apply、last、exists、notExists。

操作符 含义 代码 案例
func func 方法(主要方便在出现if...else下调用不同方法能不断链) func(Consumer consumer)
func(boolean condition, Consumer consumer)
例: func(i -> if(true) {i.eq("id", 1)} else {i.ne("id", 1)})

2.3.2.2 DbrestWrapper的方法

DbrestWrapper接口提供与QueryWrapper类似的接口,目的是为用户提供一个易用的访问数据的接口,通过这个接口访问DbRest的数据查询功能

  • 构造方法

DbrestWrapper(final String serviceName, final String moduleName, final String dataModelName) 3个参数分别是:serviceName 服务名、moduleName 模块名、dataModelName 数据模型名

例:查询订单金额大于100,订单编号等于123或22的数据,返回fid。orderDate,orderNo三列,先按orderNo排升序,再按orderDate排降序,代码如下:

    DbrestWrapper<?> wrapper = (DbrestWrapper<?>)new DbrestWrapper<String>("order", "main", "saleOrder");
    wrapper.select("fid", "orderDate", "orderNo");
    wrapper.gt("totalMoney",100);
    wrapper.and(i->i.eq("orderNo","123").or().eq("orderNo","22"));
    wrapper.orderByAsc("orderNo").orderByDesc("orderDate");

例:以订单日期分组,统计订单总金额,代码如下:

    DbrestWrapper<?> wrapper = (DbrestWrapper<?>)new DbrestWrapper<String>("order", "main", "saleOrder");
    wrapper.select("orderDate", "sum(totalMoney)" );
    wrapper.groupBy("orderDate");
  • 为关联查询JOIN增加的方法
方法 含义 代码 案例
setMainTableAlias 设置主表的别名 setMainTableAlias(String alias) 例: setMainTableAlias("A")
setLeftAliasUsed 设置使用的左表 setLeftAliasUsed(String alias) 例: setLeftAliasUsed("B")
leftJoin 左连接 leftJoin(String dataModelName) 例: leftJoin("customer")
rightJoin 右连接 rightJoin(String dataModelName) 例: rightJoin("customer")
innerJoin 内连接 innerJoin(String dataModelName) 例: innerJoin("customer")
fullJoin 全连接 fullJoin(String dataModelName) 例: fullJoin("customer")
alias 设置右表的别名 alias(String alias) 例: alias("B")
on 关联条件
注意事项:on上的表达方式只能使用Dbrest的格式
left_table_field.op.right_table_field
op 可用的值与QueryWrapper中可用的条件操作相同
on(String filter) 例: on("fid.eq.fid")--->left.fid = right.fid
例: on("fid.eq.fid").on("name.lt.name")--->left.fid = right.fid and left.name例: on("id.eq.id:or.name.eq.name")--->left.id = right.id or left.name = right.name
例: on("id.eq.id:or(:name.eq.name:age.lt.age:)")--->left.id = right.id or (left.name=right.name and left.age<right.age)

例:通过销售订单的客户id列左关联客户的id列,查询出客户名称列,代码如下:

    DbrestWrapper<?> wrapper = (DbrestWrapper<?>)new DbrestWrapper<String>("order", "main", "saleOrder");
    wrapper.select("fid", "orderDate", "orderNo", "name");
    wrapper.setMainTableAlias("A");
    wrapper.leftJoin("customer").alias("B").on("customId.eq.id");

例:通过销售订单的客户id列左关联客户的id列,再通过客户的项目id列左关联项目的id列,查询出客户名称、项目名称列,代码如下:

    DbrestWrapper<?> wrapper = (DbrestWrapper<?>)new DbrestWrapper<String>("order", "main", "saleOrder");
    wrapper.select("fid", "orderDate", "orderNo", "name", "projectName");
    wrapper.setMainTableAlias("A");
    wrapper.leftJoin("customer").alias("B").on("customId.eq.id");
    wrapper.leftJoin("project").alias("C").on("projectId.eq.id");

例:通过orgs的org_id列左关联authorize的subject_id列,再通过authorize的role_id列左关联role的id列,代码如下:

DbrestWrapper<?> wrapper = (DbrestWrapper<?>) new DbrestWrapper("entry","uaa","orgs");
wrapper.select("A.fid as fid","A.code as code","A.name as name","C.code as rolecode","C.name as rolename");
wrapper.setMainTableAlias("A");
wrapper.leftJoin("comp/authorize/authorize").alias("B").on("org_id.eq.subject_id");
wrapper.setLeftAliasUsed("B");
wrapper.leftJoin("comp/authorize/role").alias("C").on("role_id.eq.id");

例:通过main服务模块中info的code列左关联oa服务模块中basedata的no列,代码如下:

DbrestWrapper<?> wrapper = (DbrestWrapper<?>) new DbrestWrapper("vuedemo","main","info");
wrapper.select("A.fid as fid","A.title as title","A.content as content","A.person as person","B.name as typename");
wrapper.setMainTableAlias("A");
wrapper.leftJoin("oa/basedata").alias("B").on("code.eq.no");
  • 为子查询subquery增加的方法和常量
方法 含义 代码 案例
addSubQueryWrapper 添加子查询 addSubQueryWrapper(String subQueryName,DbrestWrapper wrapper) 例:addSubQueryWrapper("subquery1", subquery1)
SubQueryPrefix 常量 DbrestWrapper.SubQueryPrefix="$subquery:" 例:DbrestWrapper.SubQueryPrefix

例:使用一个子查询,查询订单明细中包括办公桌的订单,代码如下:

    DbrestWrapper<?> wrapper = (DbrestWrapper<?>)new DbrestWrapper<String>("order", "main", "saleOrder");
    DbrestWrapper<?> subquery0 = new DbrestWrapper<String>("order", "main", "saleOrderDetail");
    subquery0.select("saleOrder");
    subquery0.eq("product","办公桌");
    wrapper.in("fid", DbrestWrapper.SubQueryPrefix + "subquery0");
    wrapper.addSubQueryWrapper("subquery0", subquery0);

例:使用两个子查询,查询订单明细中包括办公桌的,且客户类型为vip的订单,代码如下:

    DbrestWrapper<?> wrapper = (DbrestWrapper<?>)new DbrestWrapper<String>("order", "main", "saleOrder");
    DbrestWrapper<?> subquery0 = new DbrestWrapper<String>("order", "main", "saleOrderDetail");
    subquery0.select("saleOrder");
    subquery0.eq("product","办公桌");
    wrapper.in("fid", DbrestWrapper.SubQueryPrefix + "subquery0");
    wrapper.addSubQueryWrapper("subquery0", subquery0);

    DbrestWrapper<?> subquery1 = new DbrestWrapper<String>("order", "main", "customer");
    subquery1.select("id");
    subquery1.eq("customType","vip");
    wrapper.in("customId", DbrestWrapper.SubQueryPrefix + "subquery1");
    wrapper.addSubQueryWrapper("subquery1", subquery1);

2.3.2.3 DbrestUtil的方法

DbrestUtil类,为用户提供查询数据、插入/更新数据、删除数据的方法。

  • 查询全部数据,返回List

public static List selectAll(final DbrestWrapper queryWrapper, final Class entityType);

例:查询saleOrder数据集的数据,代码如下:

    DbrestWrapper<?> wrapper = (DbrestWrapper<?>)new DbrestWrapper<String>("order", "main", "saleOrder");
    List<SaleOrder> list = DbrestUtil.selectAll(wrapper, SaleOrder.class);
  • 查询分页数据,返回Page

public static \ Page\ selectPage(final DbrestWrapper queryWrapper, final Class\ entityType, final PageRequest pageRequest);

例:一页取20条记录,查询第一页的数据,代码如下:

import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageImpl;
import org.springframework.data.domain.PageRequest;

public Page<SaleOrder> selectPage() throws Exception {
    DbrestWrapper<?> wrapper = (DbrestWrapper<?>)new DbrestWrapper<String>("order", "main", "saleOrder");
    com.justep.cloud.data.PageRequest pageRequest = new com.justep.cloud.data.PageRequest(0, 20);
    com.justep.cloud.data.Page<SaleOrder> page = DbrestUtil.selectPage( wrapper, SaleOrder.class, pageRequest);
    return new PageImpl<>(page.getContent(), new PageRequest(0, 20), page.getTotal());
}
  • 查询数据,返回DbrestResult

public static DbrestResult get(final DbrestWrapper queryWrapper, final PageRequest pageRequest);

例:查询saleOrder数据集的数据,代码如下:

    DbrestWrapper<?> wrapper = (DbrestWrapper<?>)new DbrestWrapper<String>("order", "main", "saleOrder");
    DbrestResult ret = DbrestUtil.get(wrapper, null);
  • 查询附件流

public static Stream getStream(final DbrestWrapper queryWrapper);

例:获取订单编号22的附件(列标识:files)中的第一个文件的文件流,代码如下:

    DbrestWrapper<?> wrapper = (DbrestWrapper<?>)new DbrestWrapper<String>("order", "main", "saleOrder");
    wrapper.stream("attachment", "0");
    DbrestUtil.getStream(wrapper);
  • 插入/更新数据

public static \ DbrestResult upsert(final String serviceName, final String moduleName, final String dataModelName, final List\ data);

public static DbrestResult upsert(final String serviceName, final String moduleName, final String dataModelName, final JSONArray data);

例:给saleOrder插入新数据,代码如下:

    SaleOrder so = new SaleOrder();
    so.setFid("java1");
    so.setOrderNo("java2");

    List<SaleOrder> soList = new ArrayList<SaleOrder>();
    soList.add(so);
    DbrestResult ret = DbrestUtil.upsert("order", "main", "saleOrder", soList);
  • 删除数据

public static \ DbrestResult delete(final String serviceName, final String moduleName, final String dataModelName, final List\ data);

public static DbrestResult delete(final String serviceName, final String moduleName, final String dataModelName, final JSONArray data);

public static DbrestResult deleteByCondition(final String serviceName, final String moduleName, final String dataModelName, final String dbrestCondition)

例:删除saleOrder中fid等于5的数据,代码如下:

    DbrestResult ret = DbrestUtil.deleteByCondition("order", "main", "saleOrder","fid=eq.5");
  • 支持传入headers

上面的方法都支持最后加一个参数Map headers,用于传入请求头。例如:不校验数据权限

Map<String, String> headers = new HashMap<String,String>();
headers.put("X-DbProxy-DisableSqlPermissions", "true");
DbrestUtil.selectAll(wrapper, SaleOrder.class, headers);

2.3.2.4 DbrestResult的方法

  • 获取执行结果,返回字符串

public String getResult();

例: 获取查询结果数据,并转为String,代码如下:

    DbrestResult ret = DbrestUtil.get(wrapper, null);
    return ret.getResult();
  • 获取响应头

public Map> getResponseHeaders();

例:获取查询请求响应头中的Content-Range的值,代码如下:

    DbrestResult ret = DbrestUtil.get(wrapper, null);
    return ret.getResponseHeaders().get("Content-Range").get(0);
  • 将执行结果转为JSONObject

public JSONObject toJson();

例:将查询请求结果转为JSON对象,代码如下:

    DbrestResult ret = DbrestUtil.get(wrapper, null);
    JSONObject json = ret.toJson();

results matching ""

    No results matching ""

    results matching ""

      No results matching ""