Apache Calcite版本:1.30.0
概述:上篇已经详细介绍Apache Calcite的概念,这块就不在多做介绍了,直接看实现代码
package com.joe.common.util;
import com.google.common.collect.ImmutableList;
import org.apache.calcite.avatica.util.Casing;
import org.apache.calcite.avatica.util.Quoting;
import org.apache.calcite.avatica.util.TimeUnitRange;
import org.apache.calcite.config.Lex;
import org.apache.calcite.rel.type.RelDataType;
import org.apache.calcite.sql.*;
import org.apache.calcite.sql.SqlDialect.DatabaseProduct;
import org.apache.calcite.sql.dialect.MysqlSqlDialect;
import org.apache.calcite.sql.dialect.OracleSqlDialect;
import org.apache.calcite.sql.fun.SqlFloorFunction;
import org.apache.calcite.sql.fun.SqlLibraryOperators;
import org.apache.calcite.sql.fun.SqlStdOperatorTable;
import org.apache.calcite.sql.parser.SqlParseException;
import org.apache.calcite.sql.parser.SqlParser;
import org.apache.calcite.sql.parser.SqlParserPos;
import org.apache.calcite.sql.validate.SqlConformanceEnum;
import org.apache.commons.lang.StringUtils;
import org.checkerframework.checker.nullness.qual.Nullable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.atomic.AtomicReference;
import java.util.stream.Collectors;
/**
* @Description: sql语法解析工具类
*/
public class CalciteSqlUtils {
private static SqlParser.Config mysqlConfig = SqlParser.configBuilder()
.setLex(Lex.MYSQL)
.setCaseSensitive(false)//大小写敏感
.setQuoting(Quoting.BACK_TICK)
.setQuotedCasing(Casing.TO_LOWER)
.setUnquotedCasing(Casing.TO_LOWER)
.setConformance(SqlConformanceEnum.MYSQL_5)
.build();
private static SqlParser.Config oralceConfig = SqlParser.configBuilder()
.setLex(Lex.ORACLE)
.setCaseSensitive(false)//大小写敏感
.setQuoting(Quoting.BACK_TICK)
.setQuotedCasing(Casing.TO_LOWER)
.setUnquotedCasing(Casing.TO_LOWER)
.setConformance(SqlConformanceEnum.ORACLE_12)
.build();
private static SqlParser.Config sqlserverConfig = SqlParser.configBuilder()
.setLex(Lex.SQL_SERVER)
.setCaseSensitive(false)//大小写敏感
.setQuoting(Quoting.BACK_TICK)
.setQuotedCasing(Casing.TO_LOWER)
.setUnquotedCasing(Casing.TO_LOWER)
.setConformance(SqlConformanceEnum.SQL_SERVER_2008)
.build();
public static List<Map<String,String>> mapList = new ArrayList<>();
public static void main(String[] args) {
String sql = "select id,name from t_user where id='${id}' and name='zhangsan'";
String sql2 = "select\n" +
" aa.TOTAL_MONEY,\n" +
" aa.DRUG_MONEY,\n" +
" aa.BASE_DRUG_MONEY,\n" +
" bb.CAL_DATE,\n" +
" bb.CAL_MONTH,\n" +
" bb.CAL_YEAR,\n" +
" cc.OFFICE_NAME,\n" +
" cc.CUSTOM_CODE\n" +
"FROM\n" +
" F_DRUG_USE aa,\n" +
" T_DATES bb,\n" +
" T_OFFICE_PROPERTY cc\n" +
"where\n" +
" aa.date_id = bb.id\n" +
" and aa.BILLING_OFFICE_ID = cc.id\n" +
" and (select cal_year from bb) in ('${year_cond}')\n" +
" and bb.cal_year BETWEEN '${yeardes.get(0)}' and '${yeardes.get(1)}'\n" +
" and office_name like '${office_name_cond}'";
try {
List<Map<String, String>> list = handlerSqlTableAlias(DatabaseProduct.ORACLE, sql2);
//打印
System.out.println("$$$$$$$$$$$$$打印别名sql$$$$$$$$$$$$$");
list.forEach(System.out::println);
//替换sql参数
String rt = handlerSqlParameterSubstitution(DatabaseProduct.ORACLE,sql2, "year_cond");
System.out.println("$$$$$$$$$$$$$打印参数sql$$$$$$$$$$$$$");
System.out.println(rt);
} catch (Exception e) {
throw new RuntimeException("", e);
}
}
/**
* sql参数替换
* @param type 数据库类型
* @param sql sql
* @param param 替换参数名称
* @return
* @throws SqlParseException
*/
public static String handlerSqlParameterSubstitution(DatabaseProduct type,String sql,String param) throws SqlParseException {
//加载配置信息
SqlParser sqlParser = null;
switch (type){
case ORACLE:
sqlParser = SqlParser.create(sql, oralceConfig)

本文介绍了一个基于Apache Calcite的SQL解析工具类,能够处理多种数据库类型的SQL语法,支持参数替换及表别名提取等功能。
最低0.47元/天 解锁文章
269

被折叠的 条评论
为什么被折叠?



