From 0c9de8e4e3a11978789926e9ce3dae52c2a668a0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B8=A9=E5=B0=91?= Date: Thu, 10 May 2012 11:13:56 +0800 Subject: [PATCH] refactor mapping --- .../alibaba/druid/mapping/MappingContext.java | 10 +++ .../alibaba/druid/mapping/MappingEngine.java | 88 ++++++++++++------- .../spi/MSSQLServerMappingProvider.java | 14 +-- .../druid/mapping/spi/MappingProvider.java | 8 +- .../mapping/spi/MappingVisitorUtils.java | 15 ++-- .../mapping/spi/MySqlMappingProvider.java | 14 +-- .../mapping/spi/OracleMappingProvider.java | 14 +-- 7 files changed, 98 insertions(+), 65 deletions(-) diff --git a/src/main/java/com/alibaba/druid/mapping/MappingContext.java b/src/main/java/com/alibaba/druid/mapping/MappingContext.java index b178c01f7e..fd91b0f634 100644 --- a/src/main/java/com/alibaba/druid/mapping/MappingContext.java +++ b/src/main/java/com/alibaba/druid/mapping/MappingContext.java @@ -10,6 +10,8 @@ public class MappingContext { private boolean generateAlias = false; private boolean explainAllColumnToList = false; + private Entity defaultEntity; + public MappingContext(){ this(new ArrayList()); } @@ -42,4 +44,12 @@ public class MappingContext { this.explainAllColumnToList = explainAllColumnToList; } + public Entity getDefaultEntity() { + return defaultEntity; + } + + public void setDefaultEntity(Entity defaultEntity) { + this.defaultEntity = defaultEntity; + } + } diff --git a/src/main/java/com/alibaba/druid/mapping/MappingEngine.java b/src/main/java/com/alibaba/druid/mapping/MappingEngine.java index 21d7d5d2c7..1e0572858a 100644 --- a/src/main/java/com/alibaba/druid/mapping/MappingEngine.java +++ b/src/main/java/com/alibaba/druid/mapping/MappingEngine.java @@ -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 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> select(Connection conn, String sql, List 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> 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 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 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 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 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 { diff --git a/src/main/java/com/alibaba/druid/mapping/spi/MSSQLServerMappingProvider.java b/src/main/java/com/alibaba/druid/mapping/spi/MSSQLServerMappingProvider.java index 4149a9e228..c8612669d6 100644 --- a/src/main/java/com/alibaba/druid/mapping/spi/MSSQLServerMappingProvider.java +++ b/src/main/java/com/alibaba/druid/mapping/spi/MSSQLServerMappingProvider.java @@ -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; } diff --git a/src/main/java/com/alibaba/druid/mapping/spi/MappingProvider.java b/src/main/java/com/alibaba/druid/mapping/spi/MappingProvider.java index 8885133739..56c297b83d 100644 --- a/src/main/java/com/alibaba/druid/mapping/spi/MappingProvider.java +++ b/src/main/java/com/alibaba/druid/mapping/spi/MappingProvider.java @@ -24,11 +24,11 @@ public interface MappingProvider { List 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); } diff --git a/src/main/java/com/alibaba/druid/mapping/spi/MappingVisitorUtils.java b/src/main/java/com/alibaba/druid/mapping/spi/MappingVisitorUtils.java index 77438b7809..d0ffb087dc 100644 --- a/src/main/java/com/alibaba/druid/mapping/spi/MappingVisitorUtils.java +++ b/src/main/java/com/alibaba/druid/mapping/spi/MappingVisitorUtils.java @@ -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())); } } diff --git a/src/main/java/com/alibaba/druid/mapping/spi/MySqlMappingProvider.java b/src/main/java/com/alibaba/druid/mapping/spi/MySqlMappingProvider.java index 687645a868..2bcf0b6c21 100644 --- a/src/main/java/com/alibaba/druid/mapping/spi/MySqlMappingProvider.java +++ b/src/main/java/com/alibaba/druid/mapping/spi/MySqlMappingProvider.java @@ -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; } diff --git a/src/main/java/com/alibaba/druid/mapping/spi/OracleMappingProvider.java b/src/main/java/com/alibaba/druid/mapping/spi/OracleMappingProvider.java index 56821cc89b..5d27432944 100644 --- a/src/main/java/com/alibaba/druid/mapping/spi/OracleMappingProvider.java +++ b/src/main/java/com/alibaba/druid/mapping/spi/OracleMappingProvider.java @@ -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; }