refactor mapping

This commit is contained in:
温少
2012-05-10 11:13:56 +08:00
parent d028f26d3d
commit 0c9de8e4e3
7 changed files with 98 additions and 65 deletions
@@ -10,6 +10,8 @@ public class MappingContext {
private boolean generateAlias = false;
private boolean explainAllColumnToList = false;
private Entity defaultEntity;
public MappingContext(){
this(new ArrayList<Object>());
}
@@ -42,4 +44,12 @@ public class MappingContext {
this.explainAllColumnToList = explainAllColumnToList;
}
public Entity getDefaultEntity() {
return defaultEntity;
}
public void setDefaultEntity(Entity defaultEntity) {
this.defaultEntity = defaultEntity;
}
}
@@ -38,7 +38,13 @@ public class MappingEngine {
this.provider = provider;
}
public Entity getFirstEntity() {
public Entity getFirstEntity(MappingContext context) {
Entity entity = context.getDefaultEntity();
if (entity != null) {
return entity;
}
for (Map.Entry<String, Entity> entry : entities.entrySet()) {
return entry.getValue();
}
@@ -111,8 +117,8 @@ public class MappingEngine {
return toSQL(stmt);
}
public SQLSelectQueryBlock explainToSelectSQLObject(String sql) {
return provider.explainToSelectSQLObject(this, sql);
public SQLSelectQueryBlock explainToSelectSQLObject(String sql, MappingContext context) {
return provider.explainToSelectSQLObject(this, sql, context);
}
public String explainToSelectSQL(String sql) {
@@ -124,7 +130,7 @@ public class MappingEngine {
}
public String explainToSelectSQL(String sql, MappingContext context) {
SQLSelectQueryBlock query = explainToSelectSQLObject(sql);
SQLSelectQueryBlock query = explainToSelectSQLObject(sql, context);
MappingVisitor visitor = this.createMappingVisitor(context);
query.accept(visitor);
@@ -137,9 +143,9 @@ public class MappingEngine {
public void afterResole(MappingVisitor visitor) {
}
public SQLDeleteStatement explainToDeleteSQLObject(String sql) {
return provider.explainToDeleteSQLObject(this, sql);
public SQLDeleteStatement explainToDeleteSQLObject(String sql, MappingContext context) {
return provider.explainToDeleteSQLObject(this, sql, context);
}
public String explainToDeleteSQL(String sql) {
@@ -147,7 +153,7 @@ public class MappingEngine {
}
public String explainToDeleteSQL(String sql, MappingContext context) {
SQLDeleteStatement stmt = explainToDeleteSQLObject(sql);
SQLDeleteStatement stmt = explainToDeleteSQLObject(sql, context);
MappingVisitor visitor = this.createMappingVisitor(context);
stmt.accept(visitor);
@@ -165,8 +171,8 @@ public class MappingEngine {
return property.getDbColumnName();
}
public SQLUpdateStatement explainToUpdateSQLObject(String sql) {
return provider.explainToUpdateSQLObject(this, sql);
public SQLUpdateStatement explainToUpdateSQLObject(String sql, MappingContext context) {
return provider.explainToUpdateSQLObject(this, sql, context);
}
public String explainToUpdateSQL(String sql) {
@@ -174,7 +180,7 @@ public class MappingEngine {
}
public String explainToUpdateSQL(String sql, MappingContext context) {
SQLUpdateStatement stmt = explainToUpdateSQLObject(sql);
SQLUpdateStatement stmt = explainToUpdateSQLObject(sql, context);
MappingVisitor visitor = this.createMappingVisitor(context);
stmt.accept(visitor);
@@ -184,8 +190,8 @@ public class MappingEngine {
return toSQL(stmt);
}
public SQLInsertStatement explainToInsertSQLObject(String sql) {
return provider.explainToInsertSQLObject(this, sql);
public SQLInsertStatement explainToInsertSQLObject(String sql, MappingContext context) {
return provider.explainToInsertSQLObject(this, sql, context);
}
public String explainToInsertSQL(String sql) {
@@ -193,7 +199,7 @@ public class MappingEngine {
}
public String explainToInsertSQL(String sql, MappingContext context) {
SQLInsertStatement stmt = explainToInsertSQLObject(sql);
SQLInsertStatement stmt = explainToInsertSQLObject(sql, context);
MappingVisitor visitor = this.createMappingVisitor(context);
stmt.accept(visitor);
@@ -229,35 +235,51 @@ public class MappingEngine {
return out.toString();
}
public List<Map<String, Object>> select(Connection conn, String sql, List<Object> parameters) throws SQLException {
SQLSelectQueryBlock sqlObject = this.explainToSelectSQLObject(sql);
exportParameters(sqlObject, parameters);
String rawSql = this.toSQL(sqlObject);
return JdbcUtils.executeQuery(conn, rawSql, parameters);
return select(conn, sql, new MappingContext(parameters));
}
public List<Map<String, Object>> select(Connection conn, String sql, MappingContext context) throws SQLException {
SQLSelectQueryBlock sqlObject = this.explainToSelectSQLObject(sql, context);
exportParameters(sqlObject, context.getParameters());
String rawSql = this.toSQL(sqlObject);
return JdbcUtils.executeQuery(conn, rawSql, context.getParameters());
}
public int delete(Connection conn, String sql, List<Object> parameters) throws SQLException {
SQLDeleteStatement sqlObject = this.explainToDeleteSQLObject(sql);
exportParameters(sqlObject, parameters);
String rawSql = this.toSQL(sqlObject);
int updateCount = JdbcUtils.executeUpdate(conn, rawSql, parameters);
return updateCount;
return delete(conn, sql, new MappingContext(parameters));
}
public int delete(Connection conn, String sql, MappingContext context) throws SQLException {
SQLDeleteStatement sqlObject = this.explainToDeleteSQLObject(sql, context);
exportParameters(sqlObject, context.getParameters());
String rawSql = this.toSQL(sqlObject);
int updateCount = JdbcUtils.executeUpdate(conn, rawSql, context.getParameters());
return updateCount;
}
public int update(Connection conn, String sql, List<Object> parameters) throws SQLException {
SQLUpdateStatement sqlObject = this.explainToUpdateSQLObject(sql);
exportParameters(sqlObject, parameters);
String rawSql = this.toSQL(sqlObject);
int updateCount = JdbcUtils.executeUpdate(conn, rawSql, parameters);
return updateCount;
return update(conn, sql, new MappingContext(parameters));
}
public void insert(Connection conn, String sql, List<Object> parameters) throws SQLException {
SQLInsertStatement sqlObject = this.explainToInsertSQLObject(sql);
exportParameters(sqlObject, parameters);
public int update(Connection conn, String sql, MappingContext context) throws SQLException {
SQLUpdateStatement sqlObject = this.explainToUpdateSQLObject(sql, context);
exportParameters(sqlObject, context.getParameters());
String rawSql = this.toSQL(sqlObject);
JdbcUtils.execute(conn, rawSql, parameters);
int updateCount = JdbcUtils.executeUpdate(conn, rawSql, context.getParameters());
return updateCount;
}
public void insert(Connection conn, String sql, List<Object> parameters) throws SQLException {
insert(conn, sql, new MappingContext(parameters));
}
public void insert(Connection conn, String sql, MappingContext context) throws SQLException {
SQLInsertStatement sqlObject = this.explainToInsertSQLObject(sql, context);
exportParameters(sqlObject, context.getParameters());
String rawSql = this.toSQL(sqlObject);
JdbcUtils.execute(conn, rawSql, context.getParameters());
}
public Connection getConnection() throws SQLException {
@@ -37,7 +37,7 @@ public class MSSQLServerMappingProvider implements MappingProvider {
return new SQLServerOutputVisitor(out);
}
public SQLSelectQueryBlock explainToSelectSQLObject(MappingEngine engine, String sql) {
public SQLSelectQueryBlock explainToSelectSQLObject(MappingEngine engine, String sql, MappingContext context) {
SQLServerSelectParser selectParser = new SQLServerSelectParser(sql);
SQLServerSelectQueryBlock query = (SQLServerSelectQueryBlock) selectParser.query();
@@ -60,29 +60,29 @@ public class MSSQLServerMappingProvider implements MappingProvider {
return query;
}
public SQLDeleteStatement explainToDeleteSQLObject(MappingEngine engine, String sql) {
public SQLDeleteStatement explainToDeleteSQLObject(MappingEngine engine, String sql, MappingContext context) {
SQLServerStatementParser parser = new SQLServerStatementParser(sql);
SQLDeleteStatement stmt = parser.parseDeleteStatement();
MappingVisitorUtils.setTableSource(engine, stmt);
MappingVisitorUtils.setTableSource(engine, stmt, context);
return stmt;
}
public SQLUpdateStatement explainToUpdateSQLObject(MappingEngine engine, String sql) {
public SQLUpdateStatement explainToUpdateSQLObject(MappingEngine engine, String sql, MappingContext context) {
SQLServerStatementParser parser = new SQLServerStatementParser(sql);
SQLUpdateStatement stmt = parser.parseUpdateStatement();
MappingVisitorUtils.setTableSource(engine, stmt);
MappingVisitorUtils.setTableSource(engine, stmt, context);
return stmt;
}
public SQLInsertStatement explainToInsertSQLObject(MappingEngine engine, String sql) {
public SQLInsertStatement explainToInsertSQLObject(MappingEngine engine, String sql, MappingContext context) {
SQLServerStatementParser parser = new SQLServerStatementParser(sql);
SQLInsertStatement stmt = (SQLInsertStatement) parser.parseInsert();
MappingVisitorUtils.setTableSource(engine, stmt);
MappingVisitorUtils.setTableSource(engine, stmt, context);
return stmt;
}
@@ -24,11 +24,11 @@ public interface MappingProvider {
List<SQLStatement> explain(MappingEngine engine, String sql);
SQLSelectQueryBlock explainToSelectSQLObject(MappingEngine engine, String sql);
SQLSelectQueryBlock explainToSelectSQLObject(MappingEngine engine, String sql, MappingContext context);
SQLDeleteStatement explainToDeleteSQLObject(MappingEngine engine, String sql);
SQLDeleteStatement explainToDeleteSQLObject(MappingEngine engine, String sql, MappingContext context);
SQLUpdateStatement explainToUpdateSQLObject(MappingEngine engine, String sql);
SQLUpdateStatement explainToUpdateSQLObject(MappingEngine engine, String sql, MappingContext context);
SQLInsertStatement explainToInsertSQLObject(MappingEngine engine, String sql);
SQLInsertStatement explainToInsertSQLObject(MappingEngine engine, String sql, MappingContext context);
}
@@ -5,6 +5,7 @@ import java.util.Map;
import com.alibaba.druid.mapping.DruidMappingException;
import com.alibaba.druid.mapping.Entity;
import com.alibaba.druid.mapping.MappingContext;
import com.alibaba.druid.mapping.MappingEngine;
import com.alibaba.druid.mapping.Property;
import com.alibaba.druid.sql.ast.SQLExpr;
@@ -410,7 +411,7 @@ public class MappingVisitorUtils {
}
if (x.getFrom() == null) {
Entity firstEntity = visitor.getEngine().getFirstEntity();
Entity firstEntity = visitor.getEngine().getFirstEntity(visitor.getContext());
SQLExprTableSource from = new SQLExprTableSource(new SQLIdentifierExpr(firstEntity.getName()));
from.putAttribute(MAPPING_ENTITY, firstEntity);
x.setFrom(from);
@@ -470,23 +471,23 @@ public class MappingVisitorUtils {
return entity;
}
public static void setTableSource(MappingEngine engine, SQLDeleteStatement stmt) {
public static void setTableSource(MappingEngine engine, SQLDeleteStatement stmt, MappingContext context) {
if (stmt.getExprTableSource() == null) {
Entity entity = engine.getFirstEntity();
Entity entity = engine.getFirstEntity(context);
stmt.setTableSource(new SQLIdentifierExpr(entity.getName()));
}
}
public static void setTableSource(MappingEngine engine, SQLUpdateStatement stmt) {
public static void setTableSource(MappingEngine engine, SQLUpdateStatement stmt, MappingContext context) {
if (stmt.getTableSource() == null) {
Entity entity = engine.getFirstEntity();
Entity entity = engine.getFirstEntity(context);
stmt.setTableSource(new SQLIdentifierExpr(entity.getName()));
}
}
public static void setTableSource(MappingEngine engine, SQLInsertStatement stmt) {
public static void setTableSource(MappingEngine engine, SQLInsertStatement stmt, MappingContext context) {
if (stmt.getTableSource() == null) {
Entity entity = engine.getFirstEntity();
Entity entity = engine.getFirstEntity(context);
stmt.setTableSource(new SQLIdentifierExpr(entity.getName()));
}
}
@@ -37,7 +37,7 @@ public class MySqlMappingProvider implements MappingProvider {
return new MySqlOutputVisitor(out);
}
public SQLSelectQueryBlock explainToSelectSQLObject(MappingEngine engine, String sql) {
public SQLSelectQueryBlock explainToSelectSQLObject(MappingEngine engine, String sql, MappingContext context) {
MySqlSelectParser selectParser = new MySqlSelectParser(sql);
MySqlSelectQueryBlock query = (MySqlSelectQueryBlock) selectParser.query();
@@ -60,29 +60,29 @@ public class MySqlMappingProvider implements MappingProvider {
return query;
}
public MySqlDeleteStatement explainToDeleteSQLObject(MappingEngine engine, String sql) {
public MySqlDeleteStatement explainToDeleteSQLObject(MappingEngine engine, String sql, MappingContext context) {
MySqlStatementParser parser = new MySqlStatementParser(sql);
MySqlDeleteStatement stmt = parser.parseDeleteStatement();
MappingVisitorUtils.setTableSource(engine, stmt);
MappingVisitorUtils.setTableSource(engine, stmt, context);
return stmt;
}
public SQLUpdateStatement explainToUpdateSQLObject(MappingEngine engine, String sql) {
public SQLUpdateStatement explainToUpdateSQLObject(MappingEngine engine, String sql, MappingContext context) {
MySqlStatementParser parser = new MySqlStatementParser(sql);
SQLUpdateStatement stmt = parser.parseUpdateStatement();
MappingVisitorUtils.setTableSource(engine, stmt);
MappingVisitorUtils.setTableSource(engine, stmt, context);
return stmt;
}
public SQLInsertStatement explainToInsertSQLObject(MappingEngine engine, String sql) {
public SQLInsertStatement explainToInsertSQLObject(MappingEngine engine, String sql, MappingContext context) {
MySqlStatementParser parser = new MySqlStatementParser(sql);
SQLInsertStatement stmt = (SQLInsertStatement) parser.parseInsert();
MappingVisitorUtils.setTableSource(engine, stmt);
MappingVisitorUtils.setTableSource(engine, stmt, context);
return stmt;
}
@@ -34,35 +34,35 @@ public class OracleMappingProvider implements MappingProvider {
return new OracleOutputVisitor(out, false);
}
public SQLSelectQueryBlock explainToSelectSQLObject(MappingEngine engine, String sql) {
public SQLSelectQueryBlock explainToSelectSQLObject(MappingEngine engine, String sql, MappingContext context) {
OracleSelectParser selectParser = new OracleSelectParser(sql);
OracleSelectQueryBlock query = (OracleSelectQueryBlock) selectParser.query();
return query;
}
public OracleDeleteStatement explainToDeleteSQLObject(MappingEngine engine, String sql) {
public OracleDeleteStatement explainToDeleteSQLObject(MappingEngine engine, String sql, MappingContext context) {
OracleStatementParser parser = new OracleStatementParser(sql);
OracleDeleteStatement stmt = parser.parseDeleteStatement();
MappingVisitorUtils.setTableSource(engine, stmt);
MappingVisitorUtils.setTableSource(engine, stmt, context);
return stmt;
}
public SQLUpdateStatement explainToUpdateSQLObject(MappingEngine engine, String sql) {
public SQLUpdateStatement explainToUpdateSQLObject(MappingEngine engine, String sql, MappingContext context) {
OracleStatementParser parser = new OracleStatementParser(sql);
SQLUpdateStatement stmt = parser.parseUpdateStatement();
MappingVisitorUtils.setTableSource(engine, stmt);
MappingVisitorUtils.setTableSource(engine, stmt, context);
return stmt;
}
public SQLInsertStatement explainToInsertSQLObject(MappingEngine engine, String sql) {
public SQLInsertStatement explainToInsertSQLObject(MappingEngine engine, String sql, MappingContext context) {
OracleStatementParser parser = new OracleStatementParser(sql);
SQLInsertStatement stmt = (SQLInsertStatement) parser.parseInsert();
MappingVisitorUtils.setTableSource(engine, stmt);
MappingVisitorUtils.setTableSource(engine, stmt, context);
return stmt;
}