SoFunction
Updated on 2025-04-14

Technical Guide to Parsing and Manipulating SQL with JSQLParser

1. Brief description

During the development process, parsing and manipulating SQL is a common requirement, such as dynamically generating SQL, extracting table names, fields in queries, etc. JSQLParser is a powerful open source Java library for parsing SQL and providing syntax tree operation capabilities. It supports most SQL syntax and provides a clear API, simplifying the complexity of SQL operations.

2. Functional characteristics

JSQLParser is a Java-based SQL parsing library that can convert SQL into an actionable syntax tree. It supports the following features:

  • Analyze SQL: Supports SELECT, INSERT, UPDATE, DELETE and other statements.
  • Extract information: Get table name, field name, condition, function, etc.
  • Modify SQL: dynamically add fields, modify conditions, etc.
  • Supports multiple SQL dialects: compatible with MySQL, PostgreSQL, SQL Server, etc.

Before using JSQLParser, it needs to be added. Here are the Maven dependencies of JSQLParser:

<dependency>
    <groupId></groupId>
    <artifactId>jsqlparser</artifactId>
    <version>4.6</version>
</dependency>

3. Use examples

  • SQL Monitoring and Audit: Extract sensitive information and perform SQL security checks.
  • Dynamic SQL construction: Dynamically assemble SQL according to business needs.
  • Multi-tenant support: Automatically inject tenant fields in SQL.
  • Complex query optimization: parsing and rewriting SQL queries.

3.1 Analyze and extract SQL information

Extract table names, fields, and WHERE conditions from a SELECT query.

import ;
import ;
import ;
import ;

public class JSQLParserExample {

    public static void main(String[] args) throws JSQLParserException {
        String sql = "SELECT id, name FROM users WHERE age &gt; 18";

        // parse SQL        Select selectStatement = (Select) (sql);
        PlainSelect plainSelect = (PlainSelect) ();

        // Get the table name        String tableName = ().toString();
        ("Table name:" + tableName);

        // Get fields        ().forEach(item -&gt; ("Field:" + item));

        // Get WHERE conditions        ("WHERE Conditions:" + ());
    }
}

3.2 Dynamically modify SQL query conditions

Dynamically add a condition to the WHERE condition of the SQL query.

import ;
import ;
import ;
import ;
import ;
import ;

public class ModifySQLCondition {

    public static void main(String[] args) throws JSQLParserException {
        String sql = "SELECT * FROM orders WHERE status = 'completed'";

        // parse SQL        Select selectStatement = (Select) (sql);
        PlainSelect plainSelect = (PlainSelect) ();

        // Create new conditions        Expression newCondition = ("amount &gt; 100");

        // Modify WHERE conditions (AND connection)        if (() != null) {
            ((
                () + " AND " + newCondition));
        } else {
            (newCondition);
        }

        // Output modified SQL        ("Modified SQL:" + selectStatement);
    }
}

3.3 Get all table names

Extract all involved table names (including JOIN tables) from complex SQL queries.

import ;
import ;
import ;
import ;
import ;

public class ExtractTableNames {

    public static void main(String[] args) throws JSQLParserException {
        String sql = "SELECT ,  FROM orders a JOIN customers b ON a.customer_id = ";

        // parse SQL        Select selectStatement = (Select) (sql);
        PlainSelect plainSelect = (PlainSelect) ();

        // Main table        ("Main Table:" + ());

        // JOIN table        if (() != null) {
            for (Join join : ()) {
                ("JOIN table:" + ());
            }
        }
    }
}

3.4 Add new fields

Dynamically add a field in the query.

import ;
import ;
import ;
import ;
import ;

public class AddNewField {

    public static void main(String[] args) throws JSQLParserException {
        String sql = "SELECT id, name FROM users";

        // parse SQL        Select selectStatement = (Select) (sql);
        PlainSelect plainSelect = (PlainSelect) ();

        // Add new fields        SelectExpressionItem newField = new SelectExpressionItem();
        (("email"));
        ().add(newField);

        // Output modified SQL        ("Modified SQL:" + selectStatement);
    }
}

3.5 Analyzing complex nested queries

Parses a nested query and extracts all table names and fields.

import ;
import ;
import ;

public class ParseNestedSQL {

    public static void main(String[] args) throws JSQLParserException {
        String sql = "SELECT * FROM (SELECT id, name FROM users WHERE age &gt; 18) u WHERE  LIKE 'A%'";

        // parse SQL        Select selectStatement = (Select) (sql);

        // Output SQL structure        ("Resolved SQL:" + selectStatement);
    }
}

4. Summary

JSQLParser is a powerful and flexible SQL parsing tool. Through it, we can easily parse and operate SQL, suitable for dynamic query generation, SQL security audit, multi-tenant injection and other scenarios. In actual development, flexibly using its API according to business needs can significantly improve development efficiency.

Recommended practice:

  • In a multi-tenant system, use JSQLParser to automatically inject tenant fields.
  • Combined with JSQLParser to parse SQL logs to achieve accurate SQL performance monitoring.

The above is the detailed content of the technical guide for Java to parse and operate SQL using JSQLParser. For more information about Java JSQLParser parsing and operate SQL, please pay attention to my other related articles!