From 758e42ef5d05823a9f813c71197e18eea2e99c59 Mon Sep 17 00:00:00 2001 From: wenshao Date: Tue, 10 Mar 2015 21:41:01 +0800 Subject: [PATCH] bug fixed for issue 796 --- .../jdbc/PreparedStatementProxyImpl.java | 15 +++++- ...edStatementProxyImplGetParametersTest.java | 49 +++++++++++++++++++ 2 files changed, 63 insertions(+), 1 deletion(-) create mode 100644 src/test/java/com/alibaba/druid/bvt/proxy/PreparedStatementProxyImplGetParametersTest.java diff --git a/src/main/java/com/alibaba/druid/proxy/jdbc/PreparedStatementProxyImpl.java b/src/main/java/com/alibaba/druid/proxy/jdbc/PreparedStatementProxyImpl.java index 7b7af74ab9..979470736d 100644 --- a/src/main/java/com/alibaba/druid/proxy/jdbc/PreparedStatementProxyImpl.java +++ b/src/main/java/com/alibaba/druid/proxy/jdbc/PreparedStatementProxyImpl.java @@ -37,6 +37,7 @@ import java.sql.Timestamp; import java.sql.Types; import java.util.Arrays; import java.util.Calendar; +import java.util.HashMap; import java.util.Map; import com.alibaba.druid.proxy.jdbc.JdbcParameter.TYPE; @@ -50,6 +51,7 @@ public class PreparedStatementProxyImpl extends StatementProxyImpl implements Pr protected final String sql; private JdbcParameter[] parameters = new JdbcParameter[16]; private int parametersSize = 0; + private Map paramMap = null; public PreparedStatementProxyImpl(ConnectionProxy connection, PreparedStatement statement, String sql, long id){ super(connection, statement, id); @@ -58,7 +60,14 @@ public class PreparedStatementProxyImpl extends StatementProxyImpl implements Pr } public Map getParameters() { - return null; + if (paramMap == null) { + paramMap = new HashMap(parametersSize); + for (int i = 0; i < parametersSize; ++i) { + paramMap.put(i, parameters[i]); + } + } + + return paramMap; } void setParameter(int jdbcIndex, JdbcParameter parameter) { @@ -71,6 +80,10 @@ public class PreparedStatementProxyImpl extends StatementProxyImpl implements Pr parameters = Arrays.copyOf(parameters, parametersSize + 16); } parameters[index] = parameter; + + if (paramMap != null) { + paramMap = null; + } } public int getParametersSize() { diff --git a/src/test/java/com/alibaba/druid/bvt/proxy/PreparedStatementProxyImplGetParametersTest.java b/src/test/java/com/alibaba/druid/bvt/proxy/PreparedStatementProxyImplGetParametersTest.java new file mode 100644 index 0000000000..105a408260 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/proxy/PreparedStatementProxyImplGetParametersTest.java @@ -0,0 +1,49 @@ +package com.alibaba.druid.bvt.proxy; + +import java.sql.Connection; +import java.sql.DriverManager; +import java.util.Map; + +import org.junit.Assert; + +import junit.framework.TestCase; + +import com.alibaba.druid.proxy.jdbc.JdbcParameter; +import com.alibaba.druid.proxy.jdbc.PreparedStatementProxy; +import com.alibaba.druid.util.JdbcUtils; + +public class PreparedStatementProxyImplGetParametersTest extends TestCase { + + private String url = "jdbc:wrap-jdbc:filters=default:name=driverTest:jdbc:mock:xxx"; + private Connection conn; + + protected void setUp() throws Exception { + conn = DriverManager.getConnection(url); + } + + protected void tearDown() throws Exception { + JdbcUtils.close(conn); + } + + public void test_get_parameters() throws Exception { + final PreparedStatementProxy stmt = (PreparedStatementProxy) conn.prepareStatement("select 1"); + + { + Map paramMap = stmt.getParameters(); + Assert.assertNotNull(paramMap); + Assert.assertEquals(paramMap.size(), 0); + } + stmt.setInt(1, 1); + { + Map paramMap1 = stmt.getParameters(); + Assert.assertNotNull(paramMap1); + + Map paramMap2 = stmt.getParameters(); + Assert.assertNotNull(paramMap2); + + Assert.assertSame(paramMap1, paramMap2); + Assert.assertEquals(paramMap1.size(), 1); + } + stmt.close(); + } +}