数据库构造器之查询构造器构建

近来使用笔者研发的框架中,有一处功能颇为棘手。

由于框架内部监控功能中,需存储当前操作用户主键功能。

然,获取用户主键的模块中,需根据“loginToken”获取“账号主键”。

此逻辑简之,当根据“loginToken”获取到缓存的主键时,即无问题,然非者,需调用sql请求,由于sql请求内部涉及监控,继而也许获取主键,此时便会遁入了死循环。

故而,笔者在数据库执行器中,加入了“是否记录日志”的变量。然,此请求内部有代码内嵌之,烦不胜数,最终,笔者放弃此途。

忽而想起,此前规划的“QueryBuilder”模块还未开发,故,欲完善之。

“QueryBuilder”见字如面,即为“查询构造器”,是针对于数据库操作的快速查询构建类。

因此前已构造基础构建类,故而大量代码不用开发,只需实现具体的业务功能。

以此往下,将具体实现功能。

其一:创建查询构造类,并继承基础的构建类,并实现对应的泛型。

public class QueryBuilder extends SqlBuilder<QueryBuilder, Object> {
    
    public static QueryBuilder builder() {
        return new QueryBuilder();
    }
    
    private QueryBuilder() {
        super();
    }
}
复制代码

观其父类,找此类执行函数,可看出,当需执行自定义请求,需重写“executeSql”函数。

其二:重写“executeSql”函数,实现具体逻辑。

    @Override
    protected Object executeSql() throws Exception {
        String executeSql = getBuilderSql(SqlType.SELECT_SQL);
        if (StringUtils.isEmpty(executeSql) && tableInfo != null) {
            // 初始化值集合
            List<Object> values = ArrayUtils.newArrayList();
            StringBuffer querySql = new StringBuffer(DataBaseKeyWord.SELECT.getKeyWord()).append(" ");
            // 构造类sql生成工具类
            SqlBuilderGenerateUtil sqlGenerateUtil = builderGenerateUtil();
            // 当不为仅查询总数时,处理列脚本
            if (!isQueryCount) {
                // 获取列SQL
                String columnSql = sqlGenerateUtil.getColumnSql("");
                if (StringUtils.isEmpty(columnSql)) {
                    return null;
                }
                querySql.append(columnSql);
            } else {
                querySql.append(" ").append(SqlFuncType.COUNT).append("(0) ");
            }
            // 拼接表相关脚本
            querySql.append(DataBaseKeyWord.FROM.getKeyWord()).append(tableInfo.getTableName());
            if (StringUtils.isNotEmpty(tableInfo.getAliasName())) {
                querySql.append(DataBaseKeyWord.AS.getKeyWord()).append(tableInfo.getAliasName()).append(" ");
            }
            // 拼接关联相关脚本
            toJoinSql(querySql, values);
            // 动态添加where语句
            StringBuffer whereSql = new StringBuffer();
            sqlGenerateUtil.appendWhereSql(whereSql, values);
            // 动态拼接sql
            if (StringUtils.isNotEmpty(whereSql)) {
                querySql.append(DataBaseKeyWord.WHERE.getKeyWord()).append(whereSql);
            }
            // 拼接聚合 和 排序脚本
            String groupBySQL = sqlGenerateUtil.getGroupBySQL("", getGroupByInfos());
            if (StringUtils.isNotEmpty(groupBySQL)) {
                querySql.append(DataBaseKeyWord.GROUP_BY.getKeyWord()).append(groupBySQL);
            }
            String orderBySQL = sqlGenerateUtil.getOrderBySQL("", getOrderByInfos());
            if (StringUtils.isNotEmpty(orderBySQL)) {
                querySql.append(DataBaseKeyWord.ORDER_BY.getKeyWord()).append(orderBySQL);
            }
            if (isQueryCount) {
                return sqlExecutor.count(querySql.toString(), values.toArray());
            }
            // 单列查询直接调用执行器 查询单条函数
            if (isSingleSelect) {
                return sqlExecutor.queryOne(querySql.toString(), resultClass, values.toArray());
            } else {
                String queryPagingSql;
                // 构建分页查询脚本
                if (page != null && number != null) {
                    queryPagingSql = SqlParseUtil.getQueryPagingSql(sqlExecutor, querySql, page, number);
                } else {
                    queryPagingSql = querySql.toString();
                }
                return sqlExecutor.query(queryPagingSql, resultClass, values.toArray());
            }

        }
        return null;
    }
复制代码

因框架内部已封装具体实现代码,故而此处只需具体实现最终逻辑功能。

最后,来验证一下具体的效果吧。

由于不能上传视频,跳转观看实现效果

猜你喜欢

转载自juejin.im/post/7110853747512885256