diff --git a/src/main/java/com/alibaba/druid/mapping/MappingEngine.java b/src/main/java/com/alibaba/druid/mapping/MappingEngine.java index 687149af60..a7aab55b37 100644 --- a/src/main/java/com/alibaba/druid/mapping/MappingEngine.java +++ b/src/main/java/com/alibaba/druid/mapping/MappingEngine.java @@ -1,7 +1,10 @@ package com.alibaba.druid.mapping; +import java.util.ArrayList; import java.util.LinkedHashMap; +import java.util.List; +import com.alibaba.druid.mapping.spi.ExportParameterVisitor; import com.alibaba.druid.mapping.spi.MappingProvider; import com.alibaba.druid.mapping.spi.MappingVisitor; import com.alibaba.druid.mapping.spi.MySqlMappingProvider; @@ -26,6 +29,10 @@ public class MappingEngine { this.provider = provider; } + public MappingProvider getMappingProvider() { + return provider; + } + public Integer getMaxLimit() { return maxLimit; } @@ -93,16 +100,27 @@ public class MappingEngine { return toSQL(query); } - + public SQLInsertStatement explainToInsertSQLObject(String sql) { return provider.explainToInsertSQLObject(this, sql); } - + public String explainToInsertSQL(String sql) { SQLInsertStatement query = explainToInsertSQLObject(sql); - + query.accept(this.createMappingVisitor()); - + return toSQL(query); } + + public List exportParameters(SQLObject sqlObject) { + List parameters = new ArrayList(); + exportParameters(sqlObject, parameters); + return parameters; + } + + public void exportParameters(SQLObject sqlObject, List parameters) { + ExportParameterVisitor exporter = this.provider.createExportParameterVisitor(parameters); + sqlObject.accept(exporter); + } } diff --git a/src/test/java/com/alibaba/druid/bvt/mapping/MappingVisitorTest.java b/src/test/java/com/alibaba/druid/bvt/mapping/MappingVisitorTest.java index 4c6a7bd368..6504c90db1 100644 --- a/src/test/java/com/alibaba/druid/bvt/mapping/MappingVisitorTest.java +++ b/src/test/java/com/alibaba/druid/bvt/mapping/MappingVisitorTest.java @@ -26,21 +26,30 @@ public class MappingVisitorTest extends TestCase { public void test_0() throws Exception { - Assert.assertEquals("SELECT serviceTag AS \"编号\", ip AS \"IP地址\"\nFROM device", engine.explainToSelectSQL("select *")); + Assert.assertEquals("SELECT serviceTag AS \"编号\", ip AS \"IP地址\"\nFROM device", + engine.explainToSelectSQL("select *")); Assert.assertEquals("SELECT serviceTag AS \"编号\", ip AS \"IP地址\"\nFROM device\nWHERE ip = '127.0.0.1'", engine.explainToSelectSQL("select 编号, IP地址 WHERE IP地址 = '127.0.0.1'")); } - + public void test_1() throws Exception { engine.setMaxLimit(10); - - Assert.assertEquals("SELECT serviceTag AS \"编号\", ip AS \"IP地址\"\nFROM device\nLIMIT 10", engine.explainToSelectSQL("select *")); + + Assert.assertEquals("SELECT serviceTag AS \"编号\", ip AS \"IP地址\"\nFROM device\nLIMIT 10", + engine.explainToSelectSQL("select *")); Assert.assertEquals("SELECT serviceTag AS \"编号\", ip AS \"IP地址\"\nFROM device\nWHERE ip = '127.0.0.1'\nLIMIT 10", engine.explainToSelectSQL("select 编号, IP地址 WHERE IP地址 = '127.0.0.1'")); Assert.assertEquals("SELECT serviceTag AS \"编号\", ip AS \"IP地址\"\nFROM device\nWHERE ip = '127.0.0.1'\nLIMIT 3", engine.explainToSelectSQL("select 编号, IP地址 WHERE IP地址 = '127.0.0.1' limit 3")); - + Assert.assertEquals(0, engine.exportParameters(engine.explainToSelectSQLObject("select 1")).size()); + Assert.assertEquals(0, + engine.exportParameters(engine.explainToSelectSQLObject("select 编号, IP地址 where 1 = 0")).size()); + Assert.assertEquals(1, + engine.exportParameters(engine.explainToSelectSQLObject("select 编号, IP地址 where 1 = 0 and IP地址 = '127.0.0.1'")).size()); + Assert.assertEquals("127.0.0.1", + engine.exportParameters(engine.explainToSelectSQLObject("select 编号, IP地址 where 1 = 0 and IP地址 = '127.0.0.1'")).get(0)); + engine.setMaxLimit(null); }