diff --git a/sharding-core/sharding-core-execute/src/main/java/org/apache/shardingsphere/core/execute/sql/execute/result/QueryResultUtil.java b/sharding-core/sharding-core-execute/src/main/java/org/apache/shardingsphere/core/execute/sql/execute/result/QueryResultUtil.java index b03294ac4e8dac9acd7406ccb5ebdde258ab6eca..5f2747b24eb0d7d25262f677adb5f092235d8c20 100644 --- a/sharding-core/sharding-core-execute/src/main/java/org/apache/shardingsphere/core/execute/sql/execute/result/QueryResultUtil.java +++ b/sharding-core/sharding-core-execute/src/main/java/org/apache/shardingsphere/core/execute/sql/execute/result/QueryResultUtil.java @@ -20,9 +20,15 @@ package org.apache.shardingsphere.core.execute.sql.execute.result; import lombok.AccessLevel; import lombok.NoArgsConstructor; +import java.math.BigDecimal; +import java.sql.Blob; +import java.sql.Clob; +import java.sql.Date; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.SQLException; +import java.sql.Time; +import java.sql.Timestamp; import java.sql.Types; /** @@ -46,6 +52,51 @@ public final class QueryResultUtil { return resultSet.wasNull() ? null : result; } + /** + * Get value by target class. + * + * @param resultSet result set + * @param columnIndex column index of value + * @param targetClass target class + * @return {@code null} if the column is SQL {@code NULL}, otherwise the value of column + * @throws SQLException SQL exception + */ + public static Object getValue(final ResultSet resultSet, final int columnIndex, final Class targetClass) throws SQLException { + if (boolean.class == targetClass) { + return resultSet.getBoolean(columnIndex); + } else if (byte.class == targetClass) { + return resultSet.getByte(columnIndex); + } else if (short.class == targetClass) { + return resultSet.getShort(columnIndex); + } else if (int.class == targetClass) { + return resultSet.getInt(columnIndex); + } else if (long.class == targetClass) { + return resultSet.getLong(columnIndex); + } else if (float.class == targetClass) { + return resultSet.getFloat(columnIndex); + } else if (double.class == targetClass) { + return resultSet.getDouble(columnIndex); + } else if (String.class == targetClass) { + return resultSet.getString(columnIndex); + } else if (BigDecimal.class == targetClass) { + return resultSet.getBigDecimal(columnIndex); + } else if (byte[].class == targetClass) { + return resultSet.getBytes(columnIndex); + } else if (Date.class == targetClass) { + return resultSet.getDate(columnIndex); + } else if (Time.class == targetClass) { + return resultSet.getTime(columnIndex); + } else if (Timestamp.class == targetClass) { + return resultSet.getTimestamp(columnIndex); + } else if (Blob.class == targetClass) { + return resultSet.getBlob(columnIndex); + } else if (Clob.class == targetClass) { + return resultSet.getClob(columnIndex); + } else { + return resultSet.getObject(columnIndex); + } + } + private static Object getValueByColumnType(final ResultSet resultSet, final int columnIndex) throws SQLException { ResultSetMetaData metaData = resultSet.getMetaData(); switch (metaData.getColumnType(columnIndex)) { diff --git a/sharding-core/sharding-core-execute/src/main/java/org/apache/shardingsphere/core/execute/sql/execute/result/StreamQueryResult.java b/sharding-core/sharding-core-execute/src/main/java/org/apache/shardingsphere/core/execute/sql/execute/result/StreamQueryResult.java index 24ee2b93599ee577593f59ca85928e9a6574ab7d..658d25e154b3b71a1ffa925d1dc900dc6c3ba69e 100644 --- a/sharding-core/sharding-core-execute/src/main/java/org/apache/shardingsphere/core/execute/sql/execute/result/StreamQueryResult.java +++ b/sharding-core/sharding-core-execute/src/main/java/org/apache/shardingsphere/core/execute/sql/execute/result/StreamQueryResult.java @@ -68,12 +68,12 @@ public final class StreamQueryResult implements QueryResult { @Override public Object getValue(final int columnIndex, final Class type) throws SQLException { - return decrypt(columnIndex, QueryResultUtil.getValue(resultSet, columnIndex)); + return decrypt(columnIndex, QueryResultUtil.getValue(resultSet, columnIndex, type)); } @Override public Object getValue(final String columnLabel, final Class type) throws SQLException { - return decrypt(columnLabel, QueryResultUtil.getValue(resultSet, queryResultMetaData.getColumnIndex(columnLabel))); + return decrypt(columnLabel, QueryResultUtil.getValue(resultSet, queryResultMetaData.getColumnIndex(columnLabel), type)); } @Override diff --git a/sharding-core/sharding-core-execute/src/test/java/org/apache/shardingsphere/core/execute/sql/execute/result/QueryResultUtilTest.java b/sharding-core/sharding-core-execute/src/test/java/org/apache/shardingsphere/core/execute/sql/execute/result/QueryResultUtilTest.java index 7ce0b72cbbe67dfb760698b822deee97097f90b4..1729cd10506cb382f69c96511f95715aac227cc1 100644 --- a/sharding-core/sharding-core-execute/src/test/java/org/apache/shardingsphere/core/execute/sql/execute/result/QueryResultUtilTest.java +++ b/sharding-core/sharding-core-execute/src/test/java/org/apache/shardingsphere/core/execute/sql/execute/result/QueryResultUtilTest.java @@ -69,20 +69,24 @@ public final class QueryResultUtilTest { when(resultSetMetaData.getColumnType(1)).thenReturn(Types.BOOLEAN); when(resultSet.getBoolean(1)).thenReturn(true); assertTrue((boolean) QueryResultUtil.getValue(resultSet, 1)); + assertTrue((boolean) QueryResultUtil.getValue(resultSet, 1, boolean.class)); } @Test public void assertGetValueByTinyint() throws SQLException { when(resultSetMetaData.getColumnType(1)).thenReturn(Types.TINYINT); - when(resultSet.getInt(1)).thenReturn(Integer.MAX_VALUE); - assertThat((int) QueryResultUtil.getValue(resultSet, 1), is(Integer.MAX_VALUE)); + when(resultSet.getInt(1)).thenReturn(1); + assertThat((int) QueryResultUtil.getValue(resultSet, 1), is(1)); + assertThat((int) QueryResultUtil.getValue(resultSet, 1, int.class), is(1)); } @Test public void assertGetValueBySmallint() throws SQLException { when(resultSetMetaData.getColumnType(1)).thenReturn(Types.SMALLINT); - when(resultSet.getInt(1)).thenReturn(Integer.MAX_VALUE); - assertThat((int) QueryResultUtil.getValue(resultSet, 1), is(Integer.MAX_VALUE)); + when(resultSet.getInt(1)).thenReturn(32767); + assertThat((int) QueryResultUtil.getValue(resultSet, 1), is(32767)); + assertThat((int) QueryResultUtil.getValue(resultSet, 1, int.class), is(32767)); + } @Test @@ -90,6 +94,8 @@ public final class QueryResultUtilTest { when(resultSetMetaData.getColumnType(1)).thenReturn(Types.INTEGER); when(resultSet.getInt(1)).thenReturn(Integer.MAX_VALUE); assertThat((int) QueryResultUtil.getValue(resultSet, 1), is(Integer.MAX_VALUE)); + assertThat((int) QueryResultUtil.getValue(resultSet, 1, int.class), is(Integer.MAX_VALUE)); + } @Test @@ -97,6 +103,7 @@ public final class QueryResultUtilTest { when(resultSetMetaData.getColumnType(1)).thenReturn(Types.BIGINT); when(resultSet.getLong(1)).thenReturn(Long.MAX_VALUE); assertThat((long) QueryResultUtil.getValue(resultSet, 1), is(Long.MAX_VALUE)); + assertThat((long) QueryResultUtil.getValue(resultSet, 1, long.class), is(Long.MAX_VALUE)); } @Test @@ -104,6 +111,7 @@ public final class QueryResultUtilTest { when(resultSetMetaData.getColumnType(1)).thenReturn(Types.NUMERIC); when(resultSet.getBigDecimal(1)).thenReturn(BigDecimal.TEN); assertThat((BigDecimal) QueryResultUtil.getValue(resultSet, 1), is(BigDecimal.TEN)); + assertThat((BigDecimal) QueryResultUtil.getValue(resultSet, 1, BigDecimal.class), is(BigDecimal.TEN)); } @Test @@ -111,13 +119,17 @@ public final class QueryResultUtilTest { when(resultSetMetaData.getColumnType(1)).thenReturn(Types.DECIMAL); when(resultSet.getBigDecimal(1)).thenReturn(BigDecimal.TEN); assertThat((BigDecimal) QueryResultUtil.getValue(resultSet, 1), is(BigDecimal.TEN)); + assertThat((BigDecimal) QueryResultUtil.getValue(resultSet, 1, BigDecimal.class), is(BigDecimal.TEN)); + } @Test public void assertGetValueByFloat() throws SQLException { when(resultSetMetaData.getColumnType(1)).thenReturn(Types.FLOAT); when(resultSet.getDouble(1)).thenReturn(Double.MAX_VALUE); + when(resultSet.getFloat(1)).thenReturn(Float.MAX_VALUE); assertThat((double) QueryResultUtil.getValue(resultSet, 1), is(Double.MAX_VALUE)); + assertThat((float) QueryResultUtil.getValue(resultSet, 1, float.class), is(Float.MAX_VALUE)); } @Test @@ -125,6 +137,8 @@ public final class QueryResultUtilTest { when(resultSetMetaData.getColumnType(1)).thenReturn(Types.DOUBLE); when(resultSet.getDouble(1)).thenReturn(Double.MAX_VALUE); assertThat((double) QueryResultUtil.getValue(resultSet, 1), is(Double.MAX_VALUE)); + assertThat((double) QueryResultUtil.getValue(resultSet, 1, double.class), is(Double.MAX_VALUE)); + } @Test @@ -132,6 +146,7 @@ public final class QueryResultUtilTest { when(resultSetMetaData.getColumnType(1)).thenReturn(Types.CHAR); when(resultSet.getString(1)).thenReturn("x"); assertThat((String) QueryResultUtil.getValue(resultSet, 1), is("x")); + assertThat((String) QueryResultUtil.getValue(resultSet, 1, String.class), is("x")); } @Test @@ -139,6 +154,7 @@ public final class QueryResultUtilTest { when(resultSetMetaData.getColumnType(1)).thenReturn(Types.VARCHAR); when(resultSet.getString(1)).thenReturn("xxxxx"); assertThat((String) QueryResultUtil.getValue(resultSet, 1), is("xxxxx")); + assertThat((String) QueryResultUtil.getValue(resultSet, 1, String.class), is("xxxxx")); } @Test @@ -146,6 +162,7 @@ public final class QueryResultUtilTest { when(resultSetMetaData.getColumnType(1)).thenReturn(Types.LONGVARCHAR); when(resultSet.getString(1)).thenReturn("xxxxx"); assertThat((String) QueryResultUtil.getValue(resultSet, 1), is("xxxxx")); + assertThat((String) QueryResultUtil.getValue(resultSet, 1, String.class), is("xxxxx")); } @Test @@ -154,6 +171,7 @@ public final class QueryResultUtilTest { when(resultSetMetaData.getColumnType(1)).thenReturn(Types.BINARY); when(resultSet.getBlob(1)).thenReturn(blob); assertThat((Blob) QueryResultUtil.getValue(resultSet, 1), is(blob)); + assertThat((Blob) QueryResultUtil.getValue(resultSet, 1, Blob.class), is(blob)); } @Test @@ -162,6 +180,8 @@ public final class QueryResultUtilTest { when(resultSetMetaData.getColumnType(1)).thenReturn(Types.VARBINARY); when(resultSet.getBlob(1)).thenReturn(blob); assertThat((Blob) QueryResultUtil.getValue(resultSet, 1), is(blob)); + assertThat((Blob) QueryResultUtil.getValue(resultSet, 1, Blob.class), is(blob)); + } @Test @@ -170,6 +190,8 @@ public final class QueryResultUtilTest { when(resultSetMetaData.getColumnType(1)).thenReturn(Types.LONGVARBINARY); when(resultSet.getBlob(1)).thenReturn(blob); assertThat((Blob) QueryResultUtil.getValue(resultSet, 1), is(blob)); + assertThat((Blob) QueryResultUtil.getValue(resultSet, 1, Blob.class), is(blob)); + } @Test @@ -178,6 +200,7 @@ public final class QueryResultUtilTest { when(resultSetMetaData.getColumnType(1)).thenReturn(Types.DATE); when(resultSet.getDate(1)).thenReturn(new Date(currentTime)); assertThat((Date) QueryResultUtil.getValue(resultSet, 1), is(new Date(currentTime))); + assertThat((Date) QueryResultUtil.getValue(resultSet, 1, Date.class), is(new Date(currentTime))); } @Test @@ -186,6 +209,7 @@ public final class QueryResultUtilTest { when(resultSetMetaData.getColumnType(1)).thenReturn(Types.TIME); when(resultSet.getTime(1)).thenReturn(new Time(currentTime)); assertThat((Time) QueryResultUtil.getValue(resultSet, 1), is(new Time(currentTime))); + assertThat((Time) QueryResultUtil.getValue(resultSet, 1, Time.class), is(new Time(currentTime))); } @Test @@ -194,6 +218,7 @@ public final class QueryResultUtilTest { when(resultSetMetaData.getColumnType(1)).thenReturn(Types.TIMESTAMP); when(resultSet.getTimestamp(1)).thenReturn(new Timestamp(currentTime)); assertThat((Timestamp) QueryResultUtil.getValue(resultSet, 1), is(new Timestamp(currentTime))); + assertThat((Timestamp) QueryResultUtil.getValue(resultSet, 1, Timestamp.class), is(new Timestamp(currentTime))); } @Test @@ -203,6 +228,7 @@ public final class QueryResultUtilTest { when(resultSetMetaData.getColumnType(1)).thenReturn(Types.CLOB); when(resultSet.getClob(1)).thenReturn(clob); assertThat((Clob) QueryResultUtil.getValue(resultSet, 1), is(clob)); + assertThat((Clob) QueryResultUtil.getValue(resultSet, 1, Clob.class), is(clob)); } @Test @@ -211,6 +237,27 @@ public final class QueryResultUtilTest { when(resultSetMetaData.getColumnType(1)).thenReturn(Types.BLOB); when(resultSet.getBlob(1)).thenReturn(blob); assertThat((Blob) QueryResultUtil.getValue(resultSet, 1), is(blob)); + assertThat((Blob) QueryResultUtil.getValue(resultSet, 1, Blob.class), is(blob)); + } + + @Test + public void assertGetValueByShort() throws SQLException { + when(resultSet.getShort(1)).thenReturn(Short.MAX_VALUE); + assertThat((short) QueryResultUtil.getValue(resultSet, 1, short.class), is(Short.MAX_VALUE)); + } + + @Test + public void assertGetValueByByte() throws SQLException { + byte value = 0x00; + when(resultSet.getByte(1)).thenReturn(value); + assertThat((byte) QueryResultUtil.getValue(resultSet, 1, byte.class), is(value)); + } + + @Test + public void assertGetValueByBytes() throws SQLException { + byte[] values = new byte[] {0x00}; + when(resultSet.getBytes(1)).thenReturn(values); + assertThat((byte[]) QueryResultUtil.getValue(resultSet, 1, byte[].class), is(values)); } @Test @@ -219,6 +266,7 @@ public final class QueryResultUtilTest { when(resultSetMetaData.getColumnType(1)).thenReturn(Types.OTHER); when(resultSet.getObject(1)).thenReturn(object); assertThat(QueryResultUtil.getValue(resultSet, 1), is(object)); + assertThat(QueryResultUtil.getValue(resultSet, 1, Object.class), is(object)); } @Test diff --git a/sharding-core/sharding-core-execute/src/test/java/org/apache/shardingsphere/core/execute/sql/execute/result/StreamQueryResultTest.java b/sharding-core/sharding-core-execute/src/test/java/org/apache/shardingsphere/core/execute/sql/execute/result/StreamQueryResultTest.java index 915ffb8dfa75836f6fb1b81bf2665542da7aaed9..9295d29333b5137a4b7db38b18056da0e6a7d8d0 100644 --- a/sharding-core/sharding-core-execute/src/test/java/org/apache/shardingsphere/core/execute/sql/execute/result/StreamQueryResultTest.java +++ b/sharding-core/sharding-core-execute/src/test/java/org/apache/shardingsphere/core/execute/sql/execute/result/StreamQueryResultTest.java @@ -34,7 +34,6 @@ import java.sql.ResultSetMetaData; import java.sql.SQLException; import java.sql.Time; import java.sql.Timestamp; -import java.sql.Types; import java.util.Calendar; import java.util.Properties; @@ -95,14 +94,14 @@ public final class StreamQueryResultTest { public void assertGetValueWithColumnIndex() throws SQLException { StreamQueryResult queryResult = new StreamQueryResult(getResultSet()); queryResult.next(); - assertThat(queryResult.getValue(1, Integer.class), Is.is(1)); + assertThat(queryResult.getValue(1, int.class), Is.is(1)); } @Test public void assertGetValueWithColumnLabel() throws SQLException { StreamQueryResult queryResult = new StreamQueryResult(getResultSet()); queryResult.next(); - assertThat(queryResult.getValue("order_id", Integer.class), Is.is(1)); + assertThat(queryResult.getValue("order_id", int.class), Is.is(1)); } @Test @@ -110,7 +109,7 @@ public final class StreamQueryResultTest { when(shardingEncryptor.decrypt("1")).thenReturn("1"); StreamQueryResult queryResult = new StreamQueryResult(getResultSet(), getShardingRule(), new ShardingProperties(new Properties())); queryResult.next(); - assertThat(queryResult.getValue("order_id", Integer.class), Is.is("1")); + assertThat(queryResult.getValue("order_id", int.class), Is.is("1")); } @Test(expected = Exception.class) @@ -118,14 +117,13 @@ public final class StreamQueryResultTest { ResultSet resultSet = getResultSetWithException(); StreamQueryResult queryResult = new StreamQueryResult(resultSet); queryResult.next(); - queryResult.getValue("order_id", Integer.class); + queryResult.getValue("order_id", int.class); } private ResultSet getResultSetWithException() throws SQLException { ResultSet result = mock(ResultSet.class); when(result.next()).thenReturn(true).thenReturn(false); when(result.getInt(1)).thenReturn(1); - when(result.wasNull()).thenReturn(false); doReturn(getResultSetMetaDataWithException()).when(result).getMetaData(); return result; } @@ -135,7 +133,6 @@ public final class StreamQueryResultTest { when(result.getColumnCount()).thenReturn(1); when(result.getColumnLabel(1)).thenReturn("order_id"); when(result.getColumnName(1)).thenThrow(new SQLException()); - when(result.getColumnType(1)).thenReturn(Types.INTEGER); when(result.getTableName(1)).thenReturn("order"); return result; } @@ -325,7 +322,6 @@ public final class StreamQueryResultTest { when(metaData.getColumnCount()).thenReturn(1); when(metaData.getColumnLabel(1)).thenReturn("order_id"); when(metaData.getColumnName(1)).thenReturn("order_id"); - when(metaData.getColumnType(1)).thenReturn(Types.INTEGER); when(metaData.getTableName(1)).thenReturn("order"); when(metaData.isCaseSensitive(1)).thenReturn(false); return metaData;