怎样才能通过一个接口,完成对数据库中的所有表的查询,并以restfulApi的形式将数据返回给调用者,不知道这么做有没有意义。今天在SCDN发布了一个提问,也没有找到我想要答案。
以下是我的思考及实现:
1,首先获取库中的所有表
2,对API接口的参数进行规范化
如:/query/by/[表名]?pageSize=2&pageNum=1&nameLike=小
3,缓存某个表的所有字段,并加对应的后缀
如:name字段添加Like后缀,当请求参数中携带该参数时,执行模糊查询,如果name后缀为Eq则执行等于的查询,其他的查询方式依次进行自定义即可
4,获取请求参数,并比对参数是否在缓存的列表中,如果存在,拼接where条件sql语句
5,拼接主查询sql语句
6,执行sql查询,并返回数据
// 查询方法,QueryBean 为查询对象
private PageData query(QueryBean queryBean, Map<String, String> reqMap, boolean isPage) {
StringBuffer sb = new StringBuffer();
// 拼接主查询sql
sb.append(getMainSql(queryBean, dbAccount));
List<Object> params = new ArrayList<>();
// 拼接条件sql
String whereSql = createWhereSql(params, whereCache.get(queryBean.getQuerId()), reqMap);
if (whereSql.length() > 0) {
sb.append(" where ").append(whereSql);
}
PageData pageData = new PageData();
if (isPage) {
// 查询总条数
pageData.setSumTotal(toInt(sumTotal(sb.toString(), dbAccount, params), 0));
// 拼接排序sql
addOrderBy(sb, queryBean);
// 拼接分页sql
String limitSql = limitSql(pageData, sb.toString(), params, reqMap);
// 查询数据
pageData.setResultData(DbUtils.queryHump(limitSql, dbAccount, params));
} else {
addOrderBy(sb, queryBean);
pageData.setResultData(DbUtils.queryHump(sb.toString(), dbAccount, params));
}
if (!reqMap.containsKey("noResultDataColRemark"))
pageData.setResultDataColRemark(tableColDesMap.get(queryBean.getQuerId()));
return pageData;
}
QueryBean对应的json,该json为关联表查询
{
"leftJoinTable": [
{
"alias": "ui",
"tableName": "USER_INFO",
"mainColName": "client_no",
"currentColName": "client_no"
}
],
"mainTableName": {
"alias": "lm",
"tableName": "LOAN_MSG",
"orderBys": [
{
"colName": "create_time",
"isAsc": true,
"sort": 0
}
]
},
"querId": "loanAndUserInfo",
"remark": "查询贷款表,并关联用户表"
}
按此设想,即可实现通过API请求的方式查询所有表
请求路径为:
/query/by/loanAndUserInfo?pageSize=10&pageNum=1&nameLike=小明
/query/by/loanAndUserInfo?pageSize=10&pageNum=1&nameEq=小明
/query/by/loanAndUserInfo?pageSize=10&pageNum=1&nameGt=小明
{
"pageNum":1,
"pageSize":10,
"sumTotal": 100,
"resultData":[
{
"name":"小明"
........
}
]
}
如果是单表查询,可不适用json配置
纯属没事儿干乱想的,但是如果真的这么干,好像确实可用免去重复写查询的烦恼,欢迎来吐槽!!!!