概述

JSqlParser能够解析SQL语句并翻译成一个Java类层次结构。它具有扩展的SQL语法,不仅限于一个数据库,而且还支持Oracle,SqlServer,MySQL,PostgreSQL等许多数据库。

快速上手

1、添加依赖

JSqlParser的依赖已经添加到了盘古common包中,使用时,引入common包即可。

  1. <!--maven依赖 -->
  2. <dependency>
  3. <groupId>com.github.jsqlparser</groupId>
  4. <artifactId>jsqlparser</artifactId>
  5. <version>3.2</version>
  6. </dependency>

2、使用方法

解析SQL语句前需要先创建数据库操作类。CCJSqlParserManager类是用于创建对数据库操作接口类Statement。 Statement包含了对数据库的查询、插入、修改等多种操作。 此外,JSqlParser中也提供了工具类CCJSqlParserUtil,通过parse方法,也可以创建Statement类。 下面介绍几种使用方式
▪️查询字段

  1. private static List<String> test_select_items(String sql) throws JSQLParserException {
  2. CCJSqlParserManager parserManager = new CCJSqlParserManager();
  3. Select select = (Select) CCJSqlParserUtil.parse(new StringReader(sql));
  4. PlainSelect plain = (PlainSelect) select.getSelectBody();
  5. List<SelectItem> selectitems = plain.getSelectItems();
  6. List<String> str_items = new ArrayList<String>();
  7. if (selectitems != null) {
  8. for (SelectItem selectitem : selectitems) {
  9. str_items.add(selectitem.toString());
  10. }
  11. }
  12. return str_items;
  13. }

select
▪️查询 join

  1. private static List<String> test_select_join(String sql) throws JSQLParserException {
  2. Statement statement = CCJSqlParserUtil.parse(sql);
  3. Select selectStatement = (Select) statement;
  4. PlainSelect plain = (PlainSelect) selectStatement.getSelectBody();
  5. List<Join> joinList = plain.getJoins();
  6. List<String> tablewithjoin = new ArrayList<String>();
  7. if (joinList != null) {
  8. for (Join join : joinList) {
  9. join.setLeft(false);
  10. tablewithjoin.add(join.toString());
  11. //注意 , leftjoin rightjoin 等等的to string()区别
  12. }
  13. }
  14. return tablewithjoin;
  15. }

▪️查询表名 table

  1. private static List<String> test_select_table(String sql) throws JSQLParserException {
  2. Statement statement = CCJSqlParserUtil.parse(sql);
  3. Select selectStatement = (Select) statement;
  4. TablesNamesFinder tablesNamesFinder = new TablesNamesFinder();
  5. return tablesNamesFinder.getTableList(selectStatement);
  6. }

▪️查询 where

  1. private static String test_select_where(String sql) throws JSQLParserException {
  2. CCJSqlParserManager parserManager = new CCJSqlParserManager();
  3. Select select = (Select) parserManager.parse(new StringReader(sql));
  4. PlainSelect plain = (PlainSelect) select.getSelectBody();
  5. Expression where_expression = plain.getWhere();
  6. return where_expression.toString();
  7. }

▪️查询 group by

  1. private static List<String> test_select_groupby(String sql) throws JSQLParserException {
  2. CCJSqlParserManager parserManager = new CCJSqlParserManager();
  3. Select select = (Select) parserManager.parse(new StringReader(sql));
  4. PlainSelect plain = (PlainSelect) select.getSelectBody();
  5. List<Expression> GroupByColumnReferences = plain.getGroupByColumnReferences();
  6. List<String> str_groupby = new ArrayList<String>();
  7. if (GroupByColumnReferences != null) {
  8. for (Expression groupByColumnReference : GroupByColumnReferences) {
  9. str_groupby.add(groupByColumnReference.toString());
  10. }
  11. }
  12. return str_groupby;
  13. }

▪️查询 order by

  1. private static List<String> test_select_orderby(String sql) throws JSQLParserException {
  2. CCJSqlParserManager parserManager = new CCJSqlParserManager();
  3. Select select = (Select) parserManager.parse(new StringReader(sql));
  4. PlainSelect plain = (PlainSelect) select.getSelectBody();
  5. List<OrderByElement> OrderByElements = plain.getOrderByElements();
  6. List<String> str_orderby = new ArrayList<String>();
  7. if (OrderByElements != null) {
  8. for (OrderByElement orderByElement : OrderByElements) {
  9. str_orderby.add(orderByElement.toString());
  10. }
  11. }
  12. return str_orderby;
  13. }

▪️查询 子查询

  1. private static Map test_select_subselect(SelectBody selectBody) throws JSQLParserException {
  2. Map<String, String> map = new HashMap<String, String>();
  3. if (selectBody instanceof PlainSelect) {
  4. List<SelectItem> selectItems = ((PlainSelect) selectBody).getSelectItems();
  5. for (SelectItem selectItem : selectItems) {
  6. if (selectItem.toString().contains("(") && selectItem.toString().contains(")")) {
  7. map.put("selectItemsSubselect", selectItem.toString());
  8. }
  9. }
  10. Expression where = ((PlainSelect) selectBody).getWhere();
  11. String whereStr = where.toString();
  12. if (whereStr.contains("(") && whereStr.contains(")")) {
  13. int firstIndex = whereStr.indexOf("(");
  14. int lastIndex = whereStr.lastIndexOf(")");
  15. CharSequence charSequence = whereStr.subSequence(firstIndex, lastIndex + 1);
  16. map.put("whereSubselect", charSequence.toString());
  17. }
  18. FromItem fromItem = ((PlainSelect) selectBody).getFromItem();
  19. if (fromItem instanceof SubSelect) {
  20. map.put("fromItemSubselect", fromItem.toString());
  21. }
  22. } else if (selectBody instanceof WithItem) {
  23. SqlParser.test_select_subselect(((WithItem) selectBody).getSelectBody());
  24. }
  25. return map;
  26. }

▪️查询多个sql语句

  1. String sqls = "SELECT * FROM TABLE1;SELECT * FROM TABLE2";
  2. //方法1
  3. Statements statements = CCJSqlParserUtil.parseStatements(sqls);
  4. //方法2
  5. CCJSqlParser ccjSqlParser = new CCJSqlParser(sqls);
  6. Statements statements = ccjSqlParser.Statements();
  7. List<Statement> statementList = statements.getStatements();

▪️表达式解析

  1. //表达式
  2. Expression expression = CCJSqlParserUtil.parseExpression("a+b*c");
  3. //条件表达式
  4. Expression expression = CCJSqlParserUtil.parseCondExpression("A='123'");

▪将别名应用于所有表达式

  1. Select select = (Select) CCJSqlParserUtil.parse("SELECT A,B,C FROM TABLE1");//此处的运行时类是Select
  2. SelectBody selectBody = select.getSelectBody();
  3. AddAliasesVisitor addAliasesVisitor = new AddAliasesVisitor();
  4. addAliasesVisitor.setPrefix("B");//设置前缀(如不进行设置默认为“A”)
  5. selectBody.accept(addAliasesVisitor);
  6. System.out.println(selectBody.toString());//SELECT A AS B1, B AS B2, C AS B3 FROM TABLE1

▪向SELECT添加一列或表达式

Select select = (Select) CCJSqlParserUtil.parse("SELECT A FROM TABLE1");
SelectUtils.addExpression(select, new Column("B"));
System.out.println(select);//SELECT A, B FROM TABLE1