JsqlParse学习

        JsqlParse是一款基础工具,通过javaCC这个程序生成sql的语法和词法。作用有两个,1是解析sql到java对象,2是按照允许的规则和层次构建java对象后,将其生成sql。

        之所以说JsqlParse是一款基础工具,是因为它只有解析和生成的功能,没有任何业务或者具体功能。举个例子,比如Select a From myTable where b = 1001 limit 1,10这个sql,它很机械的解析成一个查询java对象,然后这个对象里有查询的字段名,查询的表名,查询的条件,limit的内容,完全不考虑如果这个是oracle分页的话,sql是错误的。同理,如果你构建了一个分页查询对象,如果需要分页,mysql就在自己里面填充limit的内容,是oralce就自己在外层再包裹查询,mysql和oracle的写法是不能转换的。因为JsqlParse根本什么都不知道,只会直译。

        这款工具很基础,对于需要sql解析的功能,这是一个很好的工具,但是功能太基础啦。需要在外层做很多功能性封装,如果有时间,我打算根据目前项目需求做一层封装。目前是不行了,项目时间紧张,另觅他径。

        源码分析,这个工具通篇使用的visitor的设计模式,将所有的功能用visitor模式分簇。比如第一步,语句类型(statement),定义statementVisitor,所有类型添加visit方法。而所有visit都没有实现,默认就是字符串,没有任何业务处理。再比如查询语句主体(selectBody),定义selectBodyVisitor。

        源码分析,JsqlParse内容简单,从包命名看,expression,parser,schema,statement,util加一个Exception的类。parser解析器,schema简单对象类,statement语句分析,expression表达式功能。

        使用只有一句话Statement sqlStmt = CCJSqlParserUtil.parse(new StringReader(sql));解析后就可以对应到具体的类型中分别取各部分内容了。

 

其他内容后续再补充

转载于:https://my.oschina.net/u/3651261/blog/3097863

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
引用\[1\]:在使用sqlparse进行解析时,首先需要获取原始的SQL输入,然后创建解析器对象,使用解析器解析SQL生成具有层次结构的Java类,最后可以通过访问者模式对解析后的SQL对象进行操作和修改。\[1\]引用\[2\]:sqlparse使用Antlr4将SQL语句解析成语法树,生成未绑定的逻辑执行计划。在Spark中,可以使用spark.sqlContext.sql或sparkSession.sql方法执行SQL查询,这些方法会将SQL语句解析成DataFrame。\[2\]引用\[3\]:sqlparseparse包是该组件中最重要的部分,它将SQL解析成一组有血缘关系的对象集合。对于使用者来说,了解如何对解析后的SQL进行修改即可,不需要深入了解语法解析的原理。\[3\] 因此,sqlparse的原理是通过解析器将SQL语句解析成具有层次结构的对象,并提供了操作和修改这些对象的方法。它使用Antlr4进行词法和语法解析,生成未绑定的逻辑执行计划或DataFrame,以便进行后续的数据处理和分析。 #### 引用[.reference_title] - *1* *3* [Sql解析转换之JSqlParse完整介绍](https://blog.csdn.net/Interest1_wyt/article/details/123744612)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [Spark | 解析SparkSQL运行原理之Sql Parse 阶段](https://blog.csdn.net/Sampson_Hugo/article/details/107065741)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值