JAVA - Sql解析工具jsqlparser简单使用

来源:http://blog.csdn.net/isea533/article/details/40375183


前面有一篇博客介绍了另一个fdb-sql-parser的简单使用。由于fdb-sql-parser针对性比较强,对不同数据库的通用性不好,所以尝试了另一个sql解析工具jsqlparser。


在jsqlparser的wiki页面有简单的使用方法:https://github.com/JSQLParser/JSqlParser/wiki


这里仍然用去除order by做例子。  


jsqlparser的数据结构比较简单,更清晰,因而我选择了一种正向强制设置order by属性为null的方式来去除order by  


下面是需要用到的几个方法:  

  1. public String removeOrderBy(String sql) throws JSQLParserException {  
  2.     Statement stmt = CCJSqlParserUtil.parse(sql);  
  3.     Select select = (Select) stmt;  
  4.     SelectBody selectBody = select.getSelectBody();  
  5.     processSelectBody(selectBody);  
  6.     return select.toString();  
  7. }  
  8.   
  9. public void processSelectBody(SelectBody selectBody) {  
  10.     if (selectBody instanceof PlainSelect) {  
  11.         processPlainSelect((PlainSelect) selectBody);  
  12.     } else if (selectBody instanceof WithItem) {  
  13.         WithItem withItem = (WithItem) selectBody;  
  14.         if (withItem.getSelectBody() != null) {  
  15.             processSelectBody(withItem.getSelectBody());  
  16.         }  
  17.     } else {  
  18.         SetOperationList operationList = (SetOperationList) selectBody;  
  19.         if (operationList.getPlainSelects() != null && operationList.getPlainSelects().size() > 0) {  
  20.             List<PlainSelect> plainSelects = operationList.getPlainSelects();  
  21.             for (PlainSelect plainSelect : plainSelects) {  
  22.                 processPlainSelect(plainSelect);  
  23.             }  
  24.         }  
  25.         if (!orderByHashParameters(operationList.getOrderByElements())) {  
  26.             operationList.setOrderByElements(null);  
  27.         }  
  28.     }  
  29. }  
  30.   
  31. public void processPlainSelect(PlainSelect plainSelect) {  
  32.     if (!orderByHashParameters(plainSelect.getOrderByElements())) {  
  33.         plainSelect.setOrderByElements(null);  
  34.     }  
  35.     if (plainSelect.getFromItem() != null) {  
  36.         processFromItem(plainSelect.getFromItem());  
  37.     }  
  38.     if (plainSelect.getJoins() != null && plainSelect.getJoins().size() > 0) {  
  39.         List<Join> joins = plainSelect.getJoins();  
  40.         for (Join join : joins) {  
  41.             if (join.getRightItem() != null) {  
  42.                 processFromItem(join.getRightItem());  
  43.             }  
  44.         }  
  45.     }  
  46. }  
  47.   
  48. public void processFromItem(FromItem fromItem) {  
  49.     if (fromItem instanceof SubJoin) {  
  50.         SubJoin subJoin = (SubJoin) fromItem;  
  51.         if (subJoin.getJoin() != null) {  
  52.             if (subJoin.getJoin().getRightItem() != null) {  
  53.                 processFromItem(subJoin.getJoin().getRightItem());  
  54.             }  
  55.         }  
  56.         if (subJoin.getLeft() != null) {  
  57.             processFromItem(subJoin.getLeft());  
  58.         }  
  59.     } else if (fromItem instanceof SubSelect) {  
  60.         SubSelect subSelect = (SubSelect) fromItem;  
  61.         if (subSelect.getSelectBody() != null) {  
  62.             processSelectBody(subSelect.getSelectBody());  
  63.         }  
  64.     } else if (fromItem instanceof ValuesList) {  
  65.   
  66.     } else if (fromItem instanceof LateralSubSelect) {  
  67.         LateralSubSelect lateralSubSelect = (LateralSubSelect) fromItem;  
  68.         if (lateralSubSelect.getSubSelect() != null) {  
  69.             SubSelect subSelect = (SubSelect) (lateralSubSelect.getSubSelect());  
  70.             if (subSelect.getSelectBody() != null) {  
  71.                 processSelectBody(subSelect.getSelectBody());  
  72.             }  
  73.         }  
  74.     }  
  75.     //Table时不用处理  
  76. }  
  77.   
  78. public boolean orderByHashParameters(List<OrderByElement> orderByElements) {  
  79.     if (orderByElements == null) {  
  80.         return false;  
  81.     }  
  82.     for (OrderByElement orderByElement : orderByElements) {  
  83.         if (orderByElement.toString().toUpperCase().contains("?")) {  
  84.             return true;  
  85.         }  
  86.     }  
  87.     return false;  
  88. }  

由于jsqlparser结构简单,继承也不复杂,并且setter和getter方法很全面,所以处理起来很容易。


jsqlparser还能通过方法来编辑某部分的sql,例如增加一个查询列,增加一个表等等。更多的方法可以看wiki和源码。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值