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 func(boolean condition, 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: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
例:查询saleOrder数据集的数据,代码如下:
DbrestWrapper<?> wrapper = (DbrestWrapper<?>)new DbrestWrapper<String>("order", "main", "saleOrder");
List<SaleOrder> list = DbrestUtil.selectAll(wrapper, SaleOrder.class);
- 查询分页数据,返回Page
public static \
例:一页取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 \
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 \
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
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
例:获取查询请求响应头中的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();