JSQLParser官网地址:http://jsqlparser.sourceforge.net/

JSQLParserGitHub地址:https://github.com/JSQLParser/JSqlParser

pom.xml

<dependency><groupId>com.github.jsqlparser</groupId><artifactId>jsqlparser</artifactId><version>1.4</version></dependency>

网上有相关讲解,但是没有进行整合的例子,我写了个工具类供参考

package com.wisetv.programdept.penum;/*** 定义sql返回类型*/
public enum SqlType {ALTER,CREATEINDEX,CREATETABLE,CREATEVIEW,DELETE,DROP,EXECUTE,INSERT,MERGE,REPLACE,SELECT,TRUNCATE,UPDATE,UPSERT,NONE
}
package com.wisetv.programdept.sql;import com.wisetv.programdept.penum.SqlType;
import net.sf.jsqlparser.JSQLParserException;
import net.sf.jsqlparser.expression.LongValue;
import net.sf.jsqlparser.parser.CCJSqlParserUtil;
import net.sf.jsqlparser.schema.Table;
import net.sf.jsqlparser.statement.Statement;
import net.sf.jsqlparser.statement.alter.Alter;
import net.sf.jsqlparser.statement.create.index.CreateIndex;
import net.sf.jsqlparser.statement.create.table.CreateTable;
import net.sf.jsqlparser.statement.create.view.CreateView;
import net.sf.jsqlparser.statement.delete.Delete;
import net.sf.jsqlparser.statement.drop.Drop;
import net.sf.jsqlparser.statement.execute.Execute;
import net.sf.jsqlparser.statement.insert.Insert;
import net.sf.jsqlparser.statement.merge.Merge;
import net.sf.jsqlparser.statement.replace.Replace;import net.sf.jsqlparser.statement.select.*;
import net.sf.jsqlparser.statement.truncate.Truncate;
import net.sf.jsqlparser.statement.update.Update;
import net.sf.jsqlparser.statement.upsert.Upsert;
import net.sf.jsqlparser.util.TablesNamesFinder;import java.io.StringReader;
import java.util.ArrayList;
import java.util.List;/*** jsqlparser解析SQL工具类* PlainSelect类不支持union、union all等请使用SetOperationList接口**/
public class SqlParserTool {/*** 由于jsqlparser没有获取SQL类型的原始工具,并且在下面操作时需要知道SQL类型,所以编写此工具方法* @param sql sql语句* @return sql类型,* @throws JSQLParserException*/public static SqlType getSqlType(String sql) throws JSQLParserException {Statement sqlStmt = CCJSqlParserUtil.parse(new StringReader(sql));if (sqlStmt instanceof Alter) {return SqlType.ALTER;} else if (sqlStmt instanceof CreateIndex) {return SqlType.CREATEINDEX;} else if (sqlStmt instanceof CreateTable) {return SqlType.CREATETABLE;} else if (sqlStmt instanceof CreateView) {return SqlType.CREATEVIEW;} else if (sqlStmt instanceof Delete) {return SqlType.DELETE;} else if (sqlStmt instanceof Drop) {return SqlType.DROP;} else if (sqlStmt instanceof Execute) {return SqlType.EXECUTE;} else if (sqlStmt instanceof Insert) {return SqlType.INSERT;} else if (sqlStmt instanceof Merge) {return SqlType.MERGE;} else if (sqlStmt instanceof Replace) {return SqlType.REPLACE;} else if (sqlStmt instanceof Select) {return SqlType.SELECT;} else if (sqlStmt instanceof Truncate) {return SqlType.TRUNCATE;} else if (sqlStmt instanceof Update) {return SqlType.UPDATE;} else if (sqlStmt instanceof Upsert) {return SqlType.UPSERT;} else {return SqlType.NONE;}}/*** 获取sql操作接口,与上面类型判断结合使用* example:* String sql = "create table a(a string)";* SqlType sqlType = SqlParserTool.getSqlType(sql);* if(sqlType.equals(SqlType.SELECT)){*     Select statement = (Select) SqlParserTool.getStatement(sql);*  }* @param sql* @return* @throws JSQLParserException*/public static Statement getStatement(String sql) throws JSQLParserException {Statement sqlStmt = CCJSqlParserUtil.parse(new StringReader(sql));return sqlStmt;}/*** 获取tables的表名* @param statement* @return*/public static List<String> getTableList(Select statement){TablesNamesFinder tablesNamesFinder = new TablesNamesFinder();List<String> tableList = tablesNamesFinder.getTableList(statement);return tableList;}/*** 获取join层级* @param selectBody* @return*/public static List<Join> getJoins(SelectBody selectBody){if(selectBody instanceof PlainSelect){List<Join> joins =((PlainSelect) selectBody).getJoins();return joins;}return new ArrayList<Join>();}/**** @param selectBody* @return*/public static List<Table> getIntoTables(SelectBody selectBody){if(selectBody instanceof PlainSelect){List<Table> tables = ((PlainSelect) selectBody).getIntoTables();return tables;}return new ArrayList<Table>();}/**** @param selectBody* @return*/public static void setIntoTables(SelectBody selectBody,List<Table> tables){if(selectBody instanceof PlainSelect){((PlainSelect) selectBody).setIntoTables(tables);}}/*** 获取limit值* @param selectBody* @return*/public static Limit getLimit(SelectBody selectBody){if(selectBody instanceof PlainSelect){Limit limit = ((PlainSelect) selectBody).getLimit();return limit;}return null;}/*** 为SQL增加limit值* @param selectBody* @param l*/public static void setLimit(SelectBody selectBody,long l){if(selectBody instanceof PlainSelect){Limit limit = new Limit();limit.setRowCount(new LongValue(String.valueOf(l)));((PlainSelect) selectBody).setLimit(limit);}}/*** 获取FromItem不支持子查询操作* @param selectBody* @return*/public static FromItem getFromItem(SelectBody selectBody){if(selectBody instanceof PlainSelect){FromItem fromItem = ((PlainSelect) selectBody).getFromItem();return fromItem;}else if(selectBody instanceof WithItem){SqlParserTool.getFromItem(((WithItem) selectBody).getSelectBody());}return null;}/*** 获取子查询* @param selectBody* @return*/public static SubSelect getSubSelect(SelectBody selectBody){if(selectBody instanceof PlainSelect){FromItem fromItem = ((PlainSelect) selectBody).getFromItem();if(fromItem instanceof SubSelect){return ((SubSelect) fromItem);}}else if(selectBody instanceof WithItem){SqlParserTool.getSubSelect(((WithItem) selectBody).getSelectBody());}return null;}/*** 判断是否为多级子查询* @param selectBody* @return*/public static boolean isMultiSubSelect(SelectBody selectBody){if(selectBody instanceof PlainSelect){FromItem fromItem = ((PlainSelect) selectBody).getFromItem();if(fromItem instanceof SubSelect){SelectBody subBody = ((SubSelect) fromItem).getSelectBody();if(subBody instanceof PlainSelect){FromItem subFromItem = ((PlainSelect) subBody).getFromItem();if(subFromItem instanceof SubSelect){return true;}}}}return false;}/*** 获取查询字段* @param selectBody* @return*/public static List<SelectItem> getSelectItems(SelectBody selectBody){if(selectBody instanceof PlainSelect){List<SelectItem> selectItems = ((PlainSelect) selectBody).getSelectItems();return selectItems;}return null;}public static void main(String[] args) throws JSQLParserException {String sql = "select * from (select userid from a) a";SqlType sqlType = SqlParserTool.getSqlType(sql);if(sqlType.equals(SqlType.SELECT)){Select statement = (Select) SqlParserTool.getStatement(sql);SubSelect subSelect = SqlParserTool.getSubSelect(statement.getSelectBody());System.out.println(subSelect.getSelectBody());}}}

