背景
由于业务需要,需要编写一个mybatis插件来统一处理一类sql,并且需要对sql动态处理。然而解析sql成为一件繁琐的工作,果断github上查找是否有sql解析的项目。一个300多star的sql解析构建项目:JSqlParser。
由于JSqlParser的github主页的使用说明略简单,查看测试类,也没有覆盖常用的使用需求。于是,这里整理了一些个人实际使用的一些方法。
使用示例
查询返回增加一列
代码如下:
/**
* 测试查询返回增加一列
*/
@Test
public void testAddSelectColumn() throws Exception {
Select select = (Select) CCJSqlParserUtil.parse("select name from user where id = 1");
SelectUtils.addExpression(select, new Column("mail"));
Assert.assertEquals(select.toString(), "SELECT name, mail FROM user WHERE id = 1");
}
查询语句增加where条件
代码如下:
/**
* 测试查询语句增加where条件
*/
@Test
public void testAddWhereCondition() throws Exception {
Select select = (Select) CCJSqlParserUtil.parse("select name from user");
PlainSelect plainSelect = (PlainSelect) select.getSelectBody();
if (plainSelect.getWhere() == null) {
EqualsTo equalsTo = new EqualsTo();
equalsTo.setLeftExpression(new Column("id"));
equalsTo.setRightExpression(new LongValue(1000L));
plainSelect.setWhere(equalsTo);
}
Assert.assertEquals(select.toString(), "SELECT name FROM user WHERE id = 1000");
}
增加where查询条件
代码如下:
/**
* 测试增加where查询条件
*/
@Test
public void testAddCondition() throws Exception {
Select select = (Select) CCJSqlParserUtil.parse("select name from user where id = 1000");
PlainSelect plainSelect = (PlainSelect) select.getSelectBody();
// 原where表达式
Expression where = plainSelect.getWhere();
// 新增的查询条件表达式
EqualsTo equalsTo = new EqualsTo();
equalsTo.setLeftExpression(new Column("name"));
equalsTo.setRightExpression(new StringValue("'张三'"));
// 用and链接条件
AndExpression and = new AndExpression(where, equalsTo);
// 设置新的where条件
plainSelect.setWhere(and);
Assert.assertEquals(select.toString(), "SELECT name FROM user WHERE id = 1000 AND name = '张三'");
}
增加null查询条件
代码如下:
/**
* 测试null条件
*/
@Test
public void testNullCondition() throws Exception {
Select select = (Select) CCJSqlParserUtil.parse("select name from user where id = 1000");
PlainSelect plainSelect = (PlainSelect) select.getSelectBody();
// 原where表达式
Expression where = plainSelect.getWhere();
// 新增的null判断条件
IsNullExpression isNullExpression = new IsNullExpression();
isNullExpression.setLeftExpression(new Column("name"));
isNullExpression.setNot(true);
// 用and链接条件
AndExpression and = new AndExpression(where, isNullExpression);
// 设置新的where条件
plainSelect.setWhere(and);
Assert.assertEquals(select.toString(), "SELECT name FROM user WHERE id = 1000 AND name IS NOT NULL");
}
总结
JSqlParser的代码结构和使用逻辑总体上算上简单易懂,基本看下项目的包结构以及类注释就能明白大致的用法。其中不乏一些join、group等高阶sql操作。如有sql解析,动态处理方面的需求,JSqlParser还是一个很好的选择。