近来使用笔者研发的框架中,有一处功能颇为棘手。
由于框架内部监控功能中,需存储当前操作用户主键功能。
然,获取用户主键的模块中,需根据“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;
}
复制代码
因框架内部已封装具体实现代码,故而此处只需具体实现最终逻辑功能。
最后,来验证一下具体的效果吧。