diff --git a/src/main/java/com/alibaba/druid/proxy/jdbc/JdbcParameterDate.java b/src/main/java/com/alibaba/druid/proxy/jdbc/JdbcParameterDate.java index 2cd73ceeba..dd173575dc 100644 --- a/src/main/java/com/alibaba/druid/proxy/jdbc/JdbcParameterDate.java +++ b/src/main/java/com/alibaba/druid/proxy/jdbc/JdbcParameterDate.java @@ -5,7 +5,6 @@ import java.util.Calendar; import java.util.Date; public final class JdbcParameterDate implements JdbcParameter { - private final Date value; public JdbcParameterDate(Date value){ diff --git a/src/main/java/com/alibaba/druid/proxy/jdbc/JdbcParameterDecimal.java b/src/main/java/com/alibaba/druid/proxy/jdbc/JdbcParameterDecimal.java index e5777572d5..9c9348ca91 100644 --- a/src/main/java/com/alibaba/druid/proxy/jdbc/JdbcParameterDecimal.java +++ b/src/main/java/com/alibaba/druid/proxy/jdbc/JdbcParameterDecimal.java @@ -6,12 +6,32 @@ import java.util.Calendar; public final class JdbcParameterDecimal implements JdbcParameter { - private final BigDecimal value; + private final BigDecimal value; - public JdbcParameterDecimal(BigDecimal value){ + public static JdbcParameterDecimal NULL = new JdbcParameterDecimal(null); + public static JdbcParameterDecimal ZERO = new JdbcParameterDecimal(BigDecimal.ZERO); + public static JdbcParameterDecimal TEN = new JdbcParameterDecimal(BigDecimal.TEN); + + private JdbcParameterDecimal(BigDecimal value){ this.value = value; } + public static JdbcParameterDecimal valueOf(BigDecimal x) { + if (x == null) { + return NULL; + } + + if (x == BigDecimal.ZERO) { + return ZERO; + } + + if (x == BigDecimal.TEN) { + return TEN; + } + + return new JdbcParameterDecimal(x); + } + @Override public Object getValue() { return value; diff --git a/src/main/java/com/alibaba/druid/proxy/jdbc/JdbcParameterInt.java b/src/main/java/com/alibaba/druid/proxy/jdbc/JdbcParameterInt.java index 5ae9ca0331..1eb2e88e9d 100644 --- a/src/main/java/com/alibaba/druid/proxy/jdbc/JdbcParameterInt.java +++ b/src/main/java/com/alibaba/druid/proxy/jdbc/JdbcParameterInt.java @@ -4,12 +4,30 @@ import java.sql.Types; import java.util.Calendar; public final class JdbcParameterInt implements JdbcParameter { + + private static JdbcParameterInt[] cache; + + static { + int cacheSize = 127; + cache = new JdbcParameterInt[cacheSize]; + for (int i = 0; i < cache.length; ++i) { + cache[i] = new JdbcParameterInt(i); + } + } private final int value; - public JdbcParameterInt(int value){ + private JdbcParameterInt(int value){ this.value = value; } + + public static JdbcParameterInt valueOf(int value) { + if (value >= 0 && value < cache.length) { + return cache[value]; + } + + return new JdbcParameterInt(value); + } @Override public Object getValue() { diff --git a/src/main/java/com/alibaba/druid/proxy/jdbc/JdbcParameterLong.java b/src/main/java/com/alibaba/druid/proxy/jdbc/JdbcParameterLong.java index 41315eb49d..884216481c 100644 --- a/src/main/java/com/alibaba/druid/proxy/jdbc/JdbcParameterLong.java +++ b/src/main/java/com/alibaba/druid/proxy/jdbc/JdbcParameterLong.java @@ -4,12 +4,29 @@ import java.sql.Types; import java.util.Calendar; public final class JdbcParameterLong implements JdbcParameter { - + private static JdbcParameterLong[] cache; + + static { + int cacheSize = 127; + cache = new JdbcParameterLong[cacheSize]; + for (int i = 0; i < cache.length; ++i) { + cache[i] = new JdbcParameterLong(i); + } + } + private final long value; - public JdbcParameterLong(long value){ + private JdbcParameterLong(long value){ this.value = value; } + + public static JdbcParameterLong valueOf(long value) { + if (value >= 0 && value < cache.length) { + return cache[(int) value]; + } + + return new JdbcParameterLong(value); + } @Override public Object getValue() { diff --git a/src/main/java/com/alibaba/druid/proxy/jdbc/JdbcParameterNull.java b/src/main/java/com/alibaba/druid/proxy/jdbc/JdbcParameterNull.java index faa68fe175..b372424857 100644 --- a/src/main/java/com/alibaba/druid/proxy/jdbc/JdbcParameterNull.java +++ b/src/main/java/com/alibaba/druid/proxy/jdbc/JdbcParameterNull.java @@ -1,12 +1,36 @@ package com.alibaba.druid.proxy.jdbc; +import java.sql.Types; import java.util.Calendar; public final class JdbcParameterNull implements JdbcParameter { - private final int sqlType; + private final int sqlType; - public JdbcParameterNull(int sqlType){ + public final static JdbcParameterNull CHAR = new JdbcParameterNull(Types.CHAR); + public final static JdbcParameterNull VARCHAR = new JdbcParameterNull(Types.VARCHAR); + public final static JdbcParameterNull NVARCHAR = new JdbcParameterNull(Types.NVARCHAR); + + public final static JdbcParameterNull BINARY = new JdbcParameterNull(Types.BINARY); + public final static JdbcParameterNull VARBINARY = new JdbcParameterNull(Types.VARBINARY); + + public final static JdbcParameterNull TINYINT = new JdbcParameterNull(Types.TINYINT); + public final static JdbcParameterNull SMALLINT = new JdbcParameterNull(Types.SMALLINT); + public final static JdbcParameterNull INTEGER = new JdbcParameterNull(Types.INTEGER); + public final static JdbcParameterNull BIGINT = new JdbcParameterNull(Types.BIGINT); + + public final static JdbcParameterNull DECIMAL = new JdbcParameterNull(Types.DECIMAL); + public final static JdbcParameterNull NUMERIC = new JdbcParameterNull(Types.NUMERIC); + public final static JdbcParameterNull FLOAT = new JdbcParameterNull(Types.FLOAT); + public final static JdbcParameterNull DOUBLE = new JdbcParameterNull(Types.DOUBLE); + + public final static JdbcParameterNull NULL = new JdbcParameterNull(Types.NULL); + + public final static JdbcParameterNull DATE = new JdbcParameterNull(Types.DATE); + public final static JdbcParameterNull TIME = new JdbcParameterNull(Types.TIME); + public final static JdbcParameterNull TIMESTAMP = new JdbcParameterNull(Types.TIMESTAMP); + + private JdbcParameterNull(int sqlType){ this.sqlType = sqlType; } @@ -30,4 +54,50 @@ public final class JdbcParameterNull implements JdbcParameter { return sqlType; } + public static JdbcParameterNull valueOf(int sqlType) { + switch (sqlType) { + case Types.TINYINT: + return INTEGER; + case Types.SMALLINT: + return SMALLINT; + case Types.INTEGER: + return INTEGER; + case Types.BIGINT: + return BIGINT; + + case Types.DECIMAL: + return DECIMAL; + case Types.NUMERIC: + return NUMERIC; + case Types.FLOAT: + return FLOAT; + case Types.DOUBLE: + return DOUBLE; + + case Types.CHAR: + return CHAR; + case Types.VARCHAR: + return VARCHAR; + case Types.NVARCHAR: + return NVARCHAR; + + case Types.BINARY: + return BINARY; + case Types.VARBINARY: + return VARBINARY; + + case Types.TIME: + return TIME; + case Types.DATE: + return DATE; + case Types.TIMESTAMP: + return TIMESTAMP; + + case Types.NULL: + return NULL; + + default: + return new JdbcParameterNull(sqlType); + } + } } 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 01d20e7968..91e71e1809 100644 --- a/src/main/java/com/alibaba/druid/proxy/jdbc/PreparedStatementProxyImpl.java +++ b/src/main/java/com/alibaba/druid/proxy/jdbc/PreparedStatementProxyImpl.java @@ -612,30 +612,47 @@ public class PreparedStatementProxyImpl extends StatementProxyImpl implements Pr } private JdbcParameter createParemeter(int x) { - return new JdbcParameterInt(x); + return JdbcParameterInt.valueOf(x); } private JdbcParameter createParameter(long x) { - return new JdbcParameterLong(x); + return JdbcParameterLong.valueOf(x); } private JdbcParameter createParameterNull(int sqlType) { - return new JdbcParameterNull(sqlType); + return JdbcParameterNull.valueOf(sqlType); + } private JdbcParameter createParameter(java.util.Date x) { + if (x == null) { + return JdbcParameterNull.DATE; + } + return new JdbcParameterDate(x); } private JdbcParameter createParameter(BigDecimal x) { - return new JdbcParameterDecimal(x); + if (x == null) { + return JdbcParameterNull.DECIMAL; + } + + return JdbcParameterDecimal.valueOf(x); } private JdbcParameter createParameter(String x) { + if (x == null) { + return JdbcParameterNull.VARCHAR; + } + return new JdbcParameterString(x); } private JdbcParameter createParameter(Timestamp x) { + if (x == null) { + return JdbcParameterNull.TIMESTAMP; + } + return new JdbcParameterTimestamp(x); }