转载自:作者:刺青LOVELESS 
来源:CSDN 
原文:https://blog.csdn.net/ciqingloveless/article/details/82626304 
版权声明:本文为博主原创文章,转载请附上博文链接!

jsqlparser解析SQL工具类(转载)相关推荐

  1. PHP文件上传,下载,Sql工具类!

    PHP文件上传,下载,Sql工具类! 对文件大小,文件类型 同名覆盖 中文转码的操作,可直接使用 前台 upload.html <!DOCTYPE html> <html> & ...

  2. java 兼容excel_Java解析Excel工具类(兼容xls和xlsx)

    依赖jar org.apache.poi poi-ooxml 4.0.1 ExcelUtils.java package javax.utils; import java.io.File; impor ...

  3. Java解析Excel工具类(兼容xls和xlsx)

    依赖jar <dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml< ...

  4. java json帮助类_java 写一个JSON解析的工具类

    上面是一个标准的json的响应内容截图,第一个红圈"per_page"是一个json对象,我们可以根据"per_page"来找到对应值是3,而第二个红圈&quo ...

  5. java解析xml工具类_通过dom4j解析XML字符串XMLDocUtil工具类转换为XML文档及获取指定根节点及指定节点路径内容代码示例...

    一.前言 通过dom4j解析XML文档的XMLDocUtil工具类,进行解析xml字符串为Document文档对象.获取根节点元素路径内容getRootElement.获取唯一路径节点的值getSin ...

  6. java实现二维码的生成和解析包含工具类

    1.下载jar包( jdk1.7) 链接:https://pan.baidu.com/s/1LVq_zGsp_Po8V456h1TVmA 提取码:vqyd 2.工具类Utils.java packag ...

  7. Excel解析easyexcel工具类

    本文使用基于阿里的easyexcel编写的工具类对xls后缀的Excel文件(即03版)读取并写成xlsx后缀的Excel文件(即07版),中间转换过程使用String二维数组和对象列表两种形式. e ...

  8. 抖音视频解析的工具类

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 一.一个解析抖音分析链接的工具类 import java.io.IOException; import java.util.HashM ...

  9. 关于java可以解析Excel工具类(word 也可以)

    你要准备的: 1.引入的依赖 2.你要对应字段的实体类 3. 调用工具类 1.首先要引入的依赖: <dependency><groupId>com.alibaba</gr ...

