依賴
名稱:com.alibaba.druid
版本:1.1.16
SQL語句解析
以SQLServer為例,解析插入語句和更新語句,並提取對應的數據
/**
* @Description: SQLServer解析
*/
public class SqlServerParser {
/**
* 解析sql語句
*
* @param statement
* @return
*/
public void parse(String statement) {
// 使用druid解析語句
// 第一個參數為SQL語句
// 第二個參數為解析的數據庫類型
List<SQLStatement> statementList = SQLUtils.parseStatements(statement, JdbcConstants.SQL_SERVER);
// 單語句解析,只有一條數據
if (!statement.isEmpty()) {
SQLStatement sqlStatement = statementList.get(0);
// 插入語句解析
if (sqlStatement instanceof SQLServerInsertStatement) {
// 轉換
SQLServerInsertStatement insertStatement = (SQLServerInsertStatement) sqlStatement;
// 獲取列名
List<SQLExpr> columns = insertStatement.getColumns();
List<String> columnsName = new ArrayList<>(columns.size());
for (SQLExpr column : columns) {
columnsName.add(((SQLIdentifierExpr) column).getName());
}
System.out.println(columnsName);
// 獲取值
List<SQLInsertStatement.ValuesClause> valuesList = insertStatement.getValuesList();
List<List<Object>> dataList = new ArrayList<>();
for (SQLInsertStatement.ValuesClause valuesClause : valuesList) {
List<SQLExpr> values = valuesClause.getValues();
List<Object> data = new ArrayList<>(columnsName.size());
for (SQLExpr value : values) {
data.add(getValue(value));
}
dataList.add(data);
}
System.out.println(dataList);
// 獲取表名
System.out.println(insertStatement.getTableName().getSimpleName());
} else if (sqlStatement instanceof SQLServerUpdateStatement) {
// 更新語句解析
SQLServerUpdateStatement updateStatement = (SQLServerUpdateStatement) sqlStatement;
// 獲取更新的值和內容
List<SQLUpdateSetItem> items = updateStatement.getItems();
Map<String, Object> updateMap = new HashMap<>(items.size());
for (SQLUpdateSetItem item : items) {
updateMap.put(((SQLIdentifierExpr) item.getColumn()).getName(), getValue(item.getValue()));
}
System.out.println(updateMap);
// 獲取條件,條件比較復雜,需根據實際情況自行提取
SQLBinaryOpExpr where = (SQLBinaryOpExpr) updateStatement.getWhere();
System.out.println(where);
// 獲取表名
System.out.println(updateStatement.getTableName().getSimpleName());
}
}
return null;
}
private static Object getValue(SQLExpr value) {
// TODO 判斷更多的種類
if (value instanceof SQLIntegerExpr) {
// 值是數字
return ((SQLIntegerExpr) value).getNumber();
} else if (value instanceof SQLCharExpr) {
// 值是字符串
return ((SQLCharExpr) value).getText();
}
return null;
}
public static void main(String[] args) throws Exception {
SqlServerParser sqlServerParser = new SqlServerParser();
sqlServerParser.parse("update test set status='P' where id=20");
sqlServerParser.parse("insert into test (id,status,name,ce,acc) values (29,'P','lll','sxsx','Arferwg')");
}
}
函數解析
SQLUtils.parseStatements(statement, JdbcConstants.SQL_SERVER);
第一個參數為SQL語句
第二個參數為解析的數據庫類型,druid支持多種輸數據庫類型,只需修改數據庫類型即可解析不同的SQL語句
sqlStatement instanceof SQLServerInsertStatement
如果是其他數據庫強制轉換類型也需要發生改變,例如MYSQL,則使用MySqlInsertStatement