Zacard's Notes

JSqlParser使用示例

背景

由于业务需要,需要编写一个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的代码结构和使用逻辑总体上算上简单易懂,基本看下项目的包结构以及类注释就能明白大致的用法。其中不乏一些joingroup等高阶sql操作。如有sql解析,动态处理方面的需求,JSqlParser还是一个很好的选择。

坚持原创技术分享,您的支持将鼓励我继续创作!

热评文章