2021-05-06 java 解析sql语句中所有的表名称

本文介绍了如何在Java中利用Druid库解析SQL语句,以获取其中涉及的所有表名称。通过添加Maven依赖并编写测试代码,可以有效地提取出SQL中的表名。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

java 解析sql语句中所有的表名称

maven依赖

<!-- https://mvnrepository.com/artifact/com.alibaba/druid -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>1.2.3</version>
</dependency>
 

测试代码

/**
 * @author chongmengzhao
 * @version 0.1
 * @date 2021/5/6 10:00
 * @Description TODO
 */

import com.alibaba.druid.DbType;
import com.alibaba.druid.sql.SQLUtils;
import com.alibaba.druid.sql.ast.SQLStatement;
import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlSchemaStatVisitor;
import com.alibaba.druid.util.JdbcConstants;

import java.util.List;

/**
 * 基于Druid的sql解析功能,获取表名
 */
public class DruidUtil {

    public static void main(String[] args) {
        String sql = "select * from Outvisit l\n" +
                "left join patient p on l.patid=p.patientid\n" +
                "join patstatic c on   l.patid=c.patid inner join patphone  ph  on l.patid=ph.patid\n" +
                "where l.name='kevin' and exsits(select 1 from pharmacywestpas p where p.outvisitid=l.outvisitid)\n" +
                "union all\n" +
                "select * from invisit v ";
        DbType dbType = JdbcConstants.MYSQL;

        //格式化输出
        String result = SQLUtils.format(sql, dbType);
        System.out.println(result); // 缺省大写格式
        List<SQLStatement> stmtList = SQLUtils.parseStatements(sql, dbType);

        //解析出的独立语句的个数
        System.out.println("size is:" + stmtList.size());
        for (int i = 0; i < stmtList.size(); i++) {
            SQLStatement stmt = stmtList.get(i);
            MySqlSchemaStatVisitor visitor = new MySqlSchemaStatVisitor();
            stmt.accept(visitor);
            //获取表名称
            System.out.println("Tables : " + visitor.getTables());
        }
    }
}

测试结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值