Druid Sql 解析器的使用
导入Druid 依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.23</version>
</dependency>
工厂模式的应用
Java 代码
SqlParseService
:具体解析语句的接口
public interface SqlParseService {
List<ParseItem> parseCreateSql(String sql,String dbtype);
List<ParseItem> parseQuerySql(String sql,String dbtype);
}
SqlParseFactory
:根据dbtype 得到不同的解析器:Mysql、Oracle
public class SqlParseFactory {
private static final Logger log = Logger.getLogger(String.valueOf(SqlParseFactory.class));
private static volatile SqlParseFactory sqlParseFactory = null;
private SqlParseFactory() {
}
public static synchronized SqlParseFactory getInstance() {
if (Objects.isNull(sqlParseFactory)) {
return new SqlParseFactory();
}
return sqlParseFactory;
}
public SqlParseService getService(String dbType){
if(SqlParseConstant.MYSQL.equalsIgnoreCase(dbType)){
return new MysqlSqlParse();
}
return new OracleSqlParse();
}
}
- MysqlSqlParse 继承成抽象类 AbstractSqlParse,抽象类中可以封装一些共有的属性,抽象类实现SqlParseService
public class MysqlSqlParse extends AbstractSqlParse {
private static final Logger log = Logger.getLogger(String.valueOf(MysqlSqlParse.class));
@Override
public List<ParseItem> parseCreateSql(String sql, String dbtype) {
List<ParseItem> list = new LinkedList<>();
ParseItem parseItem = new ParseItem();
List<Map<String,String>> column = new LinkedList<>();
SQLStatementParser statementParser = SQLParserUtils.createSQLStatementParser(sql, SqlParseConstant.MYSQL);
SQLCreateTableParser sqlCreateTableParser = statementParser.getSQLCreateTableParser();
SQLCreateTableStatement sqlCreateTableStatement = sqlCreateTableParser.parseCreateTable();
SQLName name = sqlCreateTableStatement.getName();
List<SQLTableElement> tableElementList = sqlCreateTableStatement.getTableElementList();
for (SQLTableElement sqlTableElement : tableElementList) {
Map<String,String> map = new HashMap<>();
if(sqlTableElement instanceof SQLColumnDefinition ){
SQLColumnDefinition sqlColumnDefinition = (SQLColumnDefinition) sqlTableElement;
String columnName = ((SQLColumnDefinition) sqlTableElement).getColumnName();
SQLDataType dataType = sqlColumnDefinition.getDataType();
map.put("column",columnName);
map.put("datatype", String.valueOf(dataType));
}
column.add(map);
}
parseItem.setDbtype(dbtype);
parseItem.setColumn(column);
parseItem.setTable(String.valueOf(name));
list.add(parseItem);
return list;
}
@Override
public List<ParseItem> parseQuerySql(String sql, String dbtype) {
return super.parseQuerySql(sql, dbtype);
}
}
- 解析得到ASC 抽象语法树,Druid 中有各类API,解析各种Sql 直接拿去使用就行。