最新文章

  1. Spring Aop的应用
  2. Java异常ClassCastException
  3. IKVM.NET_06_用户指南_教程
  4. 机器学习基础-集成学习-13
  5. 【Qt】 XML流读写XML
  6. Request_获取请求参数通用方式演示
  7. Linux 2.6.32-279.el6.x86_64 ANDROID SDK碰到”LIBC.SO.6: VERSION `GLIBC_2.14′ NOT FOUND”的解决方法(2)
  8. 通过 Route 配置的例子,学习SAP Cloud for Customer 的scoping操作
  9. Html5响应式设计与实现广场
  10. C/C++获取本地IP(适用于多种操作系统)
  11. qpython3第三方库_Python第三方库的安装 --Python3
  12. linux检测系统是否被入侵(上)
  13. 4种实例 advice aop_JAVA动态代理 和 Spring AOP 4种通知的简单实现
  14. 软著【设计说明书】(软件著作权)
  15. 3.8 51单片机-M74HC138译码器驱动8位数码管
  16. 软考中级软件设计师-加密技术(自用)
  17. U盘显示0字节怎么恢复完整解决教程
  18. 计算机虚拟化技术论文,虚拟化技术在计算机技术中的运用
  19. LDAP认证的两种方式
  20. Hibernate对象状态之间的神奇转换

热门文章

  1. python大括号_我不能在Python中使用花括号吗?
  2. C#格式化字符串中输入花括号
  3. VScode+Taro开发小程序
  4. 小乌龟奔跑的无聊日记~
  5. excel宏字符串连接mysql_Excel 访问Sql 数据库的连接字符串
  6. 婚纱摄影行业网络推广之另辟蹊径–婚纱摄影软文
  7. # 配置SwaggerConfig类,以及遇到的问题解决方式
  8. python设计jieba_python实现jieba库分词制作词云
  9. MyBatis构架设计学习------MyBatis的整体架构
  10. Flowable API