DruidSqlパーサーの使用
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を解析して直接使用できます。