Java使用Druid解析SQL语句


依赖

名称: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


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM