public void search(String sql, Map<String, Object> conditions, String operator) {
List<Map<String, Object>> result = new ArrayList<>();
// SQLParserUtils.createSQLStatementParser可以將sql裝載到Parser裏面
SQLStatementParser parser = SQLParserUtils.createSQLStatementParser(sql, JdbcUtils.MYSQL);
// parseStatementList的返回值SQLStatement本身就是druid裏面的語法樹對象
List<SQLStatement> stmtList = parser.parseStatementList();
SQLStatement stmt = stmtList.get(0);
if (stmt instanceof SQLSelectStatement) {
// convert conditions to 'and' statement
StringBuffer constraintsBuffer = new StringBuffer();
Iterator<Map.Entry<String, Object>> entryIterator = conditions.entrySet().iterator();
if (entryIterator.hasNext()) {
Map.Entry<String, Object> entry = entryIterator.next();
constraintsBuffer.append(entry.getKey()).append(" = ").append(entry.getValue());
}
while (entryIterator.hasNext()) {
Map.Entry<String, Object> entry = entryIterator.next();
constraintsBuffer.append(" "+operator+" ").append(entry.getKey()).append(" = ").append(entry.getValue());
}
SQLExprParser constraintsParser = SQLParserUtils.createExprParser(constraintsBuffer.toString(), JdbcUtils.MYSQL);
SQLExpr constraintsExpr = constraintsParser.expr();
SQLSelectStatement selectStmt = (SQLSelectStatement) stmt;
// 拿到SQLSelect 通過在這裏打斷點看對象我們可以看出這是一個樹的結構
SQLSelect sqlselect = selectStmt.getSelect();
SQLSelectQueryBlock query = (SQLSelectQueryBlock) sqlselect.getQuery();
SQLExpr whereExpr = query.getWhere();
// 修改where表達式
if (whereExpr == null) {
query.setWhere(constraintsExpr);
} else {
SQLBinaryOperator sqlBinaryOperator = null;
for (SQLBinaryOperator value : SQLBinaryOperator.values()) {
if (value.getName().equalsIgnoreCase(operator)){
sqlBinaryOperator = value;
break;
}
}
SQLBinaryOpExpr newWhereExpr = new SQLBinaryOpExpr(whereExpr, sqlBinaryOperator, constraintsExpr);
query.setWhere(newWhereExpr);
}
sqlselect.setQuery(query);
sql = sqlselect.toString();
System.out.println(sql);
}