jsqlparser解析sql获取表名,字段等

这篇具有很好参考价值的文章主要介绍了jsqlparser解析sql获取表名,字段等。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

场景

在项目中需要多sql进行统一拦截处理,但是传入的sql千奇百怪,并有一些逻辑判断,如只对哪张表处理之类,因此需要对sql进行解析后,进行相关逻辑处理。

这里使用 jsqlparser 工具进行sql解析。

代码实现

  • maven组件引入
        <dependency>
            <groupId>com.github.jsqlparser</groupId>
            <artifactId>jsqlparser</artifactId>
            <version>1.4</version>
        </dependency>
  • 使用方式

        String sql = "SELECT u.id,u.NAME,o.d,a.money FROM USER u,ORDERs o LEFT JOIN account a ON a.id=u.uid WHERE u.id=o.uid GROUP BY u.id,u.NAME ORDER BY u.id"
        Statement statement = null;
        try {
            statement =  CCJSqlParserUtil.parse(sql);
        } catch (JSQLParserException e) {
            e.printStackTrace();
        }
        // 获取table
        TablesNamesFinder tablesNamesFinder = new TablesNamesFinder();
        List<String> tableList = tablesNamesFinder.getTableList(statement);
        log.info("tableList:{}", JSON.toJSONString(tableList));

        // 获取 join中的table
        Select selectStatement = (Select) statement;
        PlainSelect plain = (PlainSelect) selectStatement.getSelectBody();
        List<Join> joinList = plain.getJoins();
        List<String> tablewithjoin = new ArrayList<>();
        if (joinList != null) {
            for (int i = 0; i < joinList.size(); i++) {
                tablewithjoin.add(joinList.get(i).toString());
            }
        }
        log.info("tablewithjoin:{}", JSON.toJSONString(tablewithjoin));

        // 获取 where条件
        Expression where_expression = plain.getWhere();
        String whereStr = where_expression.toString();
        log.info("whereStr:{}", whereStr);

        // 获取group by
        List<Expression> GroupByColumnReferences = plain
                .getGroupByColumnReferences();
        List<String> groupBys = new ArrayList<>();
        if (GroupByColumnReferences != null) {
            for (int i = 0; i < GroupByColumnReferences.size(); i++) {
                groupBys.add(GroupByColumnReferences.get(i).toString());
            }
        }

        log.info("str_groupby:{}",  JSON.toJSONString(groupBys));

        // 获取order by
        List<OrderByElement> OrderByElements = plain.getOrderByElements();
        List<String> orderBys = new ArrayList<>();
        if (OrderByElements != null) {
            for (int i = 0; i < OrderByElements.size(); i++) {
                orderBys.add(OrderByElements.get(i).toString());
            }
        }
        log.info("str_orderby:{}", JSON.toJSONString(orderBys));

输出结果:文章来源地址https://www.toymoban.com/news/detail-578873.html

tableList:["user","orders","account"]
tablewithjoin:["ORDERs o","account a ON a.id=u.uid"]
whereStr:u.id = o.uid
str_groupby:["u.id","u.name"]
str_orderby:["u.id"]

到了这里,关于jsqlparser解析sql获取表名,字段等的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 查看Oracle_表名、字段名、注释、进程及杀进程等常用语句

    -- 查看ORACLE 数据库中本用户下的所有表 SELECT table_name FROM user_tables; -- 查看ORACLE 数据库中所有用户下的所有表 select user,table_name from all_tables; -- 查看ORACLE 数据库中本用户下的所有列 select table_name,column_name from user_tab_columns; -- 查看ORACLE 数据库中本用户下的所有列 select user,tabl

    2024年02月09日
    浏览(33)
  • 使用Java根据表名导出与导入Sql

    前言 很粗糙啊,有很多可以优化的地方,而且也不安全,但是临时用还是OK的,我这个是公司里面的单机软件,不联网。 嗨!我是一名社交媒体增长黑客,很高兴能帮助您优化和丰富关于批量作业导出和导入的文章。这个主题相当技术性,但我会将其分解为易于理解的部分。

    2024年02月13日
    浏览(24)
  • 数据备份文件生成--根据表名生成对应的sql语句文件

    最近客户有个需求,希望在后台增加手动备份功能,将数据导出下载保存。 当然,此方法不适用于海量数据的备份,这只适用于少量数据的sql备份。 这是我生成的sql文件,以及sql文件里的insert语句,已亲测,可以直接执行: 项目是SSM框架,接下来就展示我的实现代码: 首先

    2024年02月07日
    浏览(28)
  • Mybatis-plus解析sql发生异常:net.sf.jsqlparser.JSQLParserException

    问题描述 在使用mybatis-plus的过程中,有一个jsonb字段使用了jsonb_exists_any (field_name, text[])作为where条件查询,执行sql如下: SELECT * FROM table_name  WHERE  jsonb_exists_any (field_name, ARRAY[\\\'110544709344\\\', \\\'12564892357\\\']) 上面的sql在navicat中执行正常,所以sql没有问题,但是在mybatis-plus的xml文件

    2024年02月02日
    浏览(27)
  • mybatis-plus技巧--动态表名-多语句-拼接sql--关于mybatis的mysql分页查询总数的优化思考

    传入tableName参数就可以了,不过只能用$不能用# 因为#会发生预编译,然后会在表名上加引号’\\\'。 新建一个表名拦截类实现TableNameHandler mybatisPlus添加插件 实例: 每天按统计 如果表名为count则加上今天的时间 每次设置 直接设置名字,然后就会改变的。 需要在配置文件中的

    2024年01月16日
    浏览(36)
  • java list获取某个字段

    在 Java 中,可以使用 for 循环遍历 List,并在循环中使用 getter 方法获取对应字段的值。也可以使用 Java 8 中的 Stream API 和 Lambda 表达式筛选获取某个字段。 如果你想要获取每个元素的某个字段,可以使用stream().map()和collect() 例如: List people = ...; List names = people.stream().map(perso

    2024年02月12日
    浏览(42)
  • sql语句两个字段合并或者两个字段拼接显示

    mysql 使用 concat函数 小栗子: sql server 连接字段,直接使用 + 号,和java字符串拼接一样 小栗子: oracle 数据库 可以使用 || ,也可以使用 concat函数 小栗子: ACCESS数据库连接字段,使用 + 号,他与sql server 一样的 小栗子:

    2024年02月11日
    浏览(34)
  • sql 语句 字段字符串操作

    substring_index() 函数 字符串截取 参考大神博客 replace() 字符串替换 ROUND() 函数 保留多少位小数 参考大神博客 locate() 函数 判断某个字段属性值是否包含某个字符串 concat() 函数 字段属性值连接 case when then else 参考大神博客

    2024年02月13日
    浏览(28)
  • mysql表添加字段sql语句

    使用ALTER TABLE向MySQL数据库的表中添加字段 语法规则 语句内容: table_name :表名; column_name:需要添加的字段名; VARCHAR(100):字段类型为varchar,长度100; DEFAULT NULL:默认值NULL; AFTER old_column:新增字段添加在old_column字段后面,不写会默认表尾部; 例子:

    2024年02月10日
    浏览(34)
  • SQL语句学习笔记(对库、表、字段、的操作)

    查看mysql的状态 status 启动、停止 mySQL服务 图像界面方法: dos窗口执行:services.msc 控制面板–管理工具–服务 命令行方法: 启动: net start mysql80 停止: net stop mysql80 添加环境变量: 在path编辑:添加路径:C:Program FilesMySQLMySQL Server 8.0bin cmd登录:mysql -h localhost -u root -p 输

    2024年02月02日
    浏览(25)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包