mirror of
https://github.com/alibaba/druid.git
synced 2023-03-04 19:17:16 +00:00
88 lines
3.5 KiB
Java
88 lines
3.5 KiB
Java
package com.alibaba.druid.mapping.spi;
|
|
|
|
import java.util.List;
|
|
|
|
import com.alibaba.druid.mapping.MappingEngine;
|
|
import com.alibaba.druid.sql.ast.expr.SQLIntegerExpr;
|
|
import com.alibaba.druid.sql.ast.expr.SQLNumericLiteralExpr;
|
|
import com.alibaba.druid.sql.ast.statement.SQLInsertStatement;
|
|
import com.alibaba.druid.sql.ast.statement.SQLSelectQueryBlock;
|
|
import com.alibaba.druid.sql.ast.statement.SQLUpdateStatement;
|
|
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlDeleteStatement;
|
|
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSelectQueryBlock;
|
|
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSelectQueryBlock.Limit;
|
|
import com.alibaba.druid.sql.dialect.mysql.parser.MySqlSelectParser;
|
|
import com.alibaba.druid.sql.dialect.mysql.parser.MySqlStatementParser;
|
|
import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlExportParameterVisitor;
|
|
import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlOutputVisitor;
|
|
import com.alibaba.druid.sql.visitor.ExportParameterVisitor;
|
|
import com.alibaba.druid.sql.visitor.SQLASTOutputVisitor;
|
|
|
|
public class MySqlMappingProvider implements MappingProvider {
|
|
|
|
@Override
|
|
public MappingVisitor createMappingVisitor(MappingEngine engine) {
|
|
return new MySqlMappingVisitor(engine.getEntities());
|
|
}
|
|
|
|
@Override
|
|
public SQLASTOutputVisitor createOutputVisitor(MappingEngine engine, Appendable out) {
|
|
return new MySqlOutputVisitor(out);
|
|
}
|
|
|
|
public SQLSelectQueryBlock explainToSelectSQLObject(MappingEngine engine, String sql) {
|
|
MySqlSelectParser selectParser = new MySqlSelectParser(sql);
|
|
MySqlSelectQueryBlock query = (MySqlSelectQueryBlock) selectParser.query();
|
|
|
|
Integer maxLimit = engine.getMaxLimit();
|
|
|
|
if (maxLimit != null) {
|
|
if (query.getLimit() == null) {
|
|
Limit limit = new Limit();
|
|
limit.setRowCount(new SQLIntegerExpr(maxLimit));
|
|
query.setLimit(limit);
|
|
} else {
|
|
SQLNumericLiteralExpr rowCountExpr = (SQLNumericLiteralExpr) query.getLimit().getRowCount();
|
|
int rowCount = rowCountExpr.getNumber().intValue();
|
|
if (rowCount > maxLimit.intValue()) {
|
|
rowCountExpr.setNumber(maxLimit);
|
|
}
|
|
}
|
|
}
|
|
|
|
return query;
|
|
}
|
|
|
|
public MySqlDeleteStatement explainToDeleteSQLObject(MappingEngine engine, String sql) {
|
|
MySqlStatementParser parser = new MySqlStatementParser(sql);
|
|
|
|
MySqlDeleteStatement stmt = parser.parseDeleteStatement();
|
|
MappingVisitorUtils.setDataSource(engine, stmt);
|
|
|
|
return stmt;
|
|
}
|
|
|
|
public SQLUpdateStatement explainToUpdateSQLObject(MappingEngine engine, String sql) {
|
|
MySqlStatementParser parser = new MySqlStatementParser(sql);
|
|
SQLUpdateStatement stmt = parser.parseUpdateStatement();
|
|
|
|
MappingVisitorUtils.setDataSource(engine, stmt);
|
|
|
|
return stmt;
|
|
}
|
|
|
|
public SQLInsertStatement explainToInsertSQLObject(MappingEngine engine, String sql) {
|
|
MySqlStatementParser parser = new MySqlStatementParser(sql);
|
|
SQLInsertStatement stmt = (SQLInsertStatement) parser.parseInsert();
|
|
|
|
MappingVisitorUtils.setDataSource(engine, stmt);
|
|
|
|
return stmt;
|
|
}
|
|
|
|
@Override
|
|
public ExportParameterVisitor createExportParameterVisitor(List<Object> parameters) {
|
|
return new MySqlExportParameterVisitor(parameters);
|
|
}
|
|
}
|