前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java项目实践,如何获取自定义sql里的表名及关键字段

Java项目实践,如何获取自定义sql里的表名及关键字段

作者头像
用户1289394
发布2020-12-08 15:02:15
1.5K0
发布2020-12-08 15:02:15
举报
文章被收录于专栏:Java学习网Java学习网

思路

用开源的druid解析 sql 语句。

druid 是阿里开源在github 上面的数据库连接池,里面有一个专门解析 sql 语句的模块。

支持的数据库类型:

理论上说,支持所有有jdbc驱动的数据库。

实际测试过的有mysql(大规模使用)、oracle(大规模使用)、sqlserver、postgres、db2、h2、derby、sqlite、sybase。

druid 使用说明:

druid 现在已经直接发布到了 maven 仓库中,可以直接引用。

1、新建一个 maven 工程名为 TestSqlParser

2、在 pom.xml 文件中加入如下配置,当前最新使用 1.2.3

代码语言:javascript
复制
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>1.2.3</version>
</dependency>

3、代码实例,以oracle为例:

代码语言:javascript
复制
import com.alibaba.druid.sql.SQLUtils;
import com.alibaba.druid.sql.ast.SQLStatement;
import com.alibaba.druid.sql.dialect.oracle.visitor.OracleSchemaStatVisitor;
import com.alibaba.druid.util.JdbcConstants;

import java.util.List;

public class TestSqlParser {


    public static void main(String[] args) {

        // String sql = "update t set name = 'x' where id < 100 limit 10";
        // String sql = "SELECT ID, NAME, AGE FROM USER WHERE ID = ? limit 2";
        // String sql = "select * from tablename limit 10";

        String sql = "select user,abc from emp_table order by c1 asc,c2 desc";
        String dbType = JdbcConstants.ORACLE;

        //格式化输出
        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);
            OracleSchemaStatVisitor visitor = new OracleSchemaStatVisitor();
            stmt.accept(visitor);
            //获取表名称
//            System.out.println("Tables : " + visitor.getCurrentTable());
            //获取操作方法名称,依赖于表名称
            System.out.println("Manipulation : " + visitor.getTables());
            //获取字段名称
            System.out.println("fields : " + visitor.getColumns());
            //获取排序名称
            System.out.println("getOrderByColumns : " + visitor.getOrderByColumns());
            //获取分组
            System.out.println("getGroupByColumns : " + visitor.getGroupByColumns());
        }

    }
}

我是一名码龄10年的程序员,在这里会分享实在干货,让你少走弯路,成就精彩人生。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-11-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Java学习网 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档