有人用过JSqlParser吗

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了有人用过JSqlParser吗相关的知识,希望对你有一定的参考价值。

参考技术A 用过。
jsqlparser的数据结构比较简单,更清晰,因而我选择了一种正向强制设置order by属性为null的方式来去除order by
由于jsqlparser结构简单,继承也不复杂,并且setter和getter方法很全面,所以处理起来很容易。
jsqlparser还能通过方法来编辑某部分的sql,例如增加一个查询列,增加一个表等等。更多的方法可以看wiki和源码。
参考技术B jsqlparser的数据结构比较简单,更清晰,因而选择了一种正向强制设置order by属性为null的方式来去除order by。
public String removeOrderBy(String sql) throws JSQLParserException
Statement stmt = CCJSqlParserUtil.parse(sql);
Select select = (Select) stmt;
SelectBody selectBody = select.getSelectBody();
processSelectBody(selectBody);
return select.toString();


public void processSelectBody(SelectBody selectBody)
if (selectBody instanceof PlainSelect)
processPlainSelect((PlainSelect) selectBody);
else if (selectBody instanceof WithItem)
WithItem withItem = (WithItem) selectBody;
if (withItem.getSelectBody() != null)
processSelectBody(withItem.getSelectBody());

else
SetOperationList operationList = (SetOperationList) selectBody;
if (operationList.getPlainSelects() != null && operationList.getPlainSelects().size() > 0)
List<PlainSelect> plainSelects = operationList.getPlainSelects();
for (PlainSelect plainSelect : plainSelects)
processPlainSelect(plainSelect);


if (!orderByHashParameters(operationList.getOrderByElements()))
operationList.setOrderByElements(null);




public void processPlainSelect(PlainSelect plainSelect)
if (!orderByHashParameters(plainSelect.getOrderByElements()))
plainSelect.setOrderByElements(null);

if (plainSelect.getFromItem() != null)
processFromItem(plainSelect.getFromItem());

if (plainSelect.getJoins() != null && plainSelect.getJoins().size() > 0)
List<Join> joins = plainSelect.getJoins();
for (Join join : joins)
if (join.getRightItem() != null)
processFromItem(join.getRightItem());





public void processFromItem(FromItem fromItem)
if (fromItem instanceof SubJoin)
SubJoin subJoin = (SubJoin) fromItem;
if (subJoin.getJoin() != null)
if (subJoin.getJoin().getRightItem() != null)
processFromItem(subJoin.getJoin().getRightItem());


if (subJoin.getLeft() != null)
processFromItem(subJoin.getLeft());

else if (fromItem instanceof SubSelect)
SubSelect subSelect = (SubSelect) fromItem;
if (subSelect.getSelectBody() != null)
processSelectBody(subSelect.getSelectBody());

else if (fromItem instanceof ValuesList)

else if (fromItem instanceof LateralSubSelect)
LateralSubSelect lateralSubSelect = (LateralSubSelect) fromItem;
if (lateralSubSelect.getSubSelect() != null)
SubSelect subSelect = (SubSelect) (lateralSubSelect.getSubSelect());
if (subSelect.getSelectBody() != null)
processSelectBody(subSelect.getSelectBody());



//Table时不用处理

public boolean orderByHashParameters(List<OrderByElement> orderByElements)
if (orderByElements == null)
return false;

for (OrderByElement orderByElement : orderByElements)
if (orderByElement.toString().toUpperCase().contains("?"))
return true;


return false;

推荐一款编辑SQL的工具:jsqlparser

这个工具真的挺好用的,采用的是观察者模式,Visitor。

虽然我学过这个模式,但是乍一用还是有点懵逼的。

给好一个SQL语句之后,jsqlparser可以把这个sql语句给分解成all kind of parts,然后你可以随心所欲的操作,这个部分。

想怎么玩就怎么玩。

我用的比较多的部分是追加where字句。

之前用过druid的parser和addCondition这个玩意,但是后来没用了druid,而是转用jsqlparser。

现在jsqlparser在github上有,之前是在sourceforge上。

开始没用是看到maven上引用dependency的时候用的人不多。

但是后来因为包冲突的原因就没有用druid了,奶奶的,我代码都写好了,然后转jsqlparser。

不过后来发现在解析sql这方面还是jsqlparser要好些,而且操作性更强。

可能是我学的一般般,没有深入了解druid这方面的功能吧。

还是推荐大家尝试使用jsqlparser。

不过好像修改sql这方面的需求不是很多呀。

有需要的话,我可以后面写一些jsqlparser的demo给大家。

以上是关于有人用过JSqlParser吗的主要内容,如果未能解决你的问题,请参考以下文章

配置jsqlparser(sql语句解析器)

JSQLParser碰到的问题

jsqlparser:基于抽象语法树(AST)遍历SQL语句的语法元素

jsqlparser:实现MySQL 函数DATE_FORMAT到Phoenix函数TO_CHAR的替换

jsqlparser:实现基于SQL语法分析的SQL注入攻击检查

异常-Exception in thread "main" net.sf.jsqlparser.parser.TokenMgrError: Lexical error at lin