在Mybatis-Plus拦截器中使用jsqlparser修改SQL语句

3,791 阅读2分钟

包 net.sf.jsqlparser

在上一篇文章中,我们介绍了借助于MybatisPlus如何实现一个简单的SQL执行拦截器,今天我们来详细介绍一个修改SQL语句的利器:jsqlparser。

它的完整包名是:net.sf.jsqlparser

介绍

JSqlParser是一个开源的SQL语句解析器,它能够将SQL语句解析成抽象语法树(可以理解为将SQL解析成相关的Java对象),并且能够对其进行修改。这使得我们能够使用JSqlParser来方便的修改SQL语句。

下面针对几种常见情况,列出的一些样例代码。

修改Where中的 AND 或者Or条件

import net.sf.jsqlparser.JSQLParserException;
import net.sf.jsqlparser.expression.Expression;
import net.sf.jsqlparser.expression.operators.conditional.AndExpression;
import net.sf.jsqlparser.expression.operators.conditional.OrExpression;
import net.sf.jsqlparser.parser.CCJSqlParserUtil;
import net.sf.jsqlparser.statement.select.PlainSelect;
import net.sf.jsqlparser.statement.select.Select;



String sql = "SELECT * FROM mytable WHERE a = 1";
Select select = (Select) CCJSqlParserUtil.parse(sql);


PlainSelect plainSelect = (PlainSelect) select.getSelectBody();
Expression where = plainSelect.getWhere();

// 添加AND条件
AndExpression and = new AndExpression(where, CCJSqlParserUtil.parseCondExpression("b = 2"));
plainSelect.setWhere(and);

// 添加OR条件
OrExpression or = new OrExpression(and, CCJSqlParserUtil.parseCondExpression("c = 3"));
plainSelect.setWhere(or);

// 打印修改后的SQL
String modifiedSql = select.toString();
System.out.println(modifiedSql);

代码的执行结果:

SELECT * FROM mytable WHERE a = 1 AND b = 2 OR c = 3

添加IN语句

也可以在WHERE中添加IN语句

String sql = "SELECT * FROM mytable WHERE a = 1";
Select select = (Select) CCJSqlParserUtil.parse(sql);


PlainSelect plainSelect = (PlainSelect) select.getSelectBody();
Expression where = plainSelect.getWhere();

// 添加IN语句
InExpression in = new InExpression();
in.setLeftExpression(CCJSqlParserUtil.parseExpression("b"));
ItemsList itemsList = CCJSqlParserUtil.parseExpressionList("(2, 3, 4)");
in.setRightItemsList(itemsList);

AndExpression and = new AndExpression(where, in);
plainSelect.setWhere(and);


添加查询返回列

String sql = "SELECT a FROM mytable WHERE a = 1";
Select select = (Select) CCJSqlParserUtil.parse(sql);


PlainSelect plainSelect = (PlainSelect) select.getSelectBody();

// 添加查询字段
Column column = new Column("tenant_id");
SelectExpressionItem item = new SelectExpressionItem(column);
plainSelect.getSelectItems().add(item);

// 修改后的SQL
// SELECT a, tenant_id FROM mytable WHERE a = 1


插入语句中增加插入字段值

String sql = "INSERT INTO mytable (a, b) VALUES (1, 2)";
Insert insert = (Insert) CCJSqlParserUtil.parse(sql);


// 添加列名
Column column = new Column("tenant_id");
insert.getColumns().add(column);

// 添加列值
Expression value = new StringValue("'my_tenant'");
insert.getItemsList().getExpressions().add(value);

// 修改后的SQL
// INSERT INTO mytable (a, b, tenant_id) VALUES (1, 2, 'my_tenant')

更新语句中增加更新字段的值

String sql = "UPDATE mytable SET a = 1 WHERE b = 2";
Update update = (Update) CCJSqlParserUtil.parse(sql);


// 添加列名
Column column = new Column("tenant_id");
update.getColumns().add(column);

// 添加列值
Expression value = new StringValue("'my_tenant'");
update.getExpressions().add(value);

// 修改结果
// UPDATE mytable SET a = 1, tenant_id = 'my_tenant' WHERE b = 2