Как преобразовать SQL-оператор вставки для удаления SQL-оператора, используя JSQLParser - PullRequest
0 голосов
/ 29 августа 2018

Я хочу преобразовать оператор вставки SQL для удаления оператора SQL, используя JSQLParser , Как этого достичь? например вот образец вставки sql

INSERT INTO emp (empno, ename, job, sal, comm, deptno, joinedon) VALUES (4160, 'STURDEVIN', 'SECURITY GUARD', 2045, NULL, 30, TO_TIMESTAMP('2014-07-02 06:14:00.742000000', 'YYYY-MM-DD HH24:MI:SS.FF'));

после преобразования для удаления sql будет следовать

DELETE FROM emp WHERE empno=4160 AND ename='STURDEVIN' AND job='SECURITY GUARD' AND sal=2045 AND comm=NULL AND deptno=30 AND joinedon=TO_TIMESTAMP('2014-07-02 06:14:00.742000000', 'YYYY-MM-DD HH24:MI:SS.FF');

Вот код на данный момент

import net.sf.jsqlparser.JSQLParserException;
import net.sf.jsqlparser.expression.operators.relational.ItemsList;
import net.sf.jsqlparser.parser.CCJSqlParserUtil;
import net.sf.jsqlparser.schema.Column;
import net.sf.jsqlparser.statement.Statement;
import net.sf.jsqlparser.statement.delete.Delete;
import net.sf.jsqlparser.statement.insert.Insert;

import java.util.List;

public class Main {

    public static void main(String[] args) {
        String insertSQL = "INSERT INTO emp (empno, ename, job, sal, comm, deptno, joinedon) VALUES (4160, 'STURDEVIN', 'SECURITY GUARD', 2045, NULL, 30, TO_TIMESTAMP('2014-07-02 06:14:00.742000000', 'YYYY-MM-DD HH24:MI:SS.FF'));";
        final Statement statement;
        try {
            statement = CCJSqlParserUtil.parse(insertSQL);
            if (statement instanceof Insert) {
                final Insert insertStatement = (Insert) statement;
                System.out.println("insertStatement: " + insertStatement);
                List<Column> columns = insertStatement.getColumns();
                for (final Column column : columns) {
                    System.out.println("column: " + column);
                }
                ItemsList itemsList = insertStatement.getItemsList();
                System.out.println("itemsList: " + itemsList);
                final Delete deleteStatement = new Delete();
                deleteStatement.setTable(insertStatement.getTable());
                System.out.println("deleteStatement: " + deleteStatement);
            }
        } catch (JSQLParserException e) {
            e.printStackTrace();
        }
    }
}

Я строю этот проект, используя maven, здесь зависимость pom.

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>oracle.insert.delete.jsqlparser</groupId>
    <artifactId>oracle_from_insert_to_delete_using_JSqlParser</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>
        <dependency>
            <groupId>com.github.jsqlparser</groupId>
            <artifactId>jsqlparser</artifactId>
            <version>1.2</version>
        </dependency>
    </dependencies>


</project>

Часть устаревшего кода. Эти операторы вставки написаны для настройки тестовых данных. Я хочу автоматически очистить тестовые данные после завершения теста. И не зависит от плохо написанного оператора delete в демонтаже.

1 Ответ

0 голосов
/ 01 сентября 2018

Это был бы способ сделать это (добавленный код начинается с "// get the list of values"):

public class Main {

    public static void main(String[] args) {
        String insertSQL = "INSERT INTO emp (empno, ename, job, sal, comm, deptno, joinedon) VALUES (4160, 'STURDEVIN', 'SECURITY GUARD', 2045, NULL, 30, TO_TIMESTAMP('2014-07-02 06:14:00.742000000', 'YYYY-MM-DD HH24:MI:SS.FF'));";
        final Statement statement;
        try {
            statement = CCJSqlParserUtil.parse(insertSQL);
            if (statement instanceof Insert) {
                final Insert insertStatement = (Insert) statement;
                System.out.println("insertStatement: " + insertStatement);
                List<Column> columns = insertStatement.getColumns();
                for (final Column column : columns) {
                    System.out.println("column: " + column);
                }
                ItemsList itemsList = insertStatement.getItemsList();
                System.out.println("itemsList: " + itemsList);
                final Delete deleteStatement = new Delete();
                deleteStatement.setTable(insertStatement.getTable());

                // get the list of values
                ExpressionList expressionList = (ExpressionList) itemsList;
                List<Expression> values = expressionList.getExpressions();

                // create the "column = value" expressions list
                List<Expression> expressions = new ArrayList<>();
                for (int i = 0; i < columns.size(); i++) {
                    // create the "column = value" expression
                    EqualsTo equalsTo = new EqualsTo();
                    equalsTo.setLeftExpression(columns.get(i));
                    equalsTo.setRightExpression(values.get(i));

                    // add it to the list
                    expressions.add(equalsTo);
                }

                // glue together the expressions with "ANDs"
                // it is now our where expression
                MultiAndExpression whereExpression = new MultiAndExpression(expressions);

                deleteStatement.setWhere(whereExpression);

                System.out.println("deleteStatement: " + deleteStatement);
            }
        } catch (JSQLParserException e) {
            e.printStackTrace();
        }
    }
}

Создает этот оператор удаления:

DELETE FROM emp WHERE (empno = 4160 AND ename = 'STURDEVIN' AND job = 'SECURITY GUARD' AND sal = 2045 AND comm = NULL AND deptno = 30 AND joinedon = TO_TIMESTAMP('2014-07-02 06:14:00.742000000', 'YYYY-MM-DD HH24:MI:SS.FF'))
...