【数据库学习】java数据库开发:sql解析之jsqlparser

1,概念

1) SQL 解析器

用于处理 SQL 查询语句的解析和分析。
场景:

  1. 数据库客户端开发,解析用户输入的sql语法并执行。
  2. 自定义sql解析和执行逻辑。
    标准的数据库接口(如 JDBC)无法完全满足需求时,自定义执行逻辑,以实现更复杂的功能。
  3. 实现数据库查询优化器
  4. 自定义SQL 分析工具
    对大量的 SQL 查询进行分析,以了解查询的模式、性能瓶颈等
  5. 实现 SQL 注入检测工具
    解析用户输入的 SQL 查询,并检测其中是否包含潜在的注入漏洞。

2,jsqlparser

sql解析库,收费:官网
将 SQL 语句解析为 Java 对象表示形式,使得可以轻松地对 SQL 进行分析、修改和生成。JSqlParser 支持多种 SQL 方言,包括 ANSI SQL、MySQL、Oracle 等。

1)使用

        <!-- sql解析 工具 jsqlparser -->
        <dependency>
            <groupId>com.github.jsqlparser</groupId>
            <artifactId>jsqlparser</artifactId>
            <version>4.4</version>
        </dependency>
// SQL解析
// 解析为Statement的具体实现:Selete Update Delete,可以通过 if(statement instanceof Select)判断;
Statement statement = CCJSqlParserUtil.parse(sql);
Select select = (Select) statement;
//select 的field获取
List<String> selectList = new ArrayList<>();
//order获取
final String[] order = {""};
//分页获取
final String[] page = {""};
select.getSelectBody().accept(new SelectVisitorAdapter(){
			//此处有多个实现方法;
			//PlainSelect是单个简单的select查询语句,可以包含SELECT、FROM、WHERE、GROUP BY、HAVING、ORDER BY、JOIN;
			//ValuesStatement 表示值数组,表示 INSERT, REPLACE 或 MERGE语句;
			//SetOperationList 表示多个查询结果集之间的合并操作,包括: UNION(并集)、INTERSECT(交集)和EXCEPT(差集)。另外常规的PlainSelect中如果先limit再order by,会被识别为SetOperationList
			//WithItem 包含WITH子句、带有别名(alias)子查询
            @Override
            public void visit(PlainSelect plainSelect) {          
                plainSelect.getSelectItems().forEach(x -> selectList.add(x.toString()));
                //where条件获取
                plainSelect.getWhere().toString();
                //group获取
                plainSelect.getGroupBy().toString()
                order[0] = plainSelect.getOrderByElements().stream().map(x -> x.getExpression().toString() + " " + (x.isAsc() ? "asc" : "desc")).collect(Collectors.joining(","));
                
                String limit = plainSelect.getLimit().getRowCount().toString();
                order[0] += " limit " + limit;
                String offset = plainSelect.getOffset().getOffset().toString();
                order[0] += " offset " + offset;
            }
 });            
// 获取到表名列表
List<String> tableNameList = tablesNamesFinder.getTableList(statement);            

3,druid

<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.21</version>
</dependency>

4,ANTLR(Another Tool for Language Recognition)

语言识别器生成器,可以用于构建解析器和编译器。

5,Apache Calcite

开源的 SQL 解析、优化和查询引擎。可以将 SQL 转换为抽象语法树(AST),从而进行进一步的查询优化和执行计划生成。

6,SQLJocky

主要用于与 MySQL 数据库进行交互。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值