包 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