最近有个需求,需要根据 threadlocal 中的条件和模板配置,动态修改 sql ,给 sql where 或者 join 后面添加 in 条件。避免 sql 执行以后进行代码过滤,减轻数据库的压力。于是尝试了 durid sql parser ,这样不用添加其它多余的依赖,方便集成。先写了一个 main 函数,后续将它集成到 mybatis interceptor 中实现。
本人用的 druid 版本为 1.0.16
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.0.16</version>
</dependency>
主函数代码
import com.alibaba.druid.sql.ast.SQLExpr;
import com.alibaba.druid.sql.ast.expr.*;
import com.alibaba.druid.sql.ast.statement.*;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlUnionQuery;
import com.alibaba.druid.sql.dialect.mysql.parser.MySqlStatementParser;
import com.alibaba.druid.sql.parser.SQLStatementParser;
import java.util.ArrayList;
import java.util.List;
/**
* @author WJP
* @Date: 2021/10/27 10:01
*/
public class DruidSqlParser {
// 需要动态添加条件的表名
static String filterTable = "student";
// 由于有些时候表名会使用 ` 符号包裹,暂时不知道 druid sql parser 如何格式化表名
static String filterTableSymbol = "`student`";
// 需要动态添加条件的列名
static String columnName = "name";
static List<String> list = new ArrayList<>();
static {
list.add("wjp");
list.add("gm");
}
public static void main(String[] args) {
String sql = TestSqlString.customSql;
// 新建 MySQL Parser
SQLStatementParser parser = new MySqlStatementParser