diff --git a/sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/jdbc/adapter/AbstractMasterSlavePreparedStatementAdapter.java b/sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/jdbc/adapter/AbstractMasterSlavePreparedStatementAdapter.java new file mode 100644 index 0000000000000..2f27914b18ede --- /dev/null +++ b/sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/jdbc/adapter/AbstractMasterSlavePreparedStatementAdapter.java @@ -0,0 +1,245 @@ +/* + * Copyright 1999-2015 dangdang.com. + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *

+ */ + +package com.dangdang.ddframe.rdb.sharding.jdbc.adapter; + +import com.dangdang.ddframe.rdb.sharding.jdbc.unsupported.AbstractUnsupportedOperationPreparedStatement; + +import java.io.InputStream; +import java.io.Reader; +import java.math.BigDecimal; +import java.net.URL; +import java.sql.Blob; +import java.sql.Clob; +import java.sql.Date; +import java.sql.PreparedStatement; +import java.sql.SQLException; +import java.sql.SQLXML; +import java.sql.Time; +import java.sql.Timestamp; +import java.util.Calendar; + +/** + * Master-slave adapter for {@code PreparedStatement}. + * + * @author zhangliang + */ +public abstract class AbstractMasterSlavePreparedStatementAdapter extends AbstractUnsupportedOperationPreparedStatement { + + @Override + public final void setNull(final int parameterIndex, final int sqlType) throws SQLException { + getTargetStatement().setNull(parameterIndex, sqlType); + } + + @Override + public final void setNull(final int parameterIndex, final int sqlType, final String typeName) throws SQLException { + getTargetStatement().setNull(parameterIndex, sqlType, typeName); + } + + @Override + public final void setBoolean(final int parameterIndex, final boolean x) throws SQLException { + getTargetStatement().setBoolean(parameterIndex, x); + } + + @Override + public final void setByte(final int parameterIndex, final byte x) throws SQLException { + getTargetStatement().setByte(parameterIndex, x); + } + + @Override + public final void setShort(final int parameterIndex, final short x) throws SQLException { + getTargetStatement().setShort(parameterIndex, x); + } + + @Override + public final void setInt(final int parameterIndex, final int x) throws SQLException { + getTargetStatement().setInt(parameterIndex, x); + } + + @Override + public final void setLong(final int parameterIndex, final long x) throws SQLException { + getTargetStatement().setLong(parameterIndex, x); + } + + @Override + public final void setFloat(final int parameterIndex, final float x) throws SQLException { + getTargetStatement().setFloat(parameterIndex, x); + } + + @Override + public final void setDouble(final int parameterIndex, final double x) throws SQLException { + getTargetStatement().setDouble(parameterIndex, x); + } + + @Override + public final void setString(final int parameterIndex, final String x) throws SQLException { + getTargetStatement().setString(parameterIndex, x); + } + + @Override + public final void setBigDecimal(final int parameterIndex, final BigDecimal x) throws SQLException { + getTargetStatement().setBigDecimal(parameterIndex, x); + } + + @Override + public final void setDate(final int parameterIndex, final Date x) throws SQLException { + getTargetStatement().setDate(parameterIndex, x); + } + + @Override + public final void setDate(final int parameterIndex, final Date x, final Calendar cal) throws SQLException { + getTargetStatement().setDate(parameterIndex, x, cal); + } + + @Override + public final void setTime(final int parameterIndex, final Time x) throws SQLException { + getTargetStatement().setTime(parameterIndex, x); + } + + @Override + public final void setTime(final int parameterIndex, final Time x, final Calendar cal) throws SQLException { + getTargetStatement().setTime(parameterIndex, x, cal); + } + + @Override + public final void setTimestamp(final int parameterIndex, final Timestamp x) throws SQLException { + getTargetStatement().setTimestamp(parameterIndex, x); + } + + @Override + public final void setTimestamp(final int parameterIndex, final Timestamp x, final Calendar cal) throws SQLException { + getTargetStatement().setTimestamp(parameterIndex, x, cal); + } + + @Override + public final void setBytes(final int parameterIndex, final byte[] x) throws SQLException { + getTargetStatement().setBytes(parameterIndex, x); + } + + @Override + public final void setBlob(final int parameterIndex, final Blob x) throws SQLException { + getTargetStatement().setBlob(parameterIndex, x); + } + + @Override + public final void setBlob(final int parameterIndex, final InputStream x) throws SQLException { + getTargetStatement().setBlob(parameterIndex, x); + } + + @Override + public final void setBlob(final int parameterIndex, final InputStream x, final long length) throws SQLException { + getTargetStatement().setBlob(parameterIndex, x, length); + } + + @Override + public final void setClob(final int parameterIndex, final Clob x) throws SQLException { + getTargetStatement().setClob(parameterIndex, x); + } + + @Override + public final void setClob(final int parameterIndex, final Reader x) throws SQLException { + getTargetStatement().setClob(parameterIndex, x); + } + + @Override + public final void setClob(final int parameterIndex, final Reader x, final long length) throws SQLException { + getTargetStatement().setClob(parameterIndex, x, length); + } + + @Override + public final void setAsciiStream(final int parameterIndex, final InputStream x) throws SQLException { + getTargetStatement().setAsciiStream(parameterIndex, x); + } + + @Override + public final void setAsciiStream(final int parameterIndex, final InputStream x, final int length) throws SQLException { + getTargetStatement().setAsciiStream(parameterIndex, x, length); + } + + @Override + public final void setAsciiStream(final int parameterIndex, final InputStream x, final long length) throws SQLException { + getTargetStatement().setAsciiStream(parameterIndex, x, length); + } + + @SuppressWarnings("deprecation") + @Override + public final void setUnicodeStream(final int parameterIndex, final InputStream x, final int length) throws SQLException { + getTargetStatement().setUnicodeStream(parameterIndex, x, length); + } + + @Override + public final void setBinaryStream(final int parameterIndex, final InputStream x) throws SQLException { + getTargetStatement().setBinaryStream(parameterIndex, x); + } + + @Override + public final void setBinaryStream(final int parameterIndex, final InputStream x, final int length) throws SQLException { + getTargetStatement().setBinaryStream(parameterIndex, x, length); + } + + @Override + public final void setBinaryStream(final int parameterIndex, final InputStream x, final long length) throws SQLException { + getTargetStatement().setBinaryStream(parameterIndex, x, length); + } + + @Override + public final void setCharacterStream(final int parameterIndex, final Reader x) throws SQLException { + getTargetStatement().setCharacterStream(parameterIndex, x); + } + + @Override + public final void setCharacterStream(final int parameterIndex, final Reader x, final int length) throws SQLException { + getTargetStatement().setCharacterStream(parameterIndex, x, length); + } + + @Override + public final void setCharacterStream(final int parameterIndex, final Reader x, final long length) throws SQLException { + getTargetStatement().setCharacterStream(parameterIndex, x, length); + } + + @Override + public void setSQLXML(final int parameterIndex, final SQLXML x) throws SQLException { + getTargetStatement().setSQLXML(parameterIndex, x); + } + + @Override + public void setURL(final int parameterIndex, final URL x) throws SQLException { + getTargetStatement().setURL(parameterIndex, x); + } + + @Override + public void setObject(final int parameterIndex, final Object x) throws SQLException { + getTargetStatement().setObject(parameterIndex, x); + } + + @Override + public void setObject(final int parameterIndex, final Object x, final int targetSqlType) throws SQLException { + getTargetStatement().setObject(parameterIndex, x, targetSqlType); + } + + @Override + public void setObject(final int parameterIndex, final Object x, final int targetSqlType, final int scaleOrLength) throws SQLException { + getTargetStatement().setObject(parameterIndex, x, targetSqlType, scaleOrLength); + } + + @Override + public final void clearParameters() throws SQLException { + getTargetStatement().clearParameters(); + } + + protected abstract PreparedStatement getTargetStatement(); +} diff --git a/sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/jdbc/adapter/AbstractPreparedStatementAdapter.java b/sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/jdbc/adapter/AbstractShardingPreparedStatementAdapter.java similarity index 98% rename from sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/jdbc/adapter/AbstractPreparedStatementAdapter.java rename to sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/jdbc/adapter/AbstractShardingPreparedStatementAdapter.java index e420611231f32..d3aabefeb9225 100644 --- a/sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/jdbc/adapter/AbstractPreparedStatementAdapter.java +++ b/sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/jdbc/adapter/AbstractShardingPreparedStatementAdapter.java @@ -41,11 +41,11 @@ import java.util.Objects; /** - * Adapter for {@code PreparedStatement}. + * Sharding adapter for {@code PreparedStatement}. * * @author zhangliang */ -public abstract class AbstractPreparedStatementAdapter extends AbstractUnsupportedOperationPreparedStatement { +public abstract class AbstractShardingPreparedStatementAdapter extends AbstractUnsupportedOperationPreparedStatement { private final List setParameterMethodInvocations = new LinkedList<>(); diff --git a/sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/jdbc/core/statement/MasterSlavePreparedStatement.java b/sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/jdbc/core/statement/MasterSlavePreparedStatement.java index 29fed353d2a06..ec160a04b227f 100644 --- a/sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/jdbc/core/statement/MasterSlavePreparedStatement.java +++ b/sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/jdbc/core/statement/MasterSlavePreparedStatement.java @@ -17,7 +17,7 @@ package com.dangdang.ddframe.rdb.sharding.jdbc.core.statement; -import com.dangdang.ddframe.rdb.sharding.jdbc.adapter.AbstractPreparedStatementAdapter; +import com.dangdang.ddframe.rdb.sharding.jdbc.adapter.AbstractMasterSlavePreparedStatementAdapter; import com.dangdang.ddframe.rdb.sharding.jdbc.core.connection.MasterSlaveConnection; import com.dangdang.ddframe.rdb.sharding.parsing.SQLJudgeEngine; import com.dangdang.ddframe.rdb.sharding.parsing.parser.sql.SQLStatement; @@ -37,7 +37,7 @@ * @author zhangliang */ @Getter -public final class MasterSlavePreparedStatement extends AbstractPreparedStatementAdapter { +public final class MasterSlavePreparedStatement extends AbstractMasterSlavePreparedStatementAdapter { private final MasterSlaveConnection connection; @@ -91,28 +91,19 @@ public MasterSlavePreparedStatement(final MasterSlaveConnection connection, fina @Override public ResultSet executeQuery() throws SQLException { Preconditions.checkState(1 == routedStatements.size()); - replaySetParameter(); - return routedStatements.iterator().next().executeQuery(); + return getTargetStatement().executeQuery(); } @Override public int executeUpdate() throws SQLException { Preconditions.checkState(1 == routedStatements.size()); - replaySetParameter(); - return routedStatements.iterator().next().executeUpdate(); - } - - private void replaySetParameter() { - for (PreparedStatement preparedStatement : routedStatements) { - replaySetParameter(preparedStatement); - } + return getTargetStatement().executeUpdate(); } @Override public boolean execute() throws SQLException { boolean result = false; for (PreparedStatement each : routedStatements) { - replaySetParameter(each); result = each.execute(); } return result; @@ -135,33 +126,38 @@ public void addBatch() throws SQLException { @Override public int[] executeBatch() throws SQLException { Preconditions.checkState(1 == routedStatements.size()); - return routedStatements.iterator().next().executeBatch(); + return getTargetStatement().executeBatch(); } @Override public ResultSet getResultSet() throws SQLException { Preconditions.checkState(1 == routedStatements.size()); - return routedStatements.iterator().next().getResultSet(); + return getTargetStatement().getResultSet(); } @Override public ResultSet getGeneratedKeys() throws SQLException { Preconditions.checkState(1 == routedStatements.size()); - return routedStatements.iterator().next().getGeneratedKeys(); + return getTargetStatement().getGeneratedKeys(); } @Override public int getResultSetHoldability() throws SQLException { - return routedStatements.iterator().next().getResultSetHoldability(); + return getTargetStatement().getResultSetHoldability(); } @Override public int getResultSetConcurrency() throws SQLException { - return routedStatements.iterator().next().getResultSetConcurrency(); + return getTargetStatement().getResultSetConcurrency(); } @Override public int getResultSetType() throws SQLException { - return routedStatements.iterator().next().getResultSetType(); + return getTargetStatement().getResultSetType(); + } + + @Override + protected PreparedStatement getTargetStatement() { + return routedStatements.iterator().next(); } } diff --git a/sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/jdbc/core/statement/ShardingPreparedStatement.java b/sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/jdbc/core/statement/ShardingPreparedStatement.java index 0205a4bc95170..2aba88601dc8a 100644 --- a/sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/jdbc/core/statement/ShardingPreparedStatement.java +++ b/sharding-jdbc-core/src/main/java/com/dangdang/ddframe/rdb/sharding/jdbc/core/statement/ShardingPreparedStatement.java @@ -22,7 +22,7 @@ import com.dangdang.ddframe.rdb.sharding.executor.type.batch.BatchPreparedStatementUnit; import com.dangdang.ddframe.rdb.sharding.executor.type.prepared.PreparedStatementExecutor; import com.dangdang.ddframe.rdb.sharding.executor.type.prepared.PreparedStatementUnit; -import com.dangdang.ddframe.rdb.sharding.jdbc.adapter.AbstractPreparedStatementAdapter; +import com.dangdang.ddframe.rdb.sharding.jdbc.adapter.AbstractShardingPreparedStatementAdapter; import com.dangdang.ddframe.rdb.sharding.jdbc.core.connection.ShardingConnection; import com.dangdang.ddframe.rdb.sharding.jdbc.core.resultset.GeneratedKeysResultSet; import com.dangdang.ddframe.rdb.sharding.jdbc.core.resultset.ShardingResultSet; @@ -57,7 +57,7 @@ * @author caohao */ @Getter -public final class ShardingPreparedStatement extends AbstractPreparedStatementAdapter { +public final class ShardingPreparedStatement extends AbstractShardingPreparedStatementAdapter { private final ShardingConnection connection;