From ee886320c88f51cee192815d971c2c073a8b8dfb Mon Sep 17 00:00:00 2001 From: Yuu Nakajima Date: Tue, 13 Apr 2021 22:24:26 +0900 Subject: [PATCH 01/20] Extend to add column value converter --- README.md | 2 +- pom.xml | 2 +- .../extension/AbstractResultSetConverter.java | 2 +- .../extension/DefaultResultSetConverter.java | 50 ++++++++++++++++--- .../sorm4j/extension/ResultSetConverter.java | 6 +-- .../internal/mapping/ColumnsMapping.java | 8 +-- .../sorm4j/internal/mapping/TableMapping.java | 2 +- .../mapping/multirow/OrmConfigStoreTest.java | 43 ++++++++++++---- 8 files changed, 85 insertions(+), 30 deletions(-) diff --git a/README.md b/README.md index 400597b1..6f1e17e8 100644 --- a/README.md +++ b/README.md @@ -33,7 +33,7 @@ The latest release is available at [Maven Central Repository](https://mvnreposit org.nkjmlab sorm4j - 1.3.11 + 1.3.12 ``` diff --git a/pom.xml b/pom.xml index 1b89dad2..fa45f218 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ 4.0.0 org.nkjmlab sorm4j - 1.3.11 + 1.3.12 sorm4j Simple micro Object-Relation Mapper for Java https://github.com/yuu-nkjm/sorm4j diff --git a/src/main/java/org/nkjmlab/sorm4j/extension/AbstractResultSetConverter.java b/src/main/java/org/nkjmlab/sorm4j/extension/AbstractResultSetConverter.java index 258d2d84..6b8c29b7 100644 --- a/src/main/java/org/nkjmlab/sorm4j/extension/AbstractResultSetConverter.java +++ b/src/main/java/org/nkjmlab/sorm4j/extension/AbstractResultSetConverter.java @@ -25,7 +25,7 @@ public final Map toSingleMap(SormOptions options, ResultSet resu @SuppressWarnings("unchecked") public final T toSingleNativeObject(SormOptions options, ResultSet resultSet, int sqlType, Class objectClass) throws SQLException { - return (T) getColumnValue(options, resultSet, 1, sqlType, objectClass); + return (T) convertColumnValueTo(options, resultSet, 1, sqlType, objectClass); } abstract protected Object getColumnValueBySqlType(ResultSet resultSet, int column, int sqlType) diff --git a/src/main/java/org/nkjmlab/sorm4j/extension/DefaultResultSetConverter.java b/src/main/java/org/nkjmlab/sorm4j/extension/DefaultResultSetConverter.java index c11be72d..aba5b234 100644 --- a/src/main/java/org/nkjmlab/sorm4j/extension/DefaultResultSetConverter.java +++ b/src/main/java/org/nkjmlab/sorm4j/extension/DefaultResultSetConverter.java @@ -6,7 +6,10 @@ import java.sql.SQLException; import java.sql.SQLType; import java.time.ZoneId; +import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; +import java.util.List; import java.util.Optional; import java.util.Set; import org.nkjmlab.sorm4j.internal.util.Try; @@ -47,17 +50,48 @@ public boolean isEnableToConvertNativeObject(SormOptions options, Class objec return nativeSqlTypes.contains(objectClass); } + private final List converters; + + public DefaultResultSetConverter() { + this.converters = Collections.emptyList(); + } + + public DefaultResultSetConverter(List converters) { + this.converters = new ArrayList<>(converters); + } + + + public static interface ColumnValueConverter { + boolean isConvertable(SormOptions options, ResultSet resultSet, int column, int columnType, + Class toType); + + Object convertTo(SormOptions options, ResultSet resultSet, int column, int columnType, + Class toType); + } + // 2021-03-26 An approach to create converter at once and apply the converter to get result is // slower than the current code. https://github.com/yuu-nkjm/sorm4j/issues/25 + + @Override - public Object getColumnValue(SormOptions options, ResultSet resultSet, int column, int columnType, - Class setterType) throws SQLException { - if (setterType.isEnum()) { + public Object convertColumnValueTo(SormOptions options, ResultSet resultSet, int column, + int columnType, Class toType) throws SQLException { + + if (converters.size() != 0) { + Optional conv = converters.stream() + .filter(co -> co.isConvertable(options, resultSet, column, columnType, toType)) + .findFirst(); + if (conv.isPresent()) { + return conv.get().convertTo(options, resultSet, column, columnType, toType); + } + } + + if (toType.isEnum()) { final String v = resultSet.getString(column); - return Arrays.stream(setterType.getEnumConstants()).filter(o -> o.toString().equals(v)) - .findAny().orElse(null); - } else if (setterType.isArray()) { - final String name = setterType.getComponentType().getName(); + return Arrays.stream(toType.getEnumConstants()).filter(o -> o.toString().equals(v)).findAny() + .orElse(null); + } else if (toType.isArray()) { + final String name = toType.getComponentType().getName(); switch (name) { case "byte": case "java.lang.Byte": @@ -71,7 +105,7 @@ public Object getColumnValue(SormOptions options, ResultSet resultSet, int colum return resultSet.getObject(column); } } else { - final String name = setterType.getName(); + final String name = toType.getName(); switch (name) { case "boolean": return resultSet.getBoolean(column); diff --git a/src/main/java/org/nkjmlab/sorm4j/extension/ResultSetConverter.java b/src/main/java/org/nkjmlab/sorm4j/extension/ResultSetConverter.java index 91849be5..b8e5ee1c 100644 --- a/src/main/java/org/nkjmlab/sorm4j/extension/ResultSetConverter.java +++ b/src/main/java/org/nkjmlab/sorm4j/extension/ResultSetConverter.java @@ -33,13 +33,13 @@ public interface ResultSetConverter { * @param resultSet {@link java.sql.ResultSet} (positioned in the row to be processed) * @param column column index in the result set (starting with 1) * @param columnType - * @param setterType {@link java.lang.Class} of the object to be returned + * @param toType {@link java.lang.Class} of the object to be returned * * @throws SQLException * */ - Object getColumnValue(SormOptions options, ResultSet resultSet, int column, int columnType, - Class setterType) throws SQLException; + Object convertColumnValueTo(SormOptions options, ResultSet resultSet, int column, int columnType, + Class toType) throws SQLException; /** * Returns the given type could be converted to the native object or not. diff --git a/src/main/java/org/nkjmlab/sorm4j/internal/mapping/ColumnsMapping.java b/src/main/java/org/nkjmlab/sorm4j/internal/mapping/ColumnsMapping.java index 7a673f0c..85eda55b 100644 --- a/src/main/java/org/nkjmlab/sorm4j/internal/mapping/ColumnsMapping.java +++ b/src/main/java/org/nkjmlab/sorm4j/internal/mapping/ColumnsMapping.java @@ -21,8 +21,8 @@ import org.nkjmlab.sorm4j.annotation.OrmConstructor; import org.nkjmlab.sorm4j.extension.Accessor; import org.nkjmlab.sorm4j.extension.DefaultResultSetConverter; -import org.nkjmlab.sorm4j.extension.SormOptions; import org.nkjmlab.sorm4j.extension.ResultSetConverter; +import org.nkjmlab.sorm4j.extension.SormOptions; import org.nkjmlab.sorm4j.internal.util.StringUtils; import org.nkjmlab.sorm4j.internal.util.Try; @@ -143,7 +143,7 @@ private S createPojo(ResultSet resultSet, List columns, int[] sqlTypes, } final String columnName = columns.get(i - 1); final Object value = - resultSetConverter.getColumnValue(options, resultSet, i, sqlType, setterType); + resultSetConverter.convertColumnValueTo(options, resultSet, i, sqlType, setterType); setValue(ret, columnName, value); } return ret; @@ -207,8 +207,8 @@ private S createPojo(ResultSet resultSet, int[] sqlTypes, Class[] parameterTy if (order == -1) { continue; } - params[order] = resultSetConverter.getColumnValue(options, resultSet, i, sqlTypes[i - 1], - parameterTypes[i - 1]); + params[order] = resultSetConverter.convertColumnValueTo(options, resultSet, i, + sqlTypes[i - 1], parameterTypes[i - 1]); } return constructor.newInstance(params); } catch (SQLException e) { diff --git a/src/main/java/org/nkjmlab/sorm4j/internal/mapping/TableMapping.java b/src/main/java/org/nkjmlab/sorm4j/internal/mapping/TableMapping.java index 0f680128..6c52df64 100644 --- a/src/main/java/org/nkjmlab/sorm4j/internal/mapping/TableMapping.java +++ b/src/main/java/org/nkjmlab/sorm4j/internal/mapping/TableMapping.java @@ -113,7 +113,7 @@ private List setAutoGeneratedKeys(PreparedStatement stmt, T object) thro int columnType = metaData.getColumnType(1); Class classType = getSetterParamType(columnName); final Object value = - resultSetConverter.getColumnValue(options, resultSet, 1, columnType, classType); + resultSetConverter.convertColumnValueTo(options, resultSet, 1, columnType, classType); setValue(object, columnName, value); ret.add(value); } diff --git a/src/test/java/org/nkjmlab/sorm4j/internal/mapping/multirow/OrmConfigStoreTest.java b/src/test/java/org/nkjmlab/sorm4j/internal/mapping/multirow/OrmConfigStoreTest.java index cdf0702e..17df6a2c 100644 --- a/src/test/java/org/nkjmlab/sorm4j/internal/mapping/multirow/OrmConfigStoreTest.java +++ b/src/test/java/org/nkjmlab/sorm4j/internal/mapping/multirow/OrmConfigStoreTest.java @@ -3,21 +3,25 @@ import static org.assertj.core.api.Assertions.*; import static org.nkjmlab.sorm4j.common.SormTestUtils.*; import static org.nkjmlab.sorm4j.extension.Configurator.MultiRowProcessorType.*; +import java.sql.ResultSet; +import java.util.List; import org.junit.jupiter.api.Test; -import org.nkjmlab.sorm4j.common.Guest; -import org.nkjmlab.sorm4j.common.SormTestUtils; import org.nkjmlab.sorm4j.Sorm; import org.nkjmlab.sorm4j.SormFactory; +import org.nkjmlab.sorm4j.common.Guest; +import org.nkjmlab.sorm4j.common.SormTestUtils; import org.nkjmlab.sorm4j.extension.ColumnFieldMapper; import org.nkjmlab.sorm4j.extension.Configurator; +import org.nkjmlab.sorm4j.extension.Configurator.MultiRowProcessorType; import org.nkjmlab.sorm4j.extension.DefaultColumnFieldMapper; import org.nkjmlab.sorm4j.extension.DefaultResultSetConverter; +import org.nkjmlab.sorm4j.extension.DefaultResultSetConverter.ColumnValueConverter; import org.nkjmlab.sorm4j.extension.DefaultSqlParameterSetter; import org.nkjmlab.sorm4j.extension.DefaultTableNameMapper; import org.nkjmlab.sorm4j.extension.ResultSetConverter; +import org.nkjmlab.sorm4j.extension.SormOptions; import org.nkjmlab.sorm4j.extension.SqlParameterSetter; import org.nkjmlab.sorm4j.extension.TableNameMapper; -import org.nkjmlab.sorm4j.extension.Configurator.MultiRowProcessorType; import org.nkjmlab.sorm4j.internal.mapping.ConfigStore; class OrmConfigStoreTest { @@ -27,9 +31,9 @@ class OrmConfigStoreTest { private static final ColumnFieldMapper DEFAULT_COLUMN_FIELD_MAPPER = new DefaultColumnFieldMapper(); private static final TableNameMapper DEFAULT_TABLE_NAME_MAPPER = new DefaultTableNameMapper(); - private static final ResultSetConverter DEFAULT_SQL_TO_JAVA_DATA_CONVERTER = + private static final ResultSetConverter DEFAULT_RESULT_SET_CONVERTER = new DefaultResultSetConverter(); - private static final SqlParameterSetter DEFAULT_JAVA_TO_SQL_DATA_CONVERTER = + private static final SqlParameterSetter DEFAULT_SQL_PARAMETER_SETTER = new DefaultSqlParameterSetter(); private static final MultiRowProcessorType DEFAULT_MULTI_ROW_PROCESSOR = MULTI_ROW; @@ -48,11 +52,27 @@ void testOrmConfigFail() { @Test void testOrmConfigStore() { + DefaultResultSetConverter rsc = + new DefaultResultSetConverter(List.of(new ColumnValueConverter() { + + @Override + public boolean isConvertable(SormOptions options, ResultSet resultSet, int column, + int columnType, Class toType) { + // TODO Auto-generated method stub + return false; + } + + @Override + public Object convertTo(SormOptions options, ResultSet resultSet, int column, + int columnType, Class toType) { + // TODO Auto-generated method stub + return null; + } + })); SormFactory.registerConfig(NEW_CONFIG, b -> b.setColumnFieldMapper(DEFAULT_COLUMN_FIELD_MAPPER) - .setTableNameMapper(DEFAULT_TABLE_NAME_MAPPER) - .setResultSetConverter(DEFAULT_SQL_TO_JAVA_DATA_CONVERTER) - .setSqlParameterSetter(DEFAULT_JAVA_TO_SQL_DATA_CONVERTER) + .setTableNameMapper(DEFAULT_TABLE_NAME_MAPPER).setResultSetConverter(rsc) + .setSqlParameterSetter(DEFAULT_SQL_PARAMETER_SETTER) .setMultiRowProcessorType(DEFAULT_MULTI_ROW_PROCESSOR).setBatchSize(10) .setMultiRowSize(20).setBatchSizeWithMultiRow(30)); @@ -61,8 +81,8 @@ void testOrmConfigStore() { assertThat(confs.getConfigName()).isEqualTo(NEW_CONFIG); assertThat(confs.getColumnFieldMapper()).isEqualTo(DEFAULT_COLUMN_FIELD_MAPPER); assertThat(confs.getTableNameMapper()).isEqualTo(DEFAULT_TABLE_NAME_MAPPER); - assertThat(confs.getResultSetConverter()).isEqualTo(DEFAULT_SQL_TO_JAVA_DATA_CONVERTER); - assertThat(confs.getSqlParameterSetter()).isEqualTo(DEFAULT_JAVA_TO_SQL_DATA_CONVERTER); + assertThat(confs.getResultSetConverter()).isEqualTo(rsc); + assertThat(confs.getSqlParameterSetter()).isEqualTo(DEFAULT_SQL_PARAMETER_SETTER); } @Test @@ -70,7 +90,8 @@ void testConfigUpdate() { SormFactory.updateDefaultConfig(builder -> builder .setMultiRowProcessorType(Configurator.MultiRowProcessorType.MULTI_ROW_AND_BATCH)); Sorm sorm = SormTestUtils.createSormAndDropAndCreateTableAll(); - assertThat(sorm.getConfigString()).contains(Configurator.MultiRowProcessorType.MULTI_ROW_AND_BATCH.toString()); + assertThat(sorm.getConfigString()) + .contains(Configurator.MultiRowProcessorType.MULTI_ROW_AND_BATCH.toString()); SormFactory.resetDefaultConfig(); } From 6c0a8e39078a142fec66c60d94f83db140f1e282 Mon Sep 17 00:00:00 2001 From: Yuu Nakajima Date: Wed, 14 Apr 2021 12:17:41 +0900 Subject: [PATCH 02/20] Add converter interface and rename class --- .../java/org/nkjmlab/sorm4j/OrmMapReader.java | 8 +- .../java/org/nkjmlab/sorm4j/OrmReader.java | 6 +- .../java/org/nkjmlab/sorm4j/SqlExecutor.java | 6 +- .../org/nkjmlab/sorm4j/TypedOrmReader.java | 4 +- .../extension/AbstractResultSetConverter.java | 2 +- .../extension/ColumnValueConverter.java | 11 ++ .../sorm4j/extension/Configurator.java | 10 +- .../extension/DefaultResultSetConverter.java | 50 +++--- ...r.java => DefaultSqlParametersSetter.java} | 142 +++++++++++------- .../sorm4j/extension/ParameterSetter.java | 12 ++ .../sorm4j/extension/ResultSetConverter.java | 4 +- ...erSetter.java => SqlParametersSetter.java} | 2 +- .../internal/mapping/ColumnsMapping.java | 12 +- .../sorm4j/internal/mapping/ConfigStore.java | 18 +-- .../internal/mapping/ConfiguratorImpl.java | 12 +- .../sorm4j/internal/mapping/Mappings.java | 14 +- .../internal/mapping/OrmConnectionImpl.java | 58 +++---- .../sorm4j/internal/mapping/TableMapping.java | 14 +- ...atchOfMultiRowInOneStatementProcessor.java | 6 +- .../MultiRowInOneStatementProcessor.java | 6 +- .../mapping/multirow/MultiRowProcessor.java | 10 +- .../multirow/MultiRowProcessorFactory.java | 10 +- .../multirow/SimpleBatchProcessor.java | 6 +- .../internal/sql/NamedParameterSqlImpl.java | 2 +- .../internal/sql/OrderedParameterSqlImpl.java | 2 +- .../sorm4j/internal/sql/SqlStatementImpl.java | 6 +- .../org/nkjmlab/sorm4j/sql/SqlStatement.java | 2 +- .../mapping/multirow/OrmConfigStoreTest.java | 35 +---- .../sorm4j/sql/NamedParameterSqlTest.java | 4 +- .../engine/framework/DbEngineTestUtils.java | 6 +- .../persist/tests/engine/mysql/TestMysql.java | 2 +- .../tests/engine/oracle/TestOracle.java | 2 +- .../engine/postgresql/TestPostgreSQL.java | 135 +---------------- .../tests/engine/sqlserver/TestSqlserver.java | 2 +- 34 files changed, 262 insertions(+), 359 deletions(-) create mode 100644 src/main/java/org/nkjmlab/sorm4j/extension/ColumnValueConverter.java rename src/main/java/org/nkjmlab/sorm4j/extension/{DefaultSqlParameterSetter.java => DefaultSqlParametersSetter.java} (56%) create mode 100644 src/main/java/org/nkjmlab/sorm4j/extension/ParameterSetter.java rename src/main/java/org/nkjmlab/sorm4j/extension/{SqlParameterSetter.java => SqlParametersSetter.java} (90%) diff --git a/src/main/java/org/nkjmlab/sorm4j/OrmMapReader.java b/src/main/java/org/nkjmlab/sorm4j/OrmMapReader.java index 0c9d1f85..dc474f57 100644 --- a/src/main/java/org/nkjmlab/sorm4j/OrmMapReader.java +++ b/src/main/java/org/nkjmlab/sorm4j/OrmMapReader.java @@ -6,7 +6,7 @@ import java.util.Map; import org.nkjmlab.sorm4j.extension.SormOptions; import org.nkjmlab.sorm4j.extension.ResultSetConverter; -import org.nkjmlab.sorm4j.extension.SqlParameterSetter; +import org.nkjmlab.sorm4j.extension.SqlParametersSetter; import org.nkjmlab.sorm4j.sql.LazyResultSet; import org.nkjmlab.sorm4j.sql.SqlStatement; @@ -34,7 +34,7 @@ public interface OrmMapReader { * correspondence defined in {@link ResultSetConverter#toSingleMap(SormOptions, ResultSet, List, List)}. *

* Parameters will be set according with the correspondence defined in - * {@link SqlParameterSetter#setParameters(SormOptions, PreparedStatement, Object... )} + * {@link SqlParametersSetter#setParameters(SormOptions, PreparedStatement, Object... )} * * @param sql with ordered parameter. The other type parameters (e.g. named parameter, list * parameter) could not be used. @@ -58,7 +58,7 @@ public interface OrmMapReader { * correspondence defined in {@link ResultSetConverter#toSingleMap(SormOptions, ResultSet, List, List)}. *

* Parameters will be set according with the correspondence defined in - * {@link SqlParameterSetter#setParameters(SormOptions, PreparedStatement, Object... )} + * {@link SqlParametersSetter#setParameters(SormOptions, PreparedStatement, Object... )} * * @param sql with ordered parameter. The other type parameters (e.g. named parameter, list * parameter) could not be used. @@ -82,7 +82,7 @@ public interface OrmMapReader { * correspondence defined in {@link ResultSetConverter#toSingleMap(SormOptions, ResultSet, List, List)}. *

* Parameters will be set according with the correspondence defined in - * {@link SqlParameterSetter#setParameters(SormOptions, PreparedStatement, Object... )} + * {@link SqlParametersSetter#setParameters(SormOptions, PreparedStatement, Object... )} * * @param sql with ordered parameter. The other type parameters (e.g. named parameter, list * parameter) could not be used. diff --git a/src/main/java/org/nkjmlab/sorm4j/OrmReader.java b/src/main/java/org/nkjmlab/sorm4j/OrmReader.java index 15f9be66..9f82981f 100644 --- a/src/main/java/org/nkjmlab/sorm4j/OrmReader.java +++ b/src/main/java/org/nkjmlab/sorm4j/OrmReader.java @@ -5,7 +5,7 @@ import org.nkjmlab.sorm4j.annotation.Experimental; import org.nkjmlab.sorm4j.annotation.OrmColumnAliasPrefix; import org.nkjmlab.sorm4j.extension.SormOptions; -import org.nkjmlab.sorm4j.extension.SqlParameterSetter; +import org.nkjmlab.sorm4j.extension.SqlParametersSetter; import org.nkjmlab.sorm4j.sql.LazyResultSet; import org.nkjmlab.sorm4j.sql.SqlStatement; import org.nkjmlab.sorm4j.sql.tuple.Tuple2; @@ -93,7 +93,7 @@ public interface OrmReader { * Returns an {@link LazyResultSet}. It is able to convert to Stream, List, and so on. *

* Parameters will be set according with the correspondence defined in - * {@link SqlParameterSetter#setParameters(SormOptions,PreparedStatement, Object[])} + * {@link SqlParametersSetter#setParameters(SormOptions,PreparedStatement, Object[])} * * */ @@ -118,7 +118,7 @@ public interface OrmReader { * set into the object instance. *

* Parameters will be set according with the correspondence defined in - * {@link SqlParameterSetter#setParameters(SormOptions, PreparedStatement, Object[])} + * {@link SqlParametersSetter#setParameters(SormOptions, PreparedStatement, Object[])} * */ List readList(Class objectClass, String sql, Object... parameters); diff --git a/src/main/java/org/nkjmlab/sorm4j/SqlExecutor.java b/src/main/java/org/nkjmlab/sorm4j/SqlExecutor.java index fc26de10..b00865a0 100644 --- a/src/main/java/org/nkjmlab/sorm4j/SqlExecutor.java +++ b/src/main/java/org/nkjmlab/sorm4j/SqlExecutor.java @@ -6,7 +6,7 @@ import java.util.List; import org.nkjmlab.sorm4j.annotation.Experimental; import org.nkjmlab.sorm4j.extension.SormOptions; -import org.nkjmlab.sorm4j.extension.SqlParameterSetter; +import org.nkjmlab.sorm4j.extension.SqlParametersSetter; import org.nkjmlab.sorm4j.sql.SqlStatement; /** @@ -45,7 +45,7 @@ T applyPreparedStatementHandler(SqlStatement sql, * This method wraps {@link PreparedStatement#executeQuery(String)} *

* Parameters will be set according with the correspondence defined in - * {@link SqlParameterSetter#setParameters(SormOptions, PreparedStatement, Object...)} + * {@link SqlParametersSetter#setParameters(SormOptions, PreparedStatement, Object...)} * * @param * @param sql SQL code to be executed. @@ -71,7 +71,7 @@ T applyPreparedStatementHandler(SqlStatement sql, * This method wraps {@link PreparedStatement#executeUpdate(String)} *

* Parameters will be set according with the correspondence defined in - * {@link SqlParameterSetter#setParameters(SormOptions, PreparedStatement, Object...)} + * {@link SqlParametersSetter#setParameters(SormOptions, PreparedStatement, Object...)} * * @param sql SQL code to be executed. * @param parameters Parameters to be used in the PreparedStatement. diff --git a/src/main/java/org/nkjmlab/sorm4j/TypedOrmReader.java b/src/main/java/org/nkjmlab/sorm4j/TypedOrmReader.java index 4e0c832b..fac3dad8 100644 --- a/src/main/java/org/nkjmlab/sorm4j/TypedOrmReader.java +++ b/src/main/java/org/nkjmlab/sorm4j/TypedOrmReader.java @@ -4,7 +4,7 @@ import java.util.List; import org.nkjmlab.sorm4j.annotation.Experimental; import org.nkjmlab.sorm4j.extension.SormOptions; -import org.nkjmlab.sorm4j.extension.SqlParameterSetter; +import org.nkjmlab.sorm4j.extension.SqlParametersSetter; import org.nkjmlab.sorm4j.sql.LazyResultSet; import org.nkjmlab.sorm4j.sql.SqlStatement; @@ -99,7 +99,7 @@ public interface TypedOrmReader { * set into the object instance. *

* Parameters will be set according with the correspondence defined in - * {@link SqlParameterSetter#setParameters(SormOptions, PreparedStatement, Object[])} + * {@link SqlParametersSetter#setParameters(SormOptions, PreparedStatement, Object[])} * * @param sql with ordered parameter. The other type parameters (e.g. named parameter, list * parameter) could not be used. diff --git a/src/main/java/org/nkjmlab/sorm4j/extension/AbstractResultSetConverter.java b/src/main/java/org/nkjmlab/sorm4j/extension/AbstractResultSetConverter.java index 6b8c29b7..f00f5d7c 100644 --- a/src/main/java/org/nkjmlab/sorm4j/extension/AbstractResultSetConverter.java +++ b/src/main/java/org/nkjmlab/sorm4j/extension/AbstractResultSetConverter.java @@ -23,7 +23,7 @@ public final Map toSingleMap(SormOptions options, ResultSet resu @Override @SuppressWarnings("unchecked") - public final T toSingleNativeObject(SormOptions options, ResultSet resultSet, int sqlType, + public final T toSingleStandardObject(SormOptions options, ResultSet resultSet, int sqlType, Class objectClass) throws SQLException { return (T) convertColumnValueTo(options, resultSet, 1, sqlType, objectClass); } diff --git a/src/main/java/org/nkjmlab/sorm4j/extension/ColumnValueConverter.java b/src/main/java/org/nkjmlab/sorm4j/extension/ColumnValueConverter.java new file mode 100644 index 00000000..1bf2621b --- /dev/null +++ b/src/main/java/org/nkjmlab/sorm4j/extension/ColumnValueConverter.java @@ -0,0 +1,11 @@ +package org.nkjmlab.sorm4j.extension; + +import java.sql.ResultSet; + +public interface ColumnValueConverter { + boolean isApplicable(SormOptions options, ResultSet resultSet, int column, int columnType, + Class toType); + + Object convertTo(SormOptions options, ResultSet resultSet, int column, int columnType, + Class toType); +} diff --git a/src/main/java/org/nkjmlab/sorm4j/extension/Configurator.java b/src/main/java/org/nkjmlab/sorm4j/extension/Configurator.java index dccde876..08f8fbac 100644 --- a/src/main/java/org/nkjmlab/sorm4j/extension/Configurator.java +++ b/src/main/java/org/nkjmlab/sorm4j/extension/Configurator.java @@ -71,12 +71,12 @@ public enum MultiRowProcessorType { Configurator setResultSetConverter(ResultSetConverter resultSetConverter); /** - * Sets {@link SqlParameterSetter} + * Sets {@link SqlParametersSetter} * - * @param sqlParameterSetter + * @param sqlParametersSetter * @return */ - Configurator setSqlParameterSetter(SqlParameterSetter sqlParameterSetter); + Configurator setSqlParametersSetter(SqlParametersSetter sqlParametersSetter); /** * Sets {@link TableNameMapper} @@ -109,8 +109,8 @@ public enum MultiRowProcessorType { public static final MultiRowProcessorType DEFAULT_MULTI_ROW_PROCESSOR = MULTI_ROW; - public static final SqlParameterSetter DEFAULT_SQL_PARAMETER_SETTER = - new DefaultSqlParameterSetter(); + public static final SqlParametersSetter DEFAULT_SQL_PARAMETER_SETTER = + new DefaultSqlParametersSetter(); public static final ResultSetConverter DEFAULT_RESULT_SET_CONVERTER = new DefaultResultSetConverter(); diff --git a/src/main/java/org/nkjmlab/sorm4j/extension/DefaultResultSetConverter.java b/src/main/java/org/nkjmlab/sorm4j/extension/DefaultResultSetConverter.java index aba5b234..d25ae394 100644 --- a/src/main/java/org/nkjmlab/sorm4j/extension/DefaultResultSetConverter.java +++ b/src/main/java/org/nkjmlab/sorm4j/extension/DefaultResultSetConverter.java @@ -23,31 +23,34 @@ public class DefaultResultSetConverter extends AbstractResultSetConverter { - private static final Set> nativeSqlTypes = Set.of(boolean.class, Boolean.class, + private static final Set> standardObjectClasses = Set.of(boolean.class, Boolean.class, byte.class, Byte.class, short.class, Short.class, int.class, Integer.class, long.class, Long.class, float.class, Float.class, double.class, Double.class, char.class, Character.class, byte[].class, Byte[].class, char[].class, Character[].class, String.class, BigDecimal.class, - java.util.Date.class, java.sql.Date.class, java.sql.Time.class, java.sql.Timestamp.class, - java.time.LocalDate.class, java.time.LocalTime.class, java.time.LocalDateTime.class, - java.io.InputStream.class, java.io.Reader.class, java.sql.Clob.class, java.sql.Blob.class, - java.util.UUID.class, java.time.OffsetTime.class, java.time.OffsetDateTime.class, - java.net.Inet4Address.class, java.net.URL.class, java.net.Inet6Address.class, int[].class, - Integer[].class, String[].class, Object.class); + java.sql.Clob.class, java.sql.Blob.class, java.sql.Date.class, java.sql.Time.class, + java.sql.Timestamp.class, java.time.LocalDate.class, java.time.LocalTime.class, + java.time.LocalDateTime.class, java.time.OffsetTime.class, java.time.OffsetDateTime.class, + java.util.Date.class, java.util.UUID.class, java.io.InputStream.class, java.io.Reader.class, + java.net.URL.class, java.net.Inet4Address.class, java.net.Inet6Address.class, Object.class); /** - * Returns the given type is enable to convert native object. + * Returns the given type is enable to convert element object. * - * Following classes are regarded as native class: boolean.class, Boolean.class, byte.class, - * Byte.class, short.class, Short.class, int.class, Integer.class, long.class, Long.class, - * float.class, Float.class, double.class, Double.class, char.class, Character.class, - * byte[].class, Byte[].class, char[].class, Character[].class, String.class, BigDecimal.class, - * java.util.Date.class, java.sql.Date.class, java.sql.Time.class, java.sql.Timestamp.class, - * java.io.InputStream.class, java.io.Reader.class, java.sql.Clob.class, java.sql.Blob.class, - * Object.class + * Following classes and Array are regarded as native class. + * + * boolean.class, Boolean.class, byte.class, Byte.class, short.class, Short.class, int.class, + * Integer.class, long.class, Long.class, float.class, Float.class, double.class, Double.class, + * char.class, Character.class, byte[].class, Byte[].class, char[].class, Character[].class, + * String.class, BigDecimal.class, java.sql.Clob.class, java.sql.Blob.class, java.sql.Date.class, + * java.sql.Time.class, java.sql.Timestamp.class, java.time.LocalDate.class, + * java.time.LocalTime.class, java.time.LocalDateTime.class, java.time.OffsetTime.class, + * java.time.OffsetDateTime.class, java.util.Date.class, java.util.UUID.class, + * java.io.InputStream.class, java.io.Reader.class, java.net.URL.class, + * java.net.Inet4Address.class, java.net.Inet6Address.class, Object.class */ @Override - public boolean isEnableToConvertNativeObject(SormOptions options, Class objectClass) { - return nativeSqlTypes.contains(objectClass); + public boolean isStandardClass(SormOptions options, Class objectClass) { + return standardObjectClasses.contains(objectClass) || objectClass.isArray(); } private final List converters; @@ -60,26 +63,21 @@ public DefaultResultSetConverter(List converters) { this.converters = new ArrayList<>(converters); } - - public static interface ColumnValueConverter { - boolean isConvertable(SormOptions options, ResultSet resultSet, int column, int columnType, - Class toType); - - Object convertTo(SormOptions options, ResultSet resultSet, int column, int columnType, - Class toType); + public DefaultResultSetConverter(ColumnValueConverter... converters) { + this(Arrays.asList(converters)); } + // 2021-03-26 An approach to create converter at once and apply the converter to get result is // slower than the current code. https://github.com/yuu-nkjm/sorm4j/issues/25 - @Override public Object convertColumnValueTo(SormOptions options, ResultSet resultSet, int column, int columnType, Class toType) throws SQLException { if (converters.size() != 0) { Optional conv = converters.stream() - .filter(co -> co.isConvertable(options, resultSet, column, columnType, toType)) + .filter(co -> co.isApplicable(options, resultSet, column, columnType, toType)) .findFirst(); if (conv.isPresent()) { return conv.get().convertTo(options, resultSet, column, columnType, toType); diff --git a/src/main/java/org/nkjmlab/sorm4j/extension/DefaultSqlParameterSetter.java b/src/main/java/org/nkjmlab/sorm4j/extension/DefaultSqlParametersSetter.java similarity index 56% rename from src/main/java/org/nkjmlab/sorm4j/extension/DefaultSqlParameterSetter.java rename to src/main/java/org/nkjmlab/sorm4j/extension/DefaultSqlParametersSetter.java index f159df78..5e4214e0 100644 --- a/src/main/java/org/nkjmlab/sorm4j/extension/DefaultSqlParameterSetter.java +++ b/src/main/java/org/nkjmlab/sorm4j/extension/DefaultSqlParametersSetter.java @@ -11,18 +11,37 @@ import java.sql.SQLException; import java.sql.Time; import java.sql.Timestamp; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; import java.util.List; +import java.util.Optional; import org.nkjmlab.sorm4j.SormException; import org.nkjmlab.sorm4j.internal.util.Try; /** - * Default implementation of {@link SqlParameterSetter} + * Default implementation of {@link SqlParametersSetter} * * @author nkjm * */ -public class DefaultSqlParameterSetter implements SqlParameterSetter { +public class DefaultSqlParametersSetter implements SqlParametersSetter { + + private final List setters; + + public DefaultSqlParametersSetter() { + this.setters = Collections.emptyList(); + } + + public DefaultSqlParametersSetter(List setters) { + this.setters = new ArrayList<>(setters); + } + + public DefaultSqlParametersSetter(ParameterSetter... setters) { + this(Arrays.asList(setters)); + } + @Override public void setParameters(SormOptions options, PreparedStatement stmt, Object... parameters) @@ -35,34 +54,44 @@ public void setParameters(SormOptions options, PreparedStatement stmt, Object... if (parameter == null) { stmt.setNull(i, java.sql.Types.NULL); } else { - setParameter(stmt, i, parameter); + setParameter(options, stmt, i, parameter); } } } - - /** * Sets a parameter into the given prepared statement. i.e. Convert from java objects to SQL. * + * @param options TODO * @param stmt {@link java.sql.PreparedStatement} to have parameters set into * @param parameter parameters values + * * @throws SQLException * @throws IOException * */ - protected void setParameter(PreparedStatement stmt, int column, Object parameter) - throws SQLException { + protected void setParameter(SormOptions options, PreparedStatement stmt, int parameterIndex, + Object parameter) throws SQLException { Class type = parameter.getClass(); + if (setters.size() != 0) { + Optional setter = setters.stream() + .filter(co -> co.isApplicable(options, stmt, parameterIndex, type, parameter)) + .findFirst(); + if (setter.isPresent()) { + setter.get().setParameter(options, stmt, parameterIndex, type, parameter); + return; + } + } + if (type.isEnum()) { - stmt.setString(column, parameter.toString()); + stmt.setString(parameterIndex, parameter.toString()); } else if (type.isArray()) { final String name = type.getComponentType().getName(); - procArray(name, stmt, column, parameter); + procArray(name, stmt, parameterIndex, parameter); } else if (List.class.isAssignableFrom(type)) { - procList(stmt, column, (List) parameter); + procList(stmt, parameterIndex, (List) parameter); } else { - procObject(type, stmt, column, parameter); + procObject(type, stmt, parameterIndex, parameter); } } @@ -73,102 +102,103 @@ protected void setParameter(PreparedStatement stmt, int column, Object parameter * * @param type * @param stmt - * @param column + * @param parameterIndex * @param parameter * @throws SQLException */ - protected void procObject(Class type, PreparedStatement stmt, int column, Object parameter) - throws SQLException { + protected void procObject(Class type, PreparedStatement stmt, int parameterIndex, + Object parameter) throws SQLException { if (parameter instanceof Clob) { - stmt.setClob(column, (Clob) parameter); + stmt.setClob(parameterIndex, (Clob) parameter); } else if (parameter instanceof Blob) { - stmt.setBlob(column, (Blob) parameter); + stmt.setBlob(parameterIndex, (Blob) parameter); } else if (parameter instanceof java.io.Reader) { final java.io.Reader reader = (java.io.Reader) parameter; - stmt.setCharacterStream(column, reader, getSize(reader)); + stmt.setCharacterStream(parameterIndex, reader, getSize(reader)); } else if (parameter instanceof java.io.InputStream) { final java.io.InputStream inputStream = (java.io.InputStream) parameter; - stmt.setBinaryStream(column, inputStream, getSize(inputStream)); + stmt.setBinaryStream(parameterIndex, inputStream, getSize(inputStream)); } else { final String typeName = type.getName(); switch (typeName) { case "java.lang.Boolean": case "boolean": - stmt.setBoolean(column, (Boolean) parameter); + stmt.setBoolean(parameterIndex, (Boolean) parameter); return; case "java.lang.Byte": case "byte": - stmt.setByte(column, (Byte) parameter); + stmt.setByte(parameterIndex, (Byte) parameter); return; case "java.lang.Short": case "short": - stmt.setShort(column, (Short) parameter); + stmt.setShort(parameterIndex, (Short) parameter); return; case "java.lang.Integer": case "int": - stmt.setInt(column, (Integer) parameter); + stmt.setInt(parameterIndex, (Integer) parameter); return; case "java.lang.Long": case "long": - stmt.setLong(column, (Long) parameter); + stmt.setLong(parameterIndex, (Long) parameter); return; case "java.lang.Float": case "float": - stmt.setFloat(column, (Float) parameter); + stmt.setFloat(parameterIndex, (Float) parameter); return; case "java.lang.Double": case "double": - stmt.setDouble(column, (Double) parameter); + stmt.setDouble(parameterIndex, (Double) parameter); return; case "java.lang.Character": case "char": - stmt.setString(column, parameter == null ? null : "" + (Character) parameter); + stmt.setString(parameterIndex, parameter == null ? null : "" + (Character) parameter); return; case "java.lang.String": - stmt.setString(column, (String) parameter); + stmt.setString(parameterIndex, (String) parameter); return; case "java.math.BigDecimal": - stmt.setBigDecimal(column, (BigDecimal) parameter); + stmt.setBigDecimal(parameterIndex, (BigDecimal) parameter); return; case "java.sql.Date": - stmt.setDate(column, + stmt.setDate(parameterIndex, parameter == null ? null : java.sql.Date.valueOf(parameter.toString())); return; case "java.sql.Time": - stmt.setTime(column, parameter == null ? null : Time.valueOf(parameter.toString())); + stmt.setTime(parameterIndex, + parameter == null ? null : Time.valueOf(parameter.toString())); return; case "java.sql.Timestamp": - stmt.setTimestamp(column, (java.sql.Timestamp) parameter); + stmt.setTimestamp(parameterIndex, (java.sql.Timestamp) parameter); return; case "java.time.LocalTime": - stmt.setTime(column, + stmt.setTime(parameterIndex, parameter == null ? null : java.sql.Time.valueOf((java.time.LocalTime) parameter)); return; case "java.time.LocalDate": - stmt.setDate(column, + stmt.setDate(parameterIndex, parameter == null ? null : java.sql.Date.valueOf((java.time.LocalDate) parameter)); return; case "java.time.LocalDateTime": - stmt.setTimestamp(column, + stmt.setTimestamp(parameterIndex, parameter == null ? null : Timestamp.valueOf((java.time.LocalDateTime) parameter)); return; case "java.util.Date": - stmt.setTimestamp(column, + stmt.setTimestamp(parameterIndex, parameter == null ? null : new Timestamp(((java.util.Date) parameter).getTime())); return; case "java.time.OffsetTime": - stmt.setTime(column, parameter == null ? null + stmt.setTime(parameterIndex, parameter == null ? null : java.sql.Time.valueOf(((java.time.OffsetTime) parameter).toLocalTime())); return; case "java.time.OffsetDateTime": - stmt.setTimestamp(column, parameter == null ? null + stmt.setTimestamp(parameterIndex, parameter == null ? null : Timestamp.valueOf(((java.time.OffsetDateTime) parameter).toLocalDateTime())); return; case "java.net.URL": - stmt.setString(column, parameter == null ? null : ((URL) parameter).toString()); + stmt.setString(parameterIndex, parameter == null ? null : ((URL) parameter).toString()); return; default: - stmt.setObject(column, parameter); + stmt.setObject(parameterIndex, parameter); return; } } @@ -209,15 +239,16 @@ private static final int getSize(Reader reader) { * * @param type * @param stmt - * @param column + * @param parameterIndex * @param parameter * @throws SQLException */ - protected void procArray(String className, PreparedStatement stmt, int column, Object parameter) - throws SQLException { + protected void procArray(String className, PreparedStatement stmt, int parameterIndex, + Object parameter) throws SQLException { switch (className) { case "char": { - stmt.setString(column, parameter == null ? null : String.valueOf((char[]) parameter)); + stmt.setString(parameterIndex, + parameter == null ? null : String.valueOf((char[]) parameter)); return; } case "java.lang.Character": { @@ -226,11 +257,11 @@ protected void procArray(String className, PreparedStatement stmt, int column, O for (int j = 0; j < src.length; j++) { dst[j] = src[j]; } - stmt.setString(column, String.valueOf(dst)); + stmt.setString(parameterIndex, String.valueOf(dst)); return; } case "byte": { - stmt.setBytes(column, (byte[]) parameter); + stmt.setBytes(parameterIndex, (byte[]) parameter); return; } case "java.lang.Byte": { @@ -239,34 +270,37 @@ protected void procArray(String className, PreparedStatement stmt, int column, O for (int j = 0; j < src.length; j++) { dst[j] = src[j]; } - stmt.setBytes(column, dst); + stmt.setBytes(parameterIndex, dst); return; } case "java.lang.String": { - stmt.setArray(column, stmt.getConnection().createArrayOf("varchar", (Object[]) parameter)); + stmt.setArray(parameterIndex, + stmt.getConnection().createArrayOf("varchar", (Object[]) parameter)); return; } case "java.lang.Integer": { - stmt.setArray(column, stmt.getConnection().createArrayOf("int", (Object[]) parameter)); + stmt.setArray(parameterIndex, + stmt.getConnection().createArrayOf("int", (Object[]) parameter)); return; } - case "java.lang.Double": - case "java.lang.Float": { - stmt.setArray(column, stmt.getConnection().createArrayOf("float", (Object[]) parameter)); + case "java.lang.Long": { + stmt.setArray(parameterIndex, + stmt.getConnection().createArrayOf("bigint", (Object[]) parameter)); return; } default: { - stmt.setObject(column, parameter); + stmt.setObject(parameterIndex, parameter); return; } } } - private void procList(PreparedStatement stmt, int column, List parameter) throws SQLException { + private void procList(PreparedStatement stmt, int parameterIndex, List parameter) + throws SQLException { if (parameter.size() == 0) { throw new SormException("Size of parameter which type is List should be at least one. "); } - procArray(parameter.get(0).getClass().getName(), stmt, column, parameter.toArray()); + procArray(parameter.get(0).getClass().getName(), stmt, parameterIndex, parameter.toArray()); } diff --git a/src/main/java/org/nkjmlab/sorm4j/extension/ParameterSetter.java b/src/main/java/org/nkjmlab/sorm4j/extension/ParameterSetter.java new file mode 100644 index 00000000..2c0522eb --- /dev/null +++ b/src/main/java/org/nkjmlab/sorm4j/extension/ParameterSetter.java @@ -0,0 +1,12 @@ +package org.nkjmlab.sorm4j.extension; + +import java.sql.PreparedStatement; +import java.sql.SQLException; + +public interface ParameterSetter { + boolean isApplicable(SormOptions options, PreparedStatement stmt, int parameterIndex, + Class parameterClass, Object parameter); + + void setParameter(SormOptions options, PreparedStatement stmt, int parameterIndex, + Class parameterClass, Object parameter) throws SQLException; +} \ No newline at end of file diff --git a/src/main/java/org/nkjmlab/sorm4j/extension/ResultSetConverter.java b/src/main/java/org/nkjmlab/sorm4j/extension/ResultSetConverter.java index b8e5ee1c..759e8bfb 100644 --- a/src/main/java/org/nkjmlab/sorm4j/extension/ResultSetConverter.java +++ b/src/main/java/org/nkjmlab/sorm4j/extension/ResultSetConverter.java @@ -49,7 +49,7 @@ Object convertColumnValueTo(SormOptions options, ResultSet resultSet, int column * * @return */ - boolean isEnableToConvertNativeObject(SormOptions options, Class objectClass); + boolean isStandardClass(SormOptions options, Class objectClass); /** * Converts the result from database to a map objects. The data of the column is extracted by @@ -79,7 +79,7 @@ Map toSingleMap(SormOptions options, ResultSet resultSet, List T toSingleNativeObject(SormOptions options, ResultSet resultSet, int columnType, + T toSingleStandardObject(SormOptions options, ResultSet resultSet, int columnType, Class objectClass) throws SQLException; diff --git a/src/main/java/org/nkjmlab/sorm4j/extension/SqlParameterSetter.java b/src/main/java/org/nkjmlab/sorm4j/extension/SqlParametersSetter.java similarity index 90% rename from src/main/java/org/nkjmlab/sorm4j/extension/SqlParameterSetter.java rename to src/main/java/org/nkjmlab/sorm4j/extension/SqlParametersSetter.java index 765c9ce5..af618d5a 100644 --- a/src/main/java/org/nkjmlab/sorm4j/extension/SqlParameterSetter.java +++ b/src/main/java/org/nkjmlab/sorm4j/extension/SqlParametersSetter.java @@ -10,7 +10,7 @@ * @author nkjm * */ -public interface SqlParameterSetter { +public interface SqlParametersSetter { /** * Sets parameters into the given prepared statement. i.e. Convert from java objects to SQL. diff --git a/src/main/java/org/nkjmlab/sorm4j/internal/mapping/ColumnsMapping.java b/src/main/java/org/nkjmlab/sorm4j/internal/mapping/ColumnsMapping.java index 85eda55b..46ed29b1 100644 --- a/src/main/java/org/nkjmlab/sorm4j/internal/mapping/ColumnsMapping.java +++ b/src/main/java/org/nkjmlab/sorm4j/internal/mapping/ColumnsMapping.java @@ -16,7 +16,6 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.stream.Collectors; import org.nkjmlab.sorm4j.SormException; -import org.nkjmlab.sorm4j.annotation.OrmColumn; import org.nkjmlab.sorm4j.annotation.OrmColumnAliasPrefix; import org.nkjmlab.sorm4j.annotation.OrmConstructor; import org.nkjmlab.sorm4j.extension.Accessor; @@ -45,17 +44,18 @@ public ColumnsMapping(SormOptions options, Class objectClass, SetterPojoCreator setterPojoCreator = new SetterPojoCreator<>(Try.getOrThrow( () -> objectClass.getDeclaredConstructor(), - e -> new SormException( - "Container class for object relation mapping must have the public default constructor (with no arguments).", - e))); + e -> new SormException(StringUtils.format( + "The given container class [{}] should have the public default constructor (with no arguments) or {} annotated constructor.", + objectClass, OrmConstructor.class.getName()), e))); List> annotataedConstructors = Arrays .stream(objectClass.getDeclaredConstructors()) .filter(c -> c.getAnnotation(OrmConstructor.class) != null).collect(Collectors.toList()); if (annotataedConstructors.size() > 1) { - throw new SormException(StringUtils.format( - "Constructor with parameters annotated by {} should be one or less. ", OrmColumn.class)); + throw new SormException( + StringUtils.format("Constructor with parameters annotated by {} should be one or less. ", + OrmConstructor.class.getName())); } this.pojoCreator = annotataedConstructors.isEmpty() ? setterPojoCreator diff --git a/src/main/java/org/nkjmlab/sorm4j/internal/mapping/ConfigStore.java b/src/main/java/org/nkjmlab/sorm4j/internal/mapping/ConfigStore.java index 206f0fc7..dba339b6 100644 --- a/src/main/java/org/nkjmlab/sorm4j/internal/mapping/ConfigStore.java +++ b/src/main/java/org/nkjmlab/sorm4j/internal/mapping/ConfigStore.java @@ -9,7 +9,7 @@ import org.nkjmlab.sorm4j.extension.Configurator.MultiRowProcessorType; import org.nkjmlab.sorm4j.extension.SormOptions; import org.nkjmlab.sorm4j.extension.ResultSetConverter; -import org.nkjmlab.sorm4j.extension.SqlParameterSetter; +import org.nkjmlab.sorm4j.extension.SqlParametersSetter; import org.nkjmlab.sorm4j.extension.TableName; import org.nkjmlab.sorm4j.extension.TableNameMapper; import org.nkjmlab.sorm4j.internal.mapping.multirow.MultiRowProcessorFactory; @@ -32,7 +32,7 @@ public final class ConfigStore { private final ColumnFieldMapper columnFieldMapper; private final TableNameMapper tableNameMapper; private final ResultSetConverter resultSetConverter; - private final SqlParameterSetter sqlParameterSetter; + private final SqlParametersSetter sqlParametersSetter; private final MultiRowProcessorFactory multiRowProcessorFactory; private final MultiRowProcessorType multiRowProcessorType; private final int batchSize; @@ -46,14 +46,14 @@ public final class ConfigStore { public ConfigStore(String cacheName, Map options, ColumnFieldMapper fieldNameMapper, TableNameMapper tableNameMapper, - ResultSetConverter resultSetConverter, SqlParameterSetter sqlParameterSetter, + ResultSetConverter resultSetConverter, SqlParametersSetter sqlParametersSetter, MultiRowProcessorType multiRowProcessorType, int batchSize, int multiRowSize, int batchSizeWithMultiRow, int transactionIsolationLevel) { this.configName = cacheName; this.columnFieldMapper = fieldNameMapper; this.tableNameMapper = tableNameMapper; this.resultSetConverter = resultSetConverter; - this.sqlParameterSetter = sqlParameterSetter; + this.sqlParametersSetter = sqlParametersSetter; this.multiRowProcessorType = multiRowProcessorType; this.batchSize = batchSize; this.multiRowSize = multiRowSize; @@ -61,12 +61,12 @@ public ConfigStore(String cacheName, Map options, this.options = options; SormOptions _options = new OrmOptionsImpl(options); this.multiRowProcessorFactory = - MultiRowProcessorFactory.createMultiRowProcessorFactory(_options, sqlParameterSetter, + MultiRowProcessorFactory.createMultiRowProcessorFactory(_options, sqlParametersSetter, multiRowProcessorType, batchSize, multiRowSize, batchSizeWithMultiRow); this.transactionIsolationLevel = transactionIsolationLevel; this.mappings = new Mappings(_options, tableNameMapper, fieldNameMapper, multiRowProcessorFactory, - resultSetConverter, sqlParameterSetter, getTableMappings(), getColumnsMappings(), + resultSetConverter, sqlParametersSetter, getTableMappings(), getColumnsMappings(), getClassNameToValidTableNameMap(), getTableNameToValidTableNameMaps()); } @@ -90,8 +90,8 @@ public MultiRowProcessorFactory getMultiRowProcessorFactory() { return multiRowProcessorFactory; } - public SqlParameterSetter getSqlParameterSetter() { - return sqlParameterSetter; + public SqlParametersSetter getSqlParametersSetter() { + return sqlParametersSetter; } public ConcurrentMap> getTableMappings() { @@ -167,7 +167,7 @@ public Mappings getMappings() { public String toString() { return "ConfigStore [configName=" + configName + ", columnFieldMapper=" + columnFieldMapper + ", tableNameMapper=" + tableNameMapper + ", resultSetConverter=" + resultSetConverter - + ", sqlParameterSetter=" + sqlParameterSetter + ", multiRowProcessorType=" + + ", sqlParametersSetter=" + sqlParametersSetter + ", multiRowProcessorType=" + multiRowProcessorType + ", batchSize=" + batchSize + ", multiRowSize=" + multiRowSize + ", batchSizeWithMultiRow=" + batchSizeWithMultiRow + ", transactionIsolationLevel=" + transactionIsolationLevel + "]"; diff --git a/src/main/java/org/nkjmlab/sorm4j/internal/mapping/ConfiguratorImpl.java b/src/main/java/org/nkjmlab/sorm4j/internal/mapping/ConfiguratorImpl.java index 76d949cb..ed963383 100644 --- a/src/main/java/org/nkjmlab/sorm4j/internal/mapping/ConfiguratorImpl.java +++ b/src/main/java/org/nkjmlab/sorm4j/internal/mapping/ConfiguratorImpl.java @@ -5,7 +5,7 @@ import org.nkjmlab.sorm4j.extension.ColumnFieldMapper; import org.nkjmlab.sorm4j.extension.Configurator; import org.nkjmlab.sorm4j.extension.ResultSetConverter; -import org.nkjmlab.sorm4j.extension.SqlParameterSetter; +import org.nkjmlab.sorm4j.extension.SqlParametersSetter; import org.nkjmlab.sorm4j.extension.TableNameMapper; /** @@ -20,7 +20,7 @@ public class ConfiguratorImpl implements Configurator { private ColumnFieldMapper columnFieldMapper = DEFAULT_COLUMN_FIELD_MAPPER; private TableNameMapper tableNameMapper = DEFAULT_TABLE_NAME_MAPPER; private ResultSetConverter resultSetConverter = DEFAULT_RESULT_SET_CONVERTER; - private SqlParameterSetter sqlParameterSetter = DEFAULT_SQL_PARAMETER_SETTER; + private SqlParametersSetter sqlParametersSetter = DEFAULT_SQL_PARAMETER_SETTER; private MultiRowProcessorType multiRowProcessorType = DEFAULT_MULTI_ROW_PROCESSOR; private int batchSize = 32; private int multiRowSize = 32; @@ -37,7 +37,7 @@ public ConfiguratorImpl(String configName, ConfigStore configStore) { this.columnFieldMapper = configStore.getColumnFieldMapper(); this.tableNameMapper = configStore.getTableNameMapper(); this.resultSetConverter = configStore.getResultSetConverter(); - this.sqlParameterSetter = configStore.getSqlParameterSetter(); + this.sqlParametersSetter = configStore.getSqlParametersSetter(); this.multiRowProcessorType = configStore.getMultiRowProcessorType(); this.batchSize = configStore.getBatchSize(); this.multiRowSize = configStore.getMultiRowSize(); @@ -49,7 +49,7 @@ public ConfiguratorImpl(String configName, ConfigStore configStore) { public ConfigStore build() { return new ConfigStore(configName, options, columnFieldMapper, tableNameMapper, - resultSetConverter, sqlParameterSetter, multiRowProcessorType, batchSize, multiRowSize, + resultSetConverter, sqlParametersSetter, multiRowProcessorType, batchSize, multiRowSize, batchSizeWithMultiRow, transactionIsolationLevel); } @@ -73,8 +73,8 @@ public Configurator setResultSetConverter(ResultSetConverter resultSetConverter) } @Override - public Configurator setSqlParameterSetter(SqlParameterSetter sqlParameterSetter) { - this.sqlParameterSetter = sqlParameterSetter; + public Configurator setSqlParametersSetter(SqlParametersSetter sqlParametersSetter) { + this.sqlParametersSetter = sqlParametersSetter; return this; } diff --git a/src/main/java/org/nkjmlab/sorm4j/internal/mapping/Mappings.java b/src/main/java/org/nkjmlab/sorm4j/internal/mapping/Mappings.java index 8d5891ca..0303fcc8 100644 --- a/src/main/java/org/nkjmlab/sorm4j/internal/mapping/Mappings.java +++ b/src/main/java/org/nkjmlab/sorm4j/internal/mapping/Mappings.java @@ -15,7 +15,7 @@ import org.nkjmlab.sorm4j.extension.SormOptions; import org.nkjmlab.sorm4j.extension.ResultSetConverter; import org.nkjmlab.sorm4j.extension.SormLogger; -import org.nkjmlab.sorm4j.extension.SqlParameterSetter; +import org.nkjmlab.sorm4j.extension.SqlParametersSetter; import org.nkjmlab.sorm4j.extension.TableName; import org.nkjmlab.sorm4j.extension.TableNameMapper; import org.nkjmlab.sorm4j.internal.mapping.multirow.MultiRowProcessorFactory; @@ -30,7 +30,7 @@ final class Mappings { private final ColumnFieldMapper columnFieldMapper; private final MultiRowProcessorFactory multiRowProcessorFactory; private final ResultSetConverter resultSetConverter; - private final SqlParameterSetter sqlParameterSetter; + private final SqlParametersSetter sqlParametersSetter; private final ConcurrentMap> tableMappings; @@ -44,7 +44,7 @@ final class Mappings { public Mappings(SormOptions options, TableNameMapper tableNameMapper, ColumnFieldMapper columnFieldMapper, MultiRowProcessorFactory multiRowProcessorFactory, - ResultSetConverter resultSetConverter, SqlParameterSetter sqlParameterSetter, + ResultSetConverter resultSetConverter, SqlParametersSetter sqlParametersSetter, ConcurrentMap> tableMappings, ConcurrentMap, ColumnsMapping> columnsMappings, ConcurrentMap, TableName> classNameToValidTableNameMap, @@ -54,7 +54,7 @@ public Mappings(SormOptions options, TableNameMapper tableNameMapper, this.columnFieldMapper = columnFieldMapper; this.multiRowProcessorFactory = multiRowProcessorFactory; this.resultSetConverter = resultSetConverter; - this.sqlParameterSetter = sqlParameterSetter; + this.sqlParametersSetter = sqlParametersSetter; this.tableMappings = tableMappings; this.columnsMappings = columnsMappings; this.classNameToValidTableNameMap = classNameToValidTableNameMap; @@ -133,7 +133,7 @@ public TableMapping createTableMapping(Class objectClass, String table ColumnToAccessorMap columnToAccessorMap = new ColumnToAccessorMap(objectClass, accessors); return new TableMapping<>(options, resultSetConverter, objectClass, columnToAccessorMap, - sqlParameterSetter, multiRowProcessorFactory, sql); + sqlParametersSetter, multiRowProcessorFactory, sql); } @@ -180,8 +180,8 @@ public ResultSetConverter getResultSetConverter() { return resultSetConverter; } - public SqlParameterSetter getSqlParameterSetter() { - return sqlParameterSetter; + public SqlParametersSetter getSqlParametersSetter() { + return sqlParametersSetter; } public SormOptions getOptions() { diff --git a/src/main/java/org/nkjmlab/sorm4j/internal/mapping/OrmConnectionImpl.java b/src/main/java/org/nkjmlab/sorm4j/internal/mapping/OrmConnectionImpl.java index 0fd66902..3c82fb97 100644 --- a/src/main/java/org/nkjmlab/sorm4j/internal/mapping/OrmConnectionImpl.java +++ b/src/main/java/org/nkjmlab/sorm4j/internal/mapping/OrmConnectionImpl.java @@ -22,7 +22,7 @@ import org.nkjmlab.sorm4j.extension.SormOptions; import org.nkjmlab.sorm4j.extension.ResultSetConverter; import org.nkjmlab.sorm4j.extension.SormLogger; -import org.nkjmlab.sorm4j.extension.SqlParameterSetter; +import org.nkjmlab.sorm4j.extension.SqlParametersSetter; import org.nkjmlab.sorm4j.internal.sql.NamedParameterQueryImpl; import org.nkjmlab.sorm4j.internal.sql.OrderedParameterQueryImpl; import org.nkjmlab.sorm4j.internal.sql.QueryOrmExecutor; @@ -60,7 +60,7 @@ private static R applytoArray(List objects, Function sqlFunc) } static R executeQueryAndRead(SormOptions options, Connection connection, - SqlParameterSetter sqlParameterSetter, String sql, Object[] parameters, + SqlParametersSetter sqlParametersSetter, String sql, Object[] parameters, FunctionHandler resultSetHandler) { final Optional dp = LogPointFactory.createLogPoint(SormLogger.Category.EXECUTE_QUERY); dp.ifPresent(lp -> { @@ -70,7 +70,7 @@ static R executeQueryAndRead(SormOptions options, Connection connection, }); try (PreparedStatement stmt = connection.prepareStatement(sql)) { - sqlParameterSetter.setParameters(options, stmt, parameters); + sqlParametersSetter.setParameters(options, stmt, parameters); try (ResultSet resultSet = stmt.executeQuery()) { R ret = resultSetHandler.apply(resultSet); dp.ifPresent(lp -> lp.debug(OrmConnectionImpl.class, "{} Read [{}] objects from [{}]", @@ -86,9 +86,9 @@ static R executeQueryAndRead(SormOptions options, Connection connection, } static final int executeUpdateAndClose(SormOptions options, Connection connection, - SqlParameterSetter sqlParameterSetter, String sql, Object[] parameters) { + SqlParametersSetter sqlParametersSetter, String sql, Object[] parameters) { try (PreparedStatement stmt = connection.prepareStatement(sql)) { - sqlParameterSetter.setParameters(options, stmt, parameters); + sqlParametersSetter.setParameters(options, stmt, parameters); return stmt.executeUpdate(); } catch (Exception e) { throw Try.rethrow(e); @@ -102,7 +102,7 @@ static final int executeUpdateAndClose(SormOptions options, Connection connectio private final ResultSetConverter resultSetConverter; - private final SqlParameterSetter sqlParameterSetter; + private final SqlParametersSetter sqlParametersSetter; private final int transactionIsolationLevel; @@ -122,7 +122,7 @@ public OrmConnectionImpl(Connection connection, ConfigStore configStore) { this.connection = connection; this.mappings = configStore.getMappings(); this.resultSetConverter = mappings.getResultSetConverter(); - this.sqlParameterSetter = mappings.getSqlParameterSetter(); + this.sqlParametersSetter = mappings.getSqlParametersSetter(); this.transactionIsolationLevel = configStore.getTransactionIsolationLevel(); } @@ -257,7 +257,7 @@ private final R execSqlIfParameterExists(T[] objects, public T applyPreparedStatementHandler(SqlStatement sql, FunctionHandler handler) { try (PreparedStatement stmt = connection.prepareStatement(sql.getSql())) { - sqlParameterSetter.setParameters(mappings.getOptions(), stmt, sql.getParameters()); + sqlParametersSetter.setParameters(mappings.getOptions(), stmt, sql.getParameters()); return handler.apply(stmt); } catch (Exception e) { throw new SormException(sql + System.lineSeparator() + e.getMessage(), e); @@ -268,7 +268,7 @@ public T applyPreparedStatementHandler(SqlStatement sql, public void acceptPreparedStatementHandler(SqlStatement sql, ConsumerHandler handler) { try (PreparedStatement stmt = connection.prepareStatement(sql.getSql())) { - sqlParameterSetter.setParameters(mappings.getOptions(), stmt, sql.getParameters()); + sqlParametersSetter.setParameters(mappings.getOptions(), stmt, sql.getParameters()); handler.accept(stmt); } catch (Exception e) { throw new SormException(sql + System.lineSeparator() + e.getMessage(), e); @@ -278,13 +278,13 @@ public void acceptPreparedStatementHandler(SqlStatement sql, @Override public T executeQuery(SqlStatement sql, FunctionHandler resultSetHandler) { - return executeQueryAndRead(mappings.getOptions(), getJdbcConnection(), sqlParameterSetter, + return executeQueryAndRead(mappings.getOptions(), getJdbcConnection(), sqlParametersSetter, sql.getSql(), sql.getParameters(), resultSetHandler); } @Override public List executeQuery(SqlStatement sql, RowMapper rowMapper) { - return executeQueryAndRead(mappings.getOptions(), getJdbcConnection(), sqlParameterSetter, + return executeQueryAndRead(mappings.getOptions(), getJdbcConnection(), sqlParametersSetter, sql.getSql(), sql.getParameters(), RowMapper.convertToRowListMapper(rowMapper)); } @@ -298,7 +298,7 @@ public int executeUpdate(String sql, Object... parameters) { final Optional dp = LogPointFactory.createLogPoint(SormLogger.Category.EXECUTE_UPDATE); - final int ret = executeUpdateAndClose(mappings.getOptions(), connection, sqlParameterSetter, + final int ret = executeUpdateAndClose(mappings.getOptions(), connection, sqlParametersSetter, sql, parameters); dp.ifPresent(lp -> { lp.trace(OrmConnectionImpl.class, "[{}] Parameters = {} ", lp.getTag(), parameters); @@ -450,15 +450,15 @@ private final List loadNativeObjectList(Class objectClass, ResultSet r throws SQLException { final List ret = new ArrayList<>(); while (resultSet.next()) { - ret.add(resultSetConverter.toSingleNativeObject(mappings.getOptions(), resultSet, - getSingeSqlType(objectClass, resultSet), objectClass)); + ret.add(resultSetConverter.toSingleStandardObject(mappings.getOptions(), resultSet, + getOneSqlType(objectClass, resultSet), objectClass)); } return ret; } - private int getSingeSqlType(Class objectClass, ResultSet resultSet) { + private int getOneSqlType(Class objectClass, ResultSet resultSet) { return Try.getOrThrow(() -> { ResultSetMetaData metaData = resultSet.getMetaData(); @@ -518,9 +518,9 @@ private T loadSinglePojoByColumnLabels(Class objectClass, ResultSet resul @Override public T mapRow(Class objectClass, ResultSet resultSet) { return Try.getOrThrow( - () -> resultSetConverter.isEnableToConvertNativeObject(mappings.getOptions(), objectClass) - ? resultSetConverter.toSingleNativeObject(mappings.getOptions(), resultSet, - getSingeSqlType(objectClass, resultSet), objectClass) + () -> resultSetConverter.isStandardClass(mappings.getOptions(), objectClass) + ? resultSetConverter.toSingleStandardObject(mappings.getOptions(), resultSet, + getOneSqlType(objectClass, resultSet), objectClass) : loadSinglePojo(objectClass, resultSet), Try::rethrow); } @@ -530,7 +530,7 @@ public T mapRow(Class objectClass, ResultSet resultSet) { @Override public List mapRowList(Class objectClass, ResultSet resultSet) { return Try.getOrThrow( - () -> resultSetConverter.isEnableToConvertNativeObject(mappings.getOptions(), objectClass) + () -> resultSetConverter.isStandardClass(mappings.getOptions(), objectClass) ? loadNativeObjectList(objectClass, resultSet) : loadPojoList(objectClass, resultSet), Try::rethrow); @@ -635,7 +635,7 @@ public T readFirst(Class objectClass, SqlStatement sql) { @Override public T readFirst(Class objectClass, String sql, Object... parameters) { - return executeQueryAndRead(mappings.getOptions(), getJdbcConnection(), sqlParameterSetter, sql, + return executeQueryAndRead(mappings.getOptions(), getJdbcConnection(), sqlParametersSetter, sql, parameters, resultSet -> loadFirst(objectClass, resultSet)); } @@ -648,7 +648,7 @@ public LazyResultSet readLazy(Class objectClass, SqlStatement sql) { public LazyResultSet readLazy(Class objectClass, String sql, Object... parameters) { try { final PreparedStatement stmt = connection.prepareStatement(sql); - sqlParameterSetter.setParameters(mappings.getOptions(), stmt, parameters); + sqlParametersSetter.setParameters(mappings.getOptions(), stmt, parameters); final ResultSet resultSet = stmt.executeQuery(); LazyResultSetImpl ret = new LazyResultSetImpl(this, objectClass, stmt, resultSet); lazyResultSets.add(ret); @@ -666,7 +666,7 @@ public List readList(Class objectClass, SqlStatement sql) { @Override public List readList(Class objectClass, String sql, Object... parameters) { - return executeQueryAndRead(mappings.getOptions(), getJdbcConnection(), sqlParameterSetter, sql, + return executeQueryAndRead(mappings.getOptions(), getJdbcConnection(), sqlParametersSetter, sql, parameters, resultSet -> mapRowList(objectClass, resultSet)); } @@ -679,7 +679,7 @@ public Map readMapFirst(SqlStatement sql) { @Override public Map readMapFirst(final String sql, final Object... parameters) { - return executeQueryAndRead(mappings.getOptions(), getJdbcConnection(), sqlParameterSetter, sql, + return executeQueryAndRead(mappings.getOptions(), getJdbcConnection(), sqlParametersSetter, sql, parameters, resultSet -> { ColumnsAndTypes ct = ColumnsAndTypes.createColumnsAndTypes(resultSet); if (resultSet.next()) { @@ -700,7 +700,7 @@ public LazyResultSet> readMapLazy(SqlStatement sql) { public LazyResultSet> readMapLazy(String sql, Object... parameters) { try { final PreparedStatement stmt = connection.prepareStatement(sql); - sqlParameterSetter.setParameters(mappings.getOptions(), stmt, parameters); + sqlParametersSetter.setParameters(mappings.getOptions(), stmt, parameters); final ResultSet resultSet = stmt.executeQuery(); @SuppressWarnings({"unchecked", "rawtypes", "resource"}) LazyResultSet> ret = @@ -718,7 +718,7 @@ public List> readMapList(SqlStatement sql) { @Override public List> readMapList(final String sql, final Object... parameters) { - return executeQueryAndRead(mappings.getOptions(), getJdbcConnection(), sqlParameterSetter, sql, + return executeQueryAndRead(mappings.getOptions(), getJdbcConnection(), sqlParametersSetter, sql, parameters, resultSet -> mapRowsToMapList(resultSet)); } @@ -729,7 +729,7 @@ public Map readMapOne(SqlStatement sql) { @Override public Map readMapOne(final String sql, final Object... parameters) { - return executeQueryAndRead(mappings.getOptions(), getJdbcConnection(), sqlParameterSetter, sql, + return executeQueryAndRead(mappings.getOptions(), getJdbcConnection(), sqlParametersSetter, sql, parameters, resultSet -> { ColumnsAndTypes ct = ColumnsAndTypes.createColumnsAndTypes(resultSet); Map ret = null; @@ -751,7 +751,7 @@ public T readOne(Class objectClass, SqlStatement sql) { @Override public T readOne(Class objectClass, String sql, Object... parameters) { - return executeQueryAndRead(mappings.getOptions(), getJdbcConnection(), sqlParameterSetter, sql, + return executeQueryAndRead(mappings.getOptions(), getJdbcConnection(), sqlParametersSetter, sql, parameters, resultSet -> { T ret = null; if (resultSet.next()) { @@ -776,7 +776,7 @@ public List> readTupleList(Class t1, Class List> readTupleList(Class t1, Class t2, Class t3, String sql, Object... parameters) { List> ret = executeQueryAndRead(mappings.getOptions(), getJdbcConnection(), - sqlParameterSetter, sql, parameters, resultSet -> { + sqlParametersSetter, sql, parameters, resultSet -> { final List> ret1 = new ArrayList<>(); while (resultSet.next()) { ret1.add(Tuples.of(loadSinglePojoByColumnLabels(t1, resultSet), @@ -797,7 +797,7 @@ public List> readTupleList(Class t1, Class t2, S public List> readTupleList(Class t1, Class t2, String sql, Object... parameters) { List> ret = executeQueryAndRead(mappings.getOptions(), getJdbcConnection(), - sqlParameterSetter, sql, parameters, resultSet -> { + sqlParametersSetter, sql, parameters, resultSet -> { final List> ret1 = new ArrayList<>(); while (resultSet.next()) { ret1.add(Tuples.of(loadSinglePojoByColumnLabels(t1, resultSet), diff --git a/src/main/java/org/nkjmlab/sorm4j/internal/mapping/TableMapping.java b/src/main/java/org/nkjmlab/sorm4j/internal/mapping/TableMapping.java index 6c52df64..0001db87 100644 --- a/src/main/java/org/nkjmlab/sorm4j/internal/mapping/TableMapping.java +++ b/src/main/java/org/nkjmlab/sorm4j/internal/mapping/TableMapping.java @@ -18,7 +18,7 @@ import org.nkjmlab.sorm4j.extension.SormOptions; import org.nkjmlab.sorm4j.extension.ResultSetConverter; import org.nkjmlab.sorm4j.extension.SormLogger; -import org.nkjmlab.sorm4j.extension.SqlParameterSetter; +import org.nkjmlab.sorm4j.extension.SqlParametersSetter; import org.nkjmlab.sorm4j.internal.mapping.multirow.MultiRowProcessor; import org.nkjmlab.sorm4j.internal.mapping.multirow.MultiRowProcessorFactory; import org.nkjmlab.sorm4j.internal.util.ArrayUtils; @@ -34,16 +34,16 @@ public final class TableMapping extends Mapping { private final Map> setterParameterTypeMap = new ConcurrentHashMap<>(); - private final SqlParameterSetter sqlParameterSetter; + private final SqlParametersSetter sqlParametersSetter; private final TableMappingSql sql; private final MultiRowProcessor multiRowProcessor; public TableMapping(SormOptions options, ResultSetConverter resultSetConverter, Class objectClass, ColumnToAccessorMap columnToAccessorMap, - SqlParameterSetter sqlParameterSetter, MultiRowProcessorFactory multiRowProcessorFactory, + SqlParametersSetter sqlParametersSetter, MultiRowProcessorFactory multiRowProcessorFactory, TableMappingSql sql) { super(options, resultSetConverter, objectClass, columnToAccessorMap); - this.sqlParameterSetter = sqlParameterSetter; + this.sqlParametersSetter = sqlParametersSetter; this.sql = sql; @SuppressWarnings("unchecked") MultiRowProcessor processor = @@ -128,7 +128,7 @@ public final void setPrameters(PreparedStatement stmt, T... objects) Object[] parameters = Arrays.stream(objects) .flatMap(obj -> Arrays.stream(getParametersWithoutAutoGeneratedColumns(obj))) .toArray(Object[]::new); - sqlParameterSetter.setParameters(options, stmt, parameters); + sqlParametersSetter.setParameters(options, stmt, parameters); } @@ -139,7 +139,7 @@ private int executeUpdate(Connection connection, String sql, final Object... par dp.ifPresent(lp -> lp.debug(TableMapping.class, "[{}] [{}] with {} parameters", lp.getTag(), sql, parameters == null ? 0 : parameters.length)); - int ret = OrmConnectionImpl.executeUpdateAndClose(options, connection, sqlParameterSetter, sql, + int ret = OrmConnectionImpl.executeUpdateAndClose(options, connection, sqlParametersSetter, sql, parameters); dp.ifPresent(lp -> { lp.trace(TableMapping.class, "[{}] Parameters = {}", lp.getTag(), parameters); @@ -233,7 +233,7 @@ public InsertResult insertAndGet(Connection connection, T object) { try (PreparedStatement stmt = (!sql.hasAutoGeneratedColumns()) ? connection.prepareStatement(insertSql) : connection.prepareStatement(insertSql, sql.getAutoGeneratedColumns())) { - sqlParameterSetter.setParameters(options, stmt, getInsertParameters(object)); + sqlParametersSetter.setParameters(options, stmt, getInsertParameters(object)); int rowsModified = stmt.executeUpdate(); List keys = setAutoGeneratedKeys(stmt, object); diff --git a/src/main/java/org/nkjmlab/sorm4j/internal/mapping/multirow/BatchOfMultiRowInOneStatementProcessor.java b/src/main/java/org/nkjmlab/sorm4j/internal/mapping/multirow/BatchOfMultiRowInOneStatementProcessor.java index fc6e2c83..60f1161b 100644 --- a/src/main/java/org/nkjmlab/sorm4j/internal/mapping/multirow/BatchOfMultiRowInOneStatementProcessor.java +++ b/src/main/java/org/nkjmlab/sorm4j/internal/mapping/multirow/BatchOfMultiRowInOneStatementProcessor.java @@ -4,7 +4,7 @@ import java.sql.PreparedStatement; import java.util.List; import org.nkjmlab.sorm4j.extension.SormOptions; -import org.nkjmlab.sorm4j.extension.SqlParameterSetter; +import org.nkjmlab.sorm4j.extension.SqlParametersSetter; import org.nkjmlab.sorm4j.internal.mapping.ConfigStore; import org.nkjmlab.sorm4j.internal.mapping.TableMapping; import org.nkjmlab.sorm4j.internal.util.ArrayUtils; @@ -26,9 +26,9 @@ final class BatchOfMultiRowInOneStatementProcessor extends MultiRowProcessor< private final int batchSizeWithMultiRow; public BatchOfMultiRowInOneStatementProcessor(SormOptions options, - SqlParameterSetter sqlParameterSetter, TableMapping tableMapping, int batchSize, + SqlParametersSetter sqlParametersSetter, TableMapping tableMapping, int batchSize, int multiRowSize, int batchSizeWithMultiRow) { - super(options, sqlParameterSetter, tableMapping, batchSize); + super(options, sqlParametersSetter, tableMapping, batchSize); this.multiRowSize = multiRowSize; this.batchSizeWithMultiRow = batchSizeWithMultiRow; } diff --git a/src/main/java/org/nkjmlab/sorm4j/internal/mapping/multirow/MultiRowInOneStatementProcessor.java b/src/main/java/org/nkjmlab/sorm4j/internal/mapping/multirow/MultiRowInOneStatementProcessor.java index 4701be9a..7a793115 100644 --- a/src/main/java/org/nkjmlab/sorm4j/internal/mapping/multirow/MultiRowInOneStatementProcessor.java +++ b/src/main/java/org/nkjmlab/sorm4j/internal/mapping/multirow/MultiRowInOneStatementProcessor.java @@ -4,7 +4,7 @@ import java.sql.PreparedStatement; import java.util.List; import org.nkjmlab.sorm4j.extension.SormOptions; -import org.nkjmlab.sorm4j.extension.SqlParameterSetter; +import org.nkjmlab.sorm4j.extension.SqlParametersSetter; import org.nkjmlab.sorm4j.internal.mapping.TableMapping; import org.nkjmlab.sorm4j.internal.util.ArrayUtils; import org.nkjmlab.sorm4j.internal.util.Try; @@ -15,9 +15,9 @@ final class MultiRowInOneStatementProcessor extends MultiRowProcessor { private final int multiRowSize; - public MultiRowInOneStatementProcessor(SormOptions options, SqlParameterSetter sqlParameterSetter, + public MultiRowInOneStatementProcessor(SormOptions options, SqlParametersSetter sqlParametersSetter, TableMapping tableMapping, int batchSize, int multiRowSize) { - super(options, sqlParameterSetter, tableMapping, batchSize); + super(options, sqlParametersSetter, tableMapping, batchSize); this.multiRowSize = multiRowSize; } diff --git a/src/main/java/org/nkjmlab/sorm4j/internal/mapping/multirow/MultiRowProcessor.java b/src/main/java/org/nkjmlab/sorm4j/internal/mapping/multirow/MultiRowProcessor.java index 280bf423..686d86a5 100644 --- a/src/main/java/org/nkjmlab/sorm4j/internal/mapping/multirow/MultiRowProcessor.java +++ b/src/main/java/org/nkjmlab/sorm4j/internal/mapping/multirow/MultiRowProcessor.java @@ -7,7 +7,7 @@ import java.util.stream.IntStream; import org.nkjmlab.sorm4j.extension.SormLogger; import org.nkjmlab.sorm4j.extension.SormOptions; -import org.nkjmlab.sorm4j.extension.SqlParameterSetter; +import org.nkjmlab.sorm4j.extension.SqlParametersSetter; import org.nkjmlab.sorm4j.internal.mapping.TableMapping; import org.nkjmlab.sorm4j.internal.util.LogPoint; import org.nkjmlab.sorm4j.internal.util.LogPointFactory; @@ -16,15 +16,15 @@ public abstract class MultiRowProcessor { private final int batchSize; - private final SqlParameterSetter sqlParameterSetter; + private final SqlParametersSetter sqlParametersSetter; final TableMapping tableMapping; final SormOptions options; - MultiRowProcessor(SormOptions options, SqlParameterSetter sqlParameterSetter, + MultiRowProcessor(SormOptions options, SqlParametersSetter sqlParametersSetter, TableMapping tableMapping, int batchSize) { this.options = options; - this.sqlParameterSetter = sqlParameterSetter; + this.sqlParametersSetter = sqlParametersSetter; this.tableMapping = tableMapping; this.batchSize = batchSize; } @@ -65,7 +65,7 @@ public final int[] batch(SormOptions options, Connection con, String sql, final BatchHelper batchHelper = new BatchHelper(batchSize, stmt); for (int i = 0; i < objects.length; i++) { T obj = objects[i]; - this.sqlParameterSetter.setParameters(options, stmt, parameterCreator.apply(obj)); + this.sqlParametersSetter.setParameters(options, stmt, parameterCreator.apply(obj)); batchHelper.addBatchAndExecuteIfReachedThreshold(); } result = batchHelper.finish(); diff --git a/src/main/java/org/nkjmlab/sorm4j/internal/mapping/multirow/MultiRowProcessorFactory.java b/src/main/java/org/nkjmlab/sorm4j/internal/mapping/multirow/MultiRowProcessorFactory.java index fbcc0a9d..a770ab00 100644 --- a/src/main/java/org/nkjmlab/sorm4j/internal/mapping/multirow/MultiRowProcessorFactory.java +++ b/src/main/java/org/nkjmlab/sorm4j/internal/mapping/multirow/MultiRowProcessorFactory.java @@ -3,7 +3,7 @@ import java.util.function.Function; import org.nkjmlab.sorm4j.extension.Configurator.MultiRowProcessorType; import org.nkjmlab.sorm4j.extension.SormOptions; -import org.nkjmlab.sorm4j.extension.SqlParameterSetter; +import org.nkjmlab.sorm4j.extension.SqlParametersSetter; import org.nkjmlab.sorm4j.internal.mapping.TableMapping; public final class MultiRowProcessorFactory { @@ -20,18 +20,18 @@ public MultiRowProcessor getMultiRowProcessor(TableMapping tableMapping) { } public static MultiRowProcessorFactory createMultiRowProcessorFactory(SormOptions options, - SqlParameterSetter sqlParameterSetter, MultiRowProcessorType multiRowProcessorType, + SqlParametersSetter sqlParametersSetter, MultiRowProcessorType multiRowProcessorType, int batchSize, int multiRowSize, int batchSizeWithMultiRow) { switch (multiRowProcessorType) { case SIMPLE_BATCH: return new MultiRowProcessorFactory( - t -> new SimpleBatchProcessor<>(options, sqlParameterSetter, t, batchSize)); + t -> new SimpleBatchProcessor<>(options, sqlParametersSetter, t, batchSize)); case MULTI_ROW: return new MultiRowProcessorFactory(t -> new MultiRowInOneStatementProcessor<>(options, - sqlParameterSetter, t, batchSize, multiRowSize)); + sqlParametersSetter, t, batchSize, multiRowSize)); case MULTI_ROW_AND_BATCH: return new MultiRowProcessorFactory(t -> new BatchOfMultiRowInOneStatementProcessor<>( - options, sqlParameterSetter, t, batchSize, multiRowSize, batchSizeWithMultiRow)); + options, sqlParametersSetter, t, batchSize, multiRowSize, batchSizeWithMultiRow)); default: return null; } diff --git a/src/main/java/org/nkjmlab/sorm4j/internal/mapping/multirow/SimpleBatchProcessor.java b/src/main/java/org/nkjmlab/sorm4j/internal/mapping/multirow/SimpleBatchProcessor.java index 8c7478ad..c3bc7b25 100644 --- a/src/main/java/org/nkjmlab/sorm4j/internal/mapping/multirow/SimpleBatchProcessor.java +++ b/src/main/java/org/nkjmlab/sorm4j/internal/mapping/multirow/SimpleBatchProcessor.java @@ -2,13 +2,13 @@ import java.sql.Connection; import org.nkjmlab.sorm4j.extension.SormOptions; -import org.nkjmlab.sorm4j.extension.SqlParameterSetter; +import org.nkjmlab.sorm4j.extension.SqlParametersSetter; import org.nkjmlab.sorm4j.internal.mapping.TableMapping; final class SimpleBatchProcessor extends MultiRowProcessor { - public SimpleBatchProcessor(SormOptions options, SqlParameterSetter sqlParameterSetter, + public SimpleBatchProcessor(SormOptions options, SqlParametersSetter sqlParametersSetter, TableMapping tableMapping, int batchSize) { - super(options, sqlParameterSetter, tableMapping, batchSize); + super(options, sqlParametersSetter, tableMapping, batchSize); } @Override diff --git a/src/main/java/org/nkjmlab/sorm4j/internal/sql/NamedParameterSqlImpl.java b/src/main/java/org/nkjmlab/sorm4j/internal/sql/NamedParameterSqlImpl.java index 102c8079..1ba16637 100644 --- a/src/main/java/org/nkjmlab/sorm4j/internal/sql/NamedParameterSqlImpl.java +++ b/src/main/java/org/nkjmlab/sorm4j/internal/sql/NamedParameterSqlImpl.java @@ -95,7 +95,7 @@ public SqlStatement toSqlStatement() { } } } - return SqlStatementImpl.from(resultSql, orderdParams.values().toArray()); + return SqlStatementImpl.parse(resultSql, orderdParams.values().toArray()); } private List createParameters() { diff --git a/src/main/java/org/nkjmlab/sorm4j/internal/sql/OrderedParameterSqlImpl.java b/src/main/java/org/nkjmlab/sorm4j/internal/sql/OrderedParameterSqlImpl.java index 171054da..bf6986ea 100644 --- a/src/main/java/org/nkjmlab/sorm4j/internal/sql/OrderedParameterSqlImpl.java +++ b/src/main/java/org/nkjmlab/sorm4j/internal/sql/OrderedParameterSqlImpl.java @@ -35,7 +35,7 @@ public OrderedParameterSql addParameter(Object parameter) { @Override public SqlStatement toSqlStatement() { - return SqlStatementImpl.from(sql, parameters.toArray()); + return SqlStatementImpl.parse(sql, parameters.toArray()); } diff --git a/src/main/java/org/nkjmlab/sorm4j/internal/sql/SqlStatementImpl.java b/src/main/java/org/nkjmlab/sorm4j/internal/sql/SqlStatementImpl.java index 10e2fb27..a29608e8 100644 --- a/src/main/java/org/nkjmlab/sorm4j/internal/sql/SqlStatementImpl.java +++ b/src/main/java/org/nkjmlab/sorm4j/internal/sql/SqlStatementImpl.java @@ -46,9 +46,9 @@ public final Object[] getParameters() { } private static final String LIST_PLACEHOLDER = ""; - private static final String EMBEDDED_PLACEHOLDER = "$?$"; + private static final String EMBEDDED_PLACEHOLDER = "{?}"; - public static SqlStatement from(String sql, Object... parameters) { + public static SqlStatement parse(String sql, Object... parameters) { SqlStatement st = new SqlStatementImpl(sql, parameters); if (parameters.length == 0) { return st; @@ -106,7 +106,7 @@ private static int getSize(Object object) { private static SqlStatement procEmbeddedPlaceholder(String sql, Object[] parameters) { - final List specialParameterIndexes = createSpecialParameterIndexes(sql, '$', '?', '$'); + final List specialParameterIndexes = createSpecialParameterIndexes(sql, '{', '?', '}'); List removedEmbeddedParams = new ArrayList<>(); for (int i = 0; i < parameters.length; i++) { diff --git a/src/main/java/org/nkjmlab/sorm4j/sql/SqlStatement.java b/src/main/java/org/nkjmlab/sorm4j/sql/SqlStatement.java index 9085862c..cb683c73 100644 --- a/src/main/java/org/nkjmlab/sorm4j/sql/SqlStatement.java +++ b/src/main/java/org/nkjmlab/sorm4j/sql/SqlStatement.java @@ -35,7 +35,7 @@ public interface SqlStatement { * @return */ static SqlStatement from(String sql) { - return SqlStatementImpl.from(sql); + return SqlStatementImpl.parse(sql); } /** diff --git a/src/test/java/org/nkjmlab/sorm4j/internal/mapping/multirow/OrmConfigStoreTest.java b/src/test/java/org/nkjmlab/sorm4j/internal/mapping/multirow/OrmConfigStoreTest.java index 17df6a2c..f34b36a6 100644 --- a/src/test/java/org/nkjmlab/sorm4j/internal/mapping/multirow/OrmConfigStoreTest.java +++ b/src/test/java/org/nkjmlab/sorm4j/internal/mapping/multirow/OrmConfigStoreTest.java @@ -3,8 +3,6 @@ import static org.assertj.core.api.Assertions.*; import static org.nkjmlab.sorm4j.common.SormTestUtils.*; import static org.nkjmlab.sorm4j.extension.Configurator.MultiRowProcessorType.*; -import java.sql.ResultSet; -import java.util.List; import org.junit.jupiter.api.Test; import org.nkjmlab.sorm4j.Sorm; import org.nkjmlab.sorm4j.SormFactory; @@ -15,12 +13,10 @@ import org.nkjmlab.sorm4j.extension.Configurator.MultiRowProcessorType; import org.nkjmlab.sorm4j.extension.DefaultColumnFieldMapper; import org.nkjmlab.sorm4j.extension.DefaultResultSetConverter; -import org.nkjmlab.sorm4j.extension.DefaultResultSetConverter.ColumnValueConverter; -import org.nkjmlab.sorm4j.extension.DefaultSqlParameterSetter; +import org.nkjmlab.sorm4j.extension.DefaultSqlParametersSetter; import org.nkjmlab.sorm4j.extension.DefaultTableNameMapper; import org.nkjmlab.sorm4j.extension.ResultSetConverter; -import org.nkjmlab.sorm4j.extension.SormOptions; -import org.nkjmlab.sorm4j.extension.SqlParameterSetter; +import org.nkjmlab.sorm4j.extension.SqlParametersSetter; import org.nkjmlab.sorm4j.extension.TableNameMapper; import org.nkjmlab.sorm4j.internal.mapping.ConfigStore; @@ -33,8 +29,8 @@ class OrmConfigStoreTest { private static final TableNameMapper DEFAULT_TABLE_NAME_MAPPER = new DefaultTableNameMapper(); private static final ResultSetConverter DEFAULT_RESULT_SET_CONVERTER = new DefaultResultSetConverter(); - private static final SqlParameterSetter DEFAULT_SQL_PARAMETER_SETTER = - new DefaultSqlParameterSetter(); + private static final SqlParametersSetter DEFAULT_SQL_PARAMETER_SETTER = + new DefaultSqlParametersSetter(); private static final MultiRowProcessorType DEFAULT_MULTI_ROW_PROCESSOR = MULTI_ROW; @Test @@ -52,27 +48,12 @@ void testOrmConfigFail() { @Test void testOrmConfigStore() { - DefaultResultSetConverter rsc = - new DefaultResultSetConverter(List.of(new ColumnValueConverter() { - - @Override - public boolean isConvertable(SormOptions options, ResultSet resultSet, int column, - int columnType, Class toType) { - // TODO Auto-generated method stub - return false; - } - - @Override - public Object convertTo(SormOptions options, ResultSet resultSet, int column, - int columnType, Class toType) { - // TODO Auto-generated method stub - return null; - } - })); + ResultSetConverter rsc = DEFAULT_RESULT_SET_CONVERTER; + SormFactory.registerConfig(NEW_CONFIG, b -> b.setColumnFieldMapper(DEFAULT_COLUMN_FIELD_MAPPER) .setTableNameMapper(DEFAULT_TABLE_NAME_MAPPER).setResultSetConverter(rsc) - .setSqlParameterSetter(DEFAULT_SQL_PARAMETER_SETTER) + .setSqlParametersSetter(DEFAULT_SQL_PARAMETER_SETTER) .setMultiRowProcessorType(DEFAULT_MULTI_ROW_PROCESSOR).setBatchSize(10) .setMultiRowSize(20).setBatchSizeWithMultiRow(30)); @@ -82,7 +63,7 @@ public Object convertTo(SormOptions options, ResultSet resultSet, int column, assertThat(confs.getColumnFieldMapper()).isEqualTo(DEFAULT_COLUMN_FIELD_MAPPER); assertThat(confs.getTableNameMapper()).isEqualTo(DEFAULT_TABLE_NAME_MAPPER); assertThat(confs.getResultSetConverter()).isEqualTo(rsc); - assertThat(confs.getSqlParameterSetter()).isEqualTo(DEFAULT_SQL_PARAMETER_SETTER); + assertThat(confs.getSqlParametersSetter()).isEqualTo(DEFAULT_SQL_PARAMETER_SETTER); } @Test diff --git a/src/test/java/org/nkjmlab/sorm4j/sql/NamedParameterSqlTest.java b/src/test/java/org/nkjmlab/sorm4j/sql/NamedParameterSqlTest.java index 7905c74f..8593c16d 100644 --- a/src/test/java/org/nkjmlab/sorm4j/sql/NamedParameterSqlTest.java +++ b/src/test/java/org/nkjmlab/sorm4j/sql/NamedParameterSqlTest.java @@ -21,7 +21,7 @@ void testCustomer() { { SqlStatement statement = OrderedParameterSql.toSqlStatement( - "select * from customer where name like $?$ and address in() and id=?", "A%", + "select * from customer where name like {?} and address in() and id=?", "A%", List.of("Tokyo", "Kyoto"), 1); System.out.println(statement); List ret = sorm.apply(conn -> conn.readList(Customer.class, statement)); @@ -38,7 +38,7 @@ void testCustomer() { } { SqlStatement statement = NamedParameterSql.toSqlStatement( - "select * from customer where name like $:name$ and address in(<:address>) and id=:id", + "select * from customer where name like {:name} and address in(<:address>) and id=:id", Map.of("id", 1, "address", List.of("Tokyo", "Kyoto"), "name", "A%")); System.out.println(statement); List ret = sorm.apply(conn -> conn.readList(Customer.class, statement)); diff --git a/src/test/java/repackage/net/sf/persist/tests/engine/framework/DbEngineTestUtils.java b/src/test/java/repackage/net/sf/persist/tests/engine/framework/DbEngineTestUtils.java index c23d61f9..ebf0c276 100644 --- a/src/test/java/repackage/net/sf/persist/tests/engine/framework/DbEngineTestUtils.java +++ b/src/test/java/repackage/net/sf/persist/tests/engine/framework/DbEngineTestUtils.java @@ -15,12 +15,12 @@ public class DbEngineTestUtils { - public static void executeTableSchema(Class clazz, DataSource dataSource) { + public static void executeSql(DataSource dataSource, Class clazz, String fileName) { try (Connection conn = dataSource.getConnection()) { Statement st = conn.createStatement(); String[] sqls = String .join(System.lineSeparator(), - Files.readAllLines(new File(clazz.getResource("schema.sql").toURI()).toPath())) + Files.readAllLines(new File(clazz.getResource(fileName).toURI()).toPath())) .split(";"); Arrays.asList(sqls).forEach(sql -> { try { @@ -37,7 +37,7 @@ public static void executeTableSchema(Class clazz, DataSource dataSource) { } catch (SQLException | URISyntaxException | IOException e) { System.err.println(e.getMessage()); } - + } public static DataSource getDataSource(Class clazz, String defaultJdbcUrl) { diff --git a/src/test/java/repackage/net/sf/persist/tests/engine/mysql/TestMysql.java b/src/test/java/repackage/net/sf/persist/tests/engine/mysql/TestMysql.java index 2a405203..7d005e3e 100644 --- a/src/test/java/repackage/net/sf/persist/tests/engine/mysql/TestMysql.java +++ b/src/test/java/repackage/net/sf/persist/tests/engine/mysql/TestMysql.java @@ -26,7 +26,7 @@ public class TestMysql { static void beforAll() { dataSource = DbEngineTestUtils.getDataSource(TestMysql.class, "jdbc:h2:mem:mysql;MODE=MySQL;DATABASE_TO_LOWER=TRUE"); - DbEngineTestUtils.executeTableSchema(TestMysql.class, dataSource); + DbEngineTestUtils.executeSql(dataSource, TestMysql.class, "schema.sql"); } public static void main(String[] args) { diff --git a/src/test/java/repackage/net/sf/persist/tests/engine/oracle/TestOracle.java b/src/test/java/repackage/net/sf/persist/tests/engine/oracle/TestOracle.java index 36ef952d..1a716c1a 100644 --- a/src/test/java/repackage/net/sf/persist/tests/engine/oracle/TestOracle.java +++ b/src/test/java/repackage/net/sf/persist/tests/engine/oracle/TestOracle.java @@ -23,7 +23,7 @@ public class TestOracle { @BeforeAll static void beforAll() { dataSource = DbEngineTestUtils.getDataSource(TestOracle.class, "jdbc:h2:mem:oracle;MODE=Oracle"); - DbEngineTestUtils.executeTableSchema(TestOracle.class, dataSource); + DbEngineTestUtils.executeSql(dataSource, TestOracle.class, "schema.sql"); } public static void main(String[] args) { diff --git a/src/test/java/repackage/net/sf/persist/tests/engine/postgresql/TestPostgreSQL.java b/src/test/java/repackage/net/sf/persist/tests/engine/postgresql/TestPostgreSQL.java index 8bcecad0..825a31c7 100644 --- a/src/test/java/repackage/net/sf/persist/tests/engine/postgresql/TestPostgreSQL.java +++ b/src/test/java/repackage/net/sf/persist/tests/engine/postgresql/TestPostgreSQL.java @@ -3,33 +3,15 @@ import java.io.InputStream; import java.math.BigDecimal; -import java.net.InetAddress; -import java.net.MalformedURLException; -import java.net.URL; -import java.net.UnknownHostException; import java.sql.Blob; import java.sql.Clob; import java.sql.Connection; -import java.sql.Date; import java.sql.SQLException; -import java.sql.Time; -import java.sql.Timestamp; -import java.time.LocalDate; -import java.time.LocalDateTime; -import java.time.LocalTime; -import java.time.OffsetDateTime; -import java.time.OffsetTime; -import java.time.ZoneOffset; -import java.util.List; -import java.util.Map; -import java.util.UUID; import javax.sql.DataSource; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; import org.nkjmlab.sorm4j.OrmConnection; import org.nkjmlab.sorm4j.SormFactory; -import org.nkjmlab.sorm4j.sql.OrderedParameterSql; -import org.nkjmlab.sorm4j.sql.SqlStatement; import repackage.net.sf.persist.tests.engine.framework.BeanMap; import repackage.net.sf.persist.tests.engine.framework.BeanTest; import repackage.net.sf.persist.tests.engine.framework.DbEngineTestUtils; @@ -42,125 +24,10 @@ public class TestPostgreSQL { static void beforAll() { dataSource = DbEngineTestUtils.getDataSource(TestPostgreSQL.class, "jdbc:h2:mem:postgre;MODE=PostgreSQL"); - DbEngineTestUtils.executeTableSchema(TestPostgreSQL.class, dataSource); + DbEngineTestUtils.executeSql(dataSource, TestPostgreSQL.class, "schema.sql"); } - /** - * @see https://github.com/orangain/compare-sql-mappers/ - * - * @throws SQLException - */ - private static final ZoneOffset JST_OFFSET = ZoneOffset.of("+09:00"); - private static final LocalDate localDate = LocalDate.of(2019, 9, 27); - private static final LocalTime localTime = LocalTime.of(13, 23); - private static final LocalDateTime localDateTime = LocalDateTime.of(localDate, localTime); - private static final OffsetTime offsetTime = OffsetTime.of(localTime, JST_OFFSET); - private static final OffsetDateTime offsetDateTime = - OffsetDateTime.of(localDate, localTime, JST_OFFSET); - - - @Test - public void testMapTest() throws SQLException, MalformedURLException, UnknownHostException { - try (Connection conn = dataSource.getConnection()) { - OrmConnection c = SormFactory.toOrmConnection(conn); - doTest(c, "c_boolean", true); - doTest(c, "c_integer", 1); - doTest(c, "c_integer", new BigDecimal("1")); - doTest(c, "c_decimal", new BigDecimal("0.5")); - doTest(c, "c_double", 0.5); - doTest(c, "c_double", new BigDecimal("0.5")); - doTest(c, "c_varchar", "varchar"); - doTest(c, "c_text", "long long text"); - doTest(c, "c_bytea", new byte[] {(byte) 0xde, (byte) 0xAD, (byte) 0xBE, (byte) 0xEF}); - doTest(c, "c_uuid", UUID.fromString("33ee757a-19b3-45dc-be79-f1d65ac5d1a4")); - doTest(c, "c_date", localDate); - doTest(c, "c_date", Date.valueOf(localDate)); - doTest(c, "c_time", localTime); - doTest(c, "c_time", Time.valueOf(localTime)); - doTest(c, "c_timetz", offsetTime); - doTest(c, "c_timestamp", localDateTime); - doTest(c, "c_timestamp", Timestamp.valueOf(localDateTime)); - doTest(c, "c_timestamptz", offsetDateTime); - doTest(c, "c_inet_ipv4", InetAddress.getByName("192.168.1.1")); - doTest(c, "c_inet_ipv6", InetAddress.getByName("::1")); - doTest(c, "c_url", new URL("https://example.com")); - doTest(c, "c_integer_array", new Integer[] {1, 2, 3}); - doTest(c, "c_integer_array", new int[] {1, 2, 3}); - doTest(c, "c_varchar_array", new String[] {"A", "B", "C"}); - - doTest(c, "c_integer_array", List.of(1, 2, 3)); - doTest(c, "c_varchar_array", List.of("A", "B", "C")); - - - System.out.println("--------"); - doTestIn(c, "c_integer", List.of(1, 2, 3)); - doTestIn(c, "c_integer", new Integer[] {1, 2, 3}); - doTestIn(c, "c_integer", new int[] {1, 2, 3}); - doTestIn(c, "c_varchar", List.of("integer", "varchar", "text")); - doTestIn(c, "c_varchar", new String[] {"integer", "varchar", "text"}); - } - } - - private void doTest(OrmConnection c, String column, Object param) { - bindTest(c, column, param); - mapTest(c, column, param); - } - - private void mapTest(OrmConnection c, String column, Object param) { - String messagePrefix = "map: " + column + "(" + param.getClass() + ") "; - try { - Object ret = c.readFirst(param.getClass(), "SELECT " + column + " FROM sql_mapper_test"); - if (ret.equals(param)) { - System.out.println(messagePrefix + "success => " + ret); - } else { - System.out.println(messagePrefix + "fail => " + ret); - } - } catch (Exception e) { - System.err.println(messagePrefix + "fail => " + e.getMessage()); - } - } - - private void bindTest(OrmConnection c, String column, Object param) { - String messagePrefix = "bind: " + column + "(" + param.getClass() + ") "; - try { - Map ret = c - .readMapFirst("SELECT " + column + " FROM sql_mapper_test WHERE " + column + "=?", param); - if (ret != null) { - System.out.println(messagePrefix + "success => " + ret); - } else { - System.out.println(messagePrefix + "fail => " + ret); - } - } catch (Exception e) { - System.err.println(messagePrefix + "fail => " + e.getMessage()); - } - - } - - private void doTestIn(OrmConnection c, String column, Object param) { - bindInTest(c, column, param); - } - - private void bindInTest(OrmConnection c, String column, Object param) { - String messagePrefix = "bindIn: " + column + "(" + param.getClass() + ") "; - try { - SqlStatement statement = OrderedParameterSql - .from("SELECT " + column + " FROM sql_mapper_test WHERE " + column + " in()") - .addParameter(param).toSqlStatement(); - Map ret = c.readMapFirst(statement); - if (ret != null) { - System.out.println(messagePrefix + "success => " + ret); - } else { - System.out.println(messagePrefix + "fail => " + ret); - } - } catch (Exception e) { - System.err.println(messagePrefix + "fail => " + e.getMessage()); - } - } - - - - // several tests inherited from net.sf.persist.tests.common.TestSimple @Test public void testBinaryTypes() throws SQLException { diff --git a/src/test/java/repackage/net/sf/persist/tests/engine/sqlserver/TestSqlserver.java b/src/test/java/repackage/net/sf/persist/tests/engine/sqlserver/TestSqlserver.java index f98e5cb7..4afe4890 100644 --- a/src/test/java/repackage/net/sf/persist/tests/engine/sqlserver/TestSqlserver.java +++ b/src/test/java/repackage/net/sf/persist/tests/engine/sqlserver/TestSqlserver.java @@ -25,7 +25,7 @@ public static void main(String[] args) { static void beforAll() { dataSource = DbEngineTestUtils.getDataSource(TestSqlserver.class, "jdbc:h2:mem:sqlserver;MODE=MSSQLServer"); - DbEngineTestUtils.executeTableSchema(TestSqlserver.class, dataSource); + DbEngineTestUtils.executeSql(dataSource, TestSqlserver.class, "schema.sql"); SormFactory .updateDefaultConfig(configurator -> configurator.setOption("dbEngine", "MSSQLServer")); From 5bee9d834266902135bf42cc3d49617e1b7fe24a Mon Sep 17 00:00:00 2001 From: Yuu Nakajima Date: Wed, 14 Apr 2021 12:22:04 +0900 Subject: [PATCH 03/20] Add PostgreSQL tests --- .../postgresql/TestPostgreSQLSqlMapper.java | 220 ++++++++++++++++++ .../engine/postgresql/sql-mapper-test.sql | 71 ++++++ 2 files changed, 291 insertions(+) create mode 100644 src/test/java/repackage/net/sf/persist/tests/engine/postgresql/TestPostgreSQLSqlMapper.java create mode 100644 src/test/java/repackage/net/sf/persist/tests/engine/postgresql/sql-mapper-test.sql diff --git a/src/test/java/repackage/net/sf/persist/tests/engine/postgresql/TestPostgreSQLSqlMapper.java b/src/test/java/repackage/net/sf/persist/tests/engine/postgresql/TestPostgreSQLSqlMapper.java new file mode 100644 index 00000000..006ae732 --- /dev/null +++ b/src/test/java/repackage/net/sf/persist/tests/engine/postgresql/TestPostgreSQLSqlMapper.java @@ -0,0 +1,220 @@ +package repackage.net.sf.persist.tests.engine.postgresql; + + +import java.math.BigDecimal; +import java.net.InetAddress; +import java.net.MalformedURLException; +import java.net.URL; +import java.net.UnknownHostException; +import java.sql.Connection; +import java.sql.Date; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Time; +import java.sql.Timestamp; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.LocalTime; +import java.time.OffsetDateTime; +import java.time.OffsetTime; +import java.time.ZoneOffset; +import java.util.List; +import java.util.Map; +import java.util.UUID; +import javax.sql.DataSource; +import org.assertj.core.util.Arrays; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; +import org.nkjmlab.sorm4j.OrmConnection; +import org.nkjmlab.sorm4j.SormFactory; +import org.nkjmlab.sorm4j.extension.ColumnValueConverter; +import org.nkjmlab.sorm4j.extension.DefaultResultSetConverter; +import org.nkjmlab.sorm4j.extension.DefaultSqlParametersSetter; +import org.nkjmlab.sorm4j.extension.ParameterSetter; +import org.nkjmlab.sorm4j.extension.ResultSetConverter; +import org.nkjmlab.sorm4j.extension.SormOptions; +import org.nkjmlab.sorm4j.extension.SqlParametersSetter; +import org.nkjmlab.sorm4j.sql.OrderedParameterSql; +import org.nkjmlab.sorm4j.sql.SqlStatement; +import org.postgresql.util.PGobject; +import repackage.net.sf.persist.tests.engine.framework.DbEngineTestUtils; + +public class TestPostgreSQLSqlMapper { + private static DataSource dataSource; + + @BeforeAll + static void beforAll() { + dataSource = DbEngineTestUtils.getDataSource(TestPostgreSQLSqlMapper.class, + "jdbc:h2:mem:postgre;MODE=PostgreSQL"); + DbEngineTestUtils.executeSql(dataSource, TestPostgreSQLSqlMapper.class, "sql-mapper-test.sql"); + + SqlParametersSetter ps = new DefaultSqlParametersSetter(new ParameterSetter() { + + @Override + public boolean isApplicable(SormOptions options, PreparedStatement stmt, int parameterIndex, + Class parameterClass, Object parameter) { + return java.net.InetAddress.class.isAssignableFrom(parameterClass); + } + + @Override + public void setParameter(SormOptions options, PreparedStatement stmt, int parameterIndex, + Class parameterClass, Object parameter) throws SQLException { + PGobject pg = new PGobject(); + pg.setType("inet"); + pg.setValue(((InetAddress) parameter).getHostAddress()); + stmt.setObject(parameterIndex, pg); + + } + + }); + + ResultSetConverter rsc = new DefaultResultSetConverter(new ColumnValueConverter() { + + @Override + public boolean isApplicable(SormOptions options, ResultSet resultSet, int column, + int columnType, Class toType) { + // TODO Auto-generated method stub + return false; + } + + @Override + public Object convertTo(SormOptions options, ResultSet resultSet, int column, int columnType, + Class toType) { + // TODO Auto-generated method stub + return null; + } + }); + SormFactory + .updateDefaultConfig(conf -> conf.setSqlParametersSetter(ps).setResultSetConverter(rsc)); + } + + + /** + * @see https://github.com/orangain/compare-sql-mappers/ + * + * @throws SQLException + */ + private static final ZoneOffset JST_OFFSET = ZoneOffset.of("+09:00"); + private static final LocalDate localDate = LocalDate.of(2019, 9, 27); + private static final LocalTime localTime = LocalTime.of(13, 23); + private static final LocalDateTime localDateTime = LocalDateTime.of(localDate, localTime); + private static final OffsetTime offsetTime = OffsetTime.of(localTime, JST_OFFSET); + private static final OffsetDateTime offsetDateTime = + OffsetDateTime.of(localDate, localTime, JST_OFFSET); + + + @Test + public void testMapTest() throws SQLException, MalformedURLException, UnknownHostException { + try (Connection conn = dataSource.getConnection()) { + OrmConnection c = SormFactory.toOrmConnection(conn); + doTest(c, "c_boolean", true); + doTest(c, "c_integer", 1); + doTest(c, "c_integer", new BigDecimal("1")); + doTest(c, "c_decimal", new BigDecimal("0.5")); + doTest(c, "c_double", 0.5); + doTest(c, "c_double", new BigDecimal("0.5")); + doTest(c, "c_varchar", "varchar"); + doTest(c, "c_text", "long long text"); + doTest(c, "c_bytea", new byte[] {(byte) 0xde, (byte) 0xAD, (byte) 0xBE, (byte) 0xEF}); + doTest(c, "c_uuid", UUID.fromString("33ee757a-19b3-45dc-be79-f1d65ac5d1a4")); + doTest(c, "c_date", localDate); + doTest(c, "c_date", Date.valueOf(localDate)); + doTest(c, "c_time", localTime); + doTest(c, "c_time", Time.valueOf(localTime)); + doTest(c, "c_timetz", offsetTime); + doTest(c, "c_timestamp", localDateTime); + doTest(c, "c_timestamp", Timestamp.valueOf(localDateTime)); + doTest(c, "c_timestamptz", offsetDateTime); + doTest(c, "c_inet_ipv4", InetAddress.getByName("192.168.1.1")); + doTest(c, "c_inet_ipv6", InetAddress.getByName("::1")); + doTest(c, "c_url", new URL("https://example.com")); + doTest(c, "c_integer_array", new Integer[] {1, 2, 3}); + doTest(c, "c_integer_array", new int[] {1, 2, 3}); + doTest(c, "c_varchar_array", new String[] {"A", "B", "C"}); + + doTest(c, "c_integer_array", List.of(1, 2, 3)); + doTest(c, "c_varchar_array", List.of("A", "B", "C")); + + + System.out.println("--------"); + doTestIn(c, "c_integer", List.of(1, 2, 3)); + doTestIn(c, "c_integer", new Integer[] {1, 2, 3}); + doTestIn(c, "c_integer", new int[] {1, 2, 3}); + doTestIn(c, "c_varchar", List.of("integer", "varchar", "text")); + doTestIn(c, "c_varchar", new String[] {"integer", "varchar", "text"}); + } + } + + private void doTest(OrmConnection c, String column, Object param) { + bindTest(c, column, param); + mapTest(c, column, param); + } + + private void mapTest(OrmConnection c, String column, Object param) { + String messagePrefix = "map: " + column + "(" + param.getClass() + ") "; + try { + Object ret = c.readFirst(param.getClass(), "SELECT " + column + " FROM sql_mapper_test"); + if (equals(ret, param)) { + System.out.println(messagePrefix + "success => " + ret); + } else { + System.err.println(messagePrefix + "fail => " + ret); + } + } catch (Exception e) { + System.err.println(messagePrefix + "fail => " + e.getMessage()); + } + } + + private boolean equals(Object ret, Object param) throws SQLException { + if (ret.getClass().isArray()) { + return (param.getClass().isArray() ? Arrays.asList(param) : param).equals(Arrays.asList(ret)); + } else if (java.sql.Array.class.isAssignableFrom(ret.getClass())) { + java.sql.Array arr = (java.sql.Array) ret; + return (param.getClass().isArray() ? Arrays.asList(param) : param) + .equals(Arrays.asList(arr.getArray())); + } else { + return param.equals(ret); + } + } + + private void bindTest(OrmConnection c, String column, Object param) { + String messagePrefix = "bind: " + column + "(" + param.getClass() + ") "; + try { + Map ret = c + .readMapFirst("SELECT " + column + " FROM sql_mapper_test WHERE " + column + "=?", param); + if (ret != null) { + System.out.println(messagePrefix + "success => " + ret); + } else { + System.err.println(messagePrefix + "fail => " + ret); + } + } catch (Exception e) { + System.err.println(messagePrefix + "fail => " + e.getMessage()); + //e.printStackTrace(); + } + + } + + private void doTestIn(OrmConnection c, String column, Object param) { + bindInTest(c, column, param); + } + + private void bindInTest(OrmConnection c, String column, Object param) { + String messagePrefix = "bindIn: " + column + "(" + param.getClass() + ") "; + try { + SqlStatement statement = OrderedParameterSql + .from("SELECT " + column + " FROM sql_mapper_test WHERE " + column + " in()") + .addParameter(param).toSqlStatement(); + Map ret = c.readMapFirst(statement); + if (ret != null) { + System.out.println(messagePrefix + "success => " + ret); + } else { + System.out.println(messagePrefix + "fail => " + ret); + } + } catch (Exception e) { + System.err.println(messagePrefix + "fail => " + e.getMessage()); + } + } + + + +} diff --git a/src/test/java/repackage/net/sf/persist/tests/engine/postgresql/sql-mapper-test.sql b/src/test/java/repackage/net/sf/persist/tests/engine/postgresql/sql-mapper-test.sql new file mode 100644 index 00000000..8051ce96 --- /dev/null +++ b/src/test/java/repackage/net/sf/persist/tests/engine/postgresql/sql-mapper-test.sql @@ -0,0 +1,71 @@ + drop table if exists sql_mapper_test; + + create table sql_mapper_test ( + -- simple + c_boolean boolean, + c_integer integer, + c_decimal decimal, + c_double double precision, + c_varchar varchar(100), + c_text text, + c_bytea bytea, + c_uuid uuid, + -- datetime + c_date date, + c_time time, + c_timetz timetz, + c_timestamp timestamp, + c_timestamptz timestamptz, + -- complex + c_inet_ipv4 inet, + c_inet_ipv6 inet, + c_url text, + c_integer_array integer[], + c_varchar_array varchar(10)[] + ); + + insert into sql_mapper_test ( + -- simple + c_boolean, + c_integer, + c_decimal, + c_double, + c_varchar, + c_text, + c_bytea, + c_uuid, + -- datetime + c_date, + c_time, + c_timetz, + c_timestamp, + c_timestamptz, + -- complex + c_inet_ipv4, + c_inet_ipv6, + c_url, + c_integer_array, + c_varchar_array + ) values ( + -- simple + true, + 1, + '0.5', + 0.5, + 'varchar', + 'long long text', + E'\\xDEADBEEF', + '33ee757a-19b3-45dc-be79-f1d65ac5d1a4', + -- datetime + '2019-09-27', + '13:23', + '13:23+09:00', + '2019-09-27T13:23', + '2019-09-27T13:23+09:00', + -- complex + inet '192.168.1.1', + inet '::1', + 'https://example.com', + array[1, 2, 3], + array['A', 'B', 'C'] + ); \ No newline at end of file From 8453547896b23c953caf69d934b4a0e102f92eaf Mon Sep 17 00:00:00 2001 From: Yuu Nakajima Date: Thu, 15 Apr 2021 08:02:24 +0900 Subject: [PATCH 04/20] Add getOrDefault --- src/main/java/org/nkjmlab/sorm4j/internal/util/Try.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/nkjmlab/sorm4j/internal/util/Try.java b/src/main/java/org/nkjmlab/sorm4j/internal/util/Try.java index 5a15f5ea..a12745c7 100644 --- a/src/main/java/org/nkjmlab/sorm4j/internal/util/Try.java +++ b/src/main/java/org/nkjmlab/sorm4j/internal/util/Try.java @@ -6,7 +6,6 @@ import java.util.function.Supplier; public final class Try { - // private static final org.slf4j.Logger log = org.nkjmlab.sorm4j.internal.util.LoggerFactory.getLogger(); private Try() {} @@ -131,6 +130,12 @@ public static T getOrNull(ThrowableSupplier onTry) { }).get(); } + public static T getOrDefault(ThrowableSupplier onTry, T defaultValue) { + return createSupplier(onTry, e -> { + return defaultValue; + }).get(); + } + public static T getOrThrow(ThrowableSupplier onTry, Function ex) throws X { return createSupplier(onTry, e -> { From 447decaf2a83d7fddf65b15f880562ccd75a1249 Mon Sep 17 00:00:00 2001 From: Yuu Nakajima Date: Thu, 15 Apr 2021 09:21:32 +0900 Subject: [PATCH 05/20] Add logging for applyPreparedStatementHandler --- .../java/org/nkjmlab/sorm4j/SqlExecutor.java | 17 +-- .../nkjmlab/sorm4j/extension/SormLogger.java | 2 +- .../internal/mapping/OrmConnectionImpl.java | 101 +++++++++++------- 3 files changed, 71 insertions(+), 49 deletions(-) diff --git a/src/main/java/org/nkjmlab/sorm4j/SqlExecutor.java b/src/main/java/org/nkjmlab/sorm4j/SqlExecutor.java index b00865a0..6cb5a61c 100644 --- a/src/main/java/org/nkjmlab/sorm4j/SqlExecutor.java +++ b/src/main/java/org/nkjmlab/sorm4j/SqlExecutor.java @@ -17,27 +17,28 @@ */ public interface SqlExecutor { + /** - * Applys handler for {@link PreparedStatement} which has sets the given parameters. + * Accepts handler for {@link PreparedStatement} which has sets the given parameters. * - * @param * @param sql * @param handler - * @return */ @Experimental - T applyPreparedStatementHandler(SqlStatement sql, - FunctionHandler handler); + void acceptPreparedStatementHandler(SqlStatement sql, ConsumerHandler handler); + /** - * Accepts handler for {@link PreparedStatement} which has sets the given parameters. + * Applies handler for {@link PreparedStatement} which has sets the given parameters. * + * @param * @param sql * @param handler + * @return */ @Experimental - void acceptPreparedStatementHandler(SqlStatement sql, ConsumerHandler handler); - + T applyPreparedStatementHandler(SqlStatement sql, + FunctionHandler handler); /** * Executes a query and apply the given handler to the returned result set. diff --git a/src/main/java/org/nkjmlab/sorm4j/extension/SormLogger.java b/src/main/java/org/nkjmlab/sorm4j/extension/SormLogger.java index 3c10ca76..176fafe9 100644 --- a/src/main/java/org/nkjmlab/sorm4j/extension/SormLogger.java +++ b/src/main/java/org/nkjmlab/sorm4j/extension/SormLogger.java @@ -22,7 +22,7 @@ private SormLogger() {} * */ public enum Category { - MAPPING, EXECUTE_QUERY, MULTI_ROW, EXECUTE_UPDATE; + MAPPING, EXECUTE_QUERY, MULTI_ROW, EXECUTE_UPDATE, HANDLE_PREPAREDSTATEMENT; } /** diff --git a/src/main/java/org/nkjmlab/sorm4j/internal/mapping/OrmConnectionImpl.java b/src/main/java/org/nkjmlab/sorm4j/internal/mapping/OrmConnectionImpl.java index 3c82fb97..84b3ea89 100644 --- a/src/main/java/org/nkjmlab/sorm4j/internal/mapping/OrmConnectionImpl.java +++ b/src/main/java/org/nkjmlab/sorm4j/internal/mapping/OrmConnectionImpl.java @@ -1,6 +1,5 @@ package org.nkjmlab.sorm4j.internal.mapping; -import static org.nkjmlab.sorm4j.internal.util.StringUtils.*; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; @@ -19,9 +18,9 @@ import org.nkjmlab.sorm4j.RowMapper; import org.nkjmlab.sorm4j.SormException; import org.nkjmlab.sorm4j.TypedOrmConnection; -import org.nkjmlab.sorm4j.extension.SormOptions; import org.nkjmlab.sorm4j.extension.ResultSetConverter; import org.nkjmlab.sorm4j.extension.SormLogger; +import org.nkjmlab.sorm4j.extension.SormOptions; import org.nkjmlab.sorm4j.extension.SqlParametersSetter; import org.nkjmlab.sorm4j.internal.sql.NamedParameterQueryImpl; import org.nkjmlab.sorm4j.internal.sql.OrderedParameterQueryImpl; @@ -79,18 +78,25 @@ static R executeQueryAndRead(SormOptions options, Connection connection, return ret; } } catch (Exception e) { - String msg = (parameters == null || parameters.length == 0) ? format("Error in sql=[{}]", sql) - : format("Fail to execute sql=[{}], parameters={}", sql, parameters); - throw new SormException(msg + System.lineSeparator() + e.getMessage(), e); + throw Try.rethrow(e); } } static final int executeUpdateAndClose(SormOptions options, Connection connection, SqlParametersSetter sqlParametersSetter, String sql, Object[] parameters) { + final Optional dp = + LogPointFactory.createLogPoint(SormLogger.Category.EXECUTE_UPDATE); + try (PreparedStatement stmt = connection.prepareStatement(sql)) { sqlParametersSetter.setParameters(options, stmt, parameters); - return stmt.executeUpdate(); - } catch (Exception e) { + int ret = stmt.executeUpdate(); + dp.ifPresent(lp -> { + lp.trace(OrmConnectionImpl.class, "[{}] Parameters = {} ", lp.getTag(), parameters); + lp.debug(OrmConnectionImpl.class, "{} Call [{}] [{}]", lp.getTagAndElapsedTime(), sql, + Try.getOrNull(() -> connection.getMetaData().getURL()), sql); + }); + return ret; + } catch (SQLException e) { throw Try.rethrow(e); } } @@ -254,26 +260,42 @@ private final R execSqlIfParameterExists(T[] objects, } @Override - public T applyPreparedStatementHandler(SqlStatement sql, - FunctionHandler handler) { + public void acceptPreparedStatementHandler(SqlStatement sql, + ConsumerHandler handler) { try (PreparedStatement stmt = connection.prepareStatement(sql.getSql())) { sqlParametersSetter.setParameters(mappings.getOptions(), stmt, sql.getParameters()); - return handler.apply(stmt); + final Optional dp = + LogPointFactory.createLogPoint(SormLogger.Category.HANDLE_PREPAREDSTATEMENT); + handler.accept(stmt); + dp.ifPresent(lp -> { + lp.trace(OrmConnectionImpl.class, "[{}] Parameters = {} ", lp.getTag(), + sql.getParameters()); + lp.debug(OrmConnectionImpl.class, "{} Call [{}] [{}]", lp.getTagAndElapsedTime(), + sql.getSql(), Try.getOrNull(() -> connection.getMetaData().getURL()), sql); + }); } catch (Exception e) { - throw new SormException(sql + System.lineSeparator() + e.getMessage(), e); + throw Try.rethrow(e); } } @Override - public void acceptPreparedStatementHandler(SqlStatement sql, - ConsumerHandler handler) { + public T applyPreparedStatementHandler(SqlStatement sql, + FunctionHandler handler) { try (PreparedStatement stmt = connection.prepareStatement(sql.getSql())) { sqlParametersSetter.setParameters(mappings.getOptions(), stmt, sql.getParameters()); - handler.accept(stmt); + final Optional dp = + LogPointFactory.createLogPoint(SormLogger.Category.HANDLE_PREPAREDSTATEMENT); + T ret = handler.apply(stmt); + dp.ifPresent(lp -> { + lp.trace(OrmConnectionImpl.class, "[{}] Parameters = {} ", lp.getTag(), + sql.getParameters()); + lp.debug(OrmConnectionImpl.class, "{} Call [{}] [{}]", lp.getTagAndElapsedTime(), + sql.getSql(), Try.getOrNull(() -> connection.getMetaData().getURL()), sql); + }); + return ret; } catch (Exception e) { - throw new SormException(sql + System.lineSeparator() + e.getMessage(), e); + throw Try.rethrow(e); } - } @Override @@ -284,8 +306,7 @@ public T executeQuery(SqlStatement sql, FunctionHandler result @Override public List executeQuery(SqlStatement sql, RowMapper rowMapper) { - return executeQueryAndRead(mappings.getOptions(), getJdbcConnection(), sqlParametersSetter, - sql.getSql(), sql.getParameters(), RowMapper.convertToRowListMapper(rowMapper)); + return executeQuery(sql, RowMapper.convertToRowListMapper(rowMapper)); } @Override @@ -295,16 +316,9 @@ public int executeUpdate(SqlStatement sql) { @Override public int executeUpdate(String sql, Object... parameters) { - final Optional dp = - LogPointFactory.createLogPoint(SormLogger.Category.EXECUTE_UPDATE); final int ret = executeUpdateAndClose(mappings.getOptions(), connection, sqlParametersSetter, sql, parameters); - dp.ifPresent(lp -> { - lp.trace(OrmConnectionImpl.class, "[{}] Parameters = {} ", lp.getTag(), parameters); - lp.debug(OrmConnectionImpl.class, "{} Call [{}] [{}]", lp.getTagAndElapsedTime(), sql, - Try.getOrNull(() -> connection.getMetaData().getURL()), sql); - }); return ret; } @@ -449,19 +463,18 @@ Map loadFirstMap(ResultSet resultSet) throws SQLException { private final List loadNativeObjectList(Class objectClass, ResultSet resultSet) throws SQLException { final List ret = new ArrayList<>(); + final int sqlType = getOneSqlType(objectClass, resultSet); while (resultSet.next()) { - ret.add(resultSetConverter.toSingleStandardObject(mappings.getOptions(), resultSet, - getOneSqlType(objectClass, resultSet), objectClass)); + ret.add(resultSetConverter.toSingleStandardObject(mappings.getOptions(), resultSet, sqlType, + objectClass)); } return ret; } - private int getOneSqlType(Class objectClass, ResultSet resultSet) { return Try.getOrThrow(() -> { ResultSetMetaData metaData = resultSet.getMetaData(); - if (metaData.getColumnCount() != 1) { throw new SormException("ResultSet returned [" + metaData.getColumnCount() + "] columns but 1 column was expected to load data into an instance of [" @@ -477,7 +490,7 @@ T loadOne(Class objectClass, ResultSet resultSet) throws SQLException { ret = mapRow(objectClass, resultSet); } if (resultSet.next()) { - throw new RuntimeException("Non-unique result returned"); + throw new SormException("Non-unique result returned"); } return ret; } @@ -517,23 +530,21 @@ private T loadSinglePojoByColumnLabels(Class objectClass, ResultSet resul @Override public T mapRow(Class objectClass, ResultSet resultSet) { - return Try.getOrThrow( - () -> resultSetConverter.isStandardClass(mappings.getOptions(), objectClass) + return Try + .getOrThrow(() -> resultSetConverter.isStandardClass(mappings.getOptions(), objectClass) ? resultSetConverter.toSingleStandardObject(mappings.getOptions(), resultSet, getOneSqlType(objectClass, resultSet), objectClass) - : loadSinglePojo(objectClass, resultSet), - Try::rethrow); + : loadSinglePojo(objectClass, resultSet), Try::rethrow); } @Override public List mapRowList(Class objectClass, ResultSet resultSet) { - return Try.getOrThrow( - () -> resultSetConverter.isStandardClass(mappings.getOptions(), objectClass) + return Try + .getOrThrow(() -> resultSetConverter.isStandardClass(mappings.getOptions(), objectClass) ? loadNativeObjectList(objectClass, resultSet) - : loadPojoList(objectClass, resultSet), - Try::rethrow); + : loadPojoList(objectClass, resultSet), Try::rethrow); } @Override @@ -649,8 +660,12 @@ public LazyResultSet readLazy(Class objectClass, String sql, Object... try { final PreparedStatement stmt = connection.prepareStatement(sql); sqlParametersSetter.setParameters(mappings.getOptions(), stmt, parameters); + final Optional dp = + LogPointFactory.createLogPoint(SormLogger.Category.EXECUTE_QUERY); final ResultSet resultSet = stmt.executeQuery(); LazyResultSetImpl ret = new LazyResultSetImpl(this, objectClass, stmt, resultSet); + dp.ifPresent(lp -> lp.debug(OrmConnectionImpl.class, "{} readLazy from [{}]", + lp.getTagAndElapsedTime(), Try.getOrNull(() -> connection.getMetaData().getURL()))); lazyResultSets.add(ret); return ret; } catch (SQLException e) { @@ -701,7 +716,15 @@ public LazyResultSet> readMapLazy(String sql, Object... para try { final PreparedStatement stmt = connection.prepareStatement(sql); sqlParametersSetter.setParameters(mappings.getOptions(), stmt, parameters); + + final Optional dp = + LogPointFactory.createLogPoint(SormLogger.Category.EXECUTE_QUERY); + final ResultSet resultSet = stmt.executeQuery(); + + dp.ifPresent(lp -> lp.debug(OrmConnectionImpl.class, "{} readMapLazy from [{}]", + lp.getTagAndElapsedTime(), Try.getOrNull(() -> connection.getMetaData().getURL()))); + @SuppressWarnings({"unchecked", "rawtypes", "resource"}) LazyResultSet> ret = (LazyResultSet>) new LazyResultSetImpl(this, stmt, resultSet); @@ -862,6 +885,4 @@ public int[] updateOn(String tableName, @SuppressWarnings("unchecked") T... mapping -> mapping.update(getJdbcConnection(), objects), () -> new int[0]); } - - } From ca36a89539d1bdf6ed2a1b9a4325d248a4f7f44e Mon Sep 17 00:00:00 2001 From: Yuu Nakajima Date: Thu, 15 Apr 2021 09:22:02 +0900 Subject: [PATCH 06/20] rename internal method name --- .../org/nkjmlab/sorm4j/internal/mapping/TableMapping.java | 2 +- .../multirow/BatchOfMultiRowInOneStatementProcessor.java | 4 ++-- .../mapping/multirow/MultiRowInOneStatementProcessor.java | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/java/org/nkjmlab/sorm4j/internal/mapping/TableMapping.java b/src/main/java/org/nkjmlab/sorm4j/internal/mapping/TableMapping.java index 0001db87..20cc8861 100644 --- a/src/main/java/org/nkjmlab/sorm4j/internal/mapping/TableMapping.java +++ b/src/main/java/org/nkjmlab/sorm4j/internal/mapping/TableMapping.java @@ -123,7 +123,7 @@ private List setAutoGeneratedKeys(PreparedStatement stmt, T object) thro @SafeVarargs - public final void setPrameters(PreparedStatement stmt, T... objects) + public final void setPrametersOfMultiRow(PreparedStatement stmt, T... objects) throws SQLException, IOException { Object[] parameters = Arrays.stream(objects) .flatMap(obj -> Arrays.stream(getParametersWithoutAutoGeneratedColumns(obj))) diff --git a/src/main/java/org/nkjmlab/sorm4j/internal/mapping/multirow/BatchOfMultiRowInOneStatementProcessor.java b/src/main/java/org/nkjmlab/sorm4j/internal/mapping/multirow/BatchOfMultiRowInOneStatementProcessor.java index 60f1161b..52e66f8a 100644 --- a/src/main/java/org/nkjmlab/sorm4j/internal/mapping/multirow/BatchOfMultiRowInOneStatementProcessor.java +++ b/src/main/java/org/nkjmlab/sorm4j/internal/mapping/multirow/BatchOfMultiRowInOneStatementProcessor.java @@ -39,7 +39,7 @@ public final int[] multiRowInsert(Connection con, T... objects) { return execMultiRowProcIfValidObjects(con, objects, nonNullObjects -> procMultiRowOneStatementAndBatch(con, num -> con.prepareStatement(tableMapping.getSql().getMultirowInsertSql(num)), - (stmt, objs) -> tableMapping.setPrameters(stmt, objs), nonNullObjects)); + (stmt, objs) -> tableMapping.setPrametersOfMultiRow(stmt, objs), nonNullObjects)); } @Override @@ -48,7 +48,7 @@ public final int[] multiRowMerge(Connection con, T... objects) { return execMultiRowProcIfValidObjects(con, objects, nonNullObjects -> procMultiRowOneStatementAndBatch(con, num -> con.prepareStatement(tableMapping.getSql().getMultirowMergeSql(num)), - (stmt, objs) -> tableMapping.setPrameters(stmt, objs), nonNullObjects)); + (stmt, objs) -> tableMapping.setPrametersOfMultiRow(stmt, objs), nonNullObjects)); } /** diff --git a/src/main/java/org/nkjmlab/sorm4j/internal/mapping/multirow/MultiRowInOneStatementProcessor.java b/src/main/java/org/nkjmlab/sorm4j/internal/mapping/multirow/MultiRowInOneStatementProcessor.java index 7a793115..b3cb54b5 100644 --- a/src/main/java/org/nkjmlab/sorm4j/internal/mapping/multirow/MultiRowInOneStatementProcessor.java +++ b/src/main/java/org/nkjmlab/sorm4j/internal/mapping/multirow/MultiRowInOneStatementProcessor.java @@ -28,7 +28,7 @@ public final int[] multiRowInsert(Connection con, T... objects) { return execMultiRowProcIfValidObjects(con, objects, nonNullObjects -> procMultiRowOneStatement(con, num -> con.prepareStatement(tableMapping.getSql().getMultirowInsertSql(num)), - (stmt, objs) -> tableMapping.setPrameters(stmt, objs), nonNullObjects)); + (stmt, objs) -> tableMapping.setPrametersOfMultiRow(stmt, objs), nonNullObjects)); } @Override @@ -37,7 +37,7 @@ public final int[] multiRowMerge(Connection con, T... objects) { return execMultiRowProcIfValidObjects(con, objects, nonNullObjects -> procMultiRowOneStatement(con, num -> con.prepareStatement(tableMapping.getSql().getMultirowMergeSql(num)), - (stmt, objs) -> tableMapping.setPrameters(stmt, objs), nonNullObjects)); + (stmt, objs) -> tableMapping.setPrametersOfMultiRow(stmt, objs), nonNullObjects)); } From 99e263ec0d133170a4ec7a9cfcbcf0513ee83a39 Mon Sep 17 00:00:00 2001 From: Yuu Nakajima Date: Thu, 15 Apr 2021 09:22:42 +0900 Subject: [PATCH 07/20] Update javadoc --- src/main/java/org/nkjmlab/sorm4j/sql/NamedParameterSql.java | 1 + src/main/java/org/nkjmlab/sorm4j/sql/SqlStatement.java | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/nkjmlab/sorm4j/sql/NamedParameterSql.java b/src/main/java/org/nkjmlab/sorm4j/sql/NamedParameterSql.java index f6f538a4..7ee2daca 100644 --- a/src/main/java/org/nkjmlab/sorm4j/sql/NamedParameterSql.java +++ b/src/main/java/org/nkjmlab/sorm4j/sql/NamedParameterSql.java @@ -31,6 +31,7 @@ public interface NamedParameterSql extends SqlStatementSupplier { NamedParameterSql bind(String key, Object value); /** + * Binds a bean. The field names map to keys of parameter by {@link ColumnFieldMapper}. * * @param bean * @return diff --git a/src/main/java/org/nkjmlab/sorm4j/sql/SqlStatement.java b/src/main/java/org/nkjmlab/sorm4j/sql/SqlStatement.java index cb683c73..958efa25 100644 --- a/src/main/java/org/nkjmlab/sorm4j/sql/SqlStatement.java +++ b/src/main/java/org/nkjmlab/sorm4j/sql/SqlStatement.java @@ -29,7 +29,8 @@ public interface SqlStatement { /** - * Creates {@link SqlStatement} object from the given SQL string. + * Creates {@link SqlStatement} object from the given SQL string. When you use a SQL statement + * with parameter, use {@link NamedParameterSql}, {@link OrderedParameterSql}. * * @param sql without parameter. * @return From 8ca63e8f075023bae1536065e1a452cd1007dd59 Mon Sep 17 00:00:00 2001 From: Yuu Nakajima Date: Thu, 15 Apr 2021 09:22:54 +0900 Subject: [PATCH 08/20] Update tests --- src/test/java/org/nkjmlab/sorm4j/OrmConnectionTest.java | 5 ++--- .../java/org/nkjmlab/sorm4j/TypedOrmConnectionTest.java | 2 +- .../repackage/net/sf/persist/tests/common/TestSimple.java | 7 +++---- 3 files changed, 6 insertions(+), 8 deletions(-) diff --git a/src/test/java/org/nkjmlab/sorm4j/OrmConnectionTest.java b/src/test/java/org/nkjmlab/sorm4j/OrmConnectionTest.java index 664e5f8e..d1198aa4 100644 --- a/src/test/java/org/nkjmlab/sorm4j/OrmConnectionTest.java +++ b/src/test/java/org/nkjmlab/sorm4j/OrmConnectionTest.java @@ -480,8 +480,7 @@ void testReadAllLazy() { m.readList(Integer.class, "select * from players"); failBecauseExceptionWasNotThrown(Exception.class); } catch (Exception e) { - assertThat(e.getCause().getMessage()) - .contains("but 1 column was expected to load data into"); + assertThat(e.getMessage()).contains("but 1 column was expected to load data into"); } SormLogger.off(); @@ -584,7 +583,7 @@ void testReadOne() { failBecauseExceptionWasNotThrown(SormException.class); }); } catch (SormException e) { - assertThat(e.getCause().getMessage()).contains("Non-unique"); + assertThat(e.getMessage()).contains("Non-unique"); } } diff --git a/src/test/java/org/nkjmlab/sorm4j/TypedOrmConnectionTest.java b/src/test/java/org/nkjmlab/sorm4j/TypedOrmConnectionTest.java index 272b7517..2f056659 100644 --- a/src/test/java/org/nkjmlab/sorm4j/TypedOrmConnectionTest.java +++ b/src/test/java/org/nkjmlab/sorm4j/TypedOrmConnectionTest.java @@ -504,7 +504,7 @@ void testReadOne() { failBecauseExceptionWasNotThrown(SormException.class); }); } catch (SormException e) { - assertThat(e.getCause().getMessage()).contains("Non-unique"); + assertThat(e.getMessage()).contains("Non-unique"); } } diff --git a/src/test/java/repackage/net/sf/persist/tests/common/TestSimple.java b/src/test/java/repackage/net/sf/persist/tests/common/TestSimple.java index 76d1837f..a23614fe 100644 --- a/src/test/java/repackage/net/sf/persist/tests/common/TestSimple.java +++ b/src/test/java/repackage/net/sf/persist/tests/common/TestSimple.java @@ -399,8 +399,7 @@ public void testMappingSimple04() { simpleOrMapper.readByPrimaryKey(Simple04.class, 1); fail("Object with incompatible getter and setter did not trigger exception"); } catch (Exception e) { - org.assertj.core.api.Assertions.assertThat(e.getCause().getMessage()) - .contains("Could not set a value"); + org.assertj.core.api.Assertions.assertThat(e.getMessage()).contains("Could not set a value"); } } @@ -475,7 +474,7 @@ public void testMappingSimple11() { OrmConnection simpleOrMapper = SormFactory.toOrmConnection(conn); simpleOrMapper.insert(new Simple11()); } catch (Exception e) { - assertThat(e.getCause().getMessage()).contains("does not match any field"); + assertThat(e.getMessage()).contains("does not match any field"); } } @@ -487,7 +486,7 @@ public void testMappingSimple12() { simpleOrMapper.insert(new Simple12(1)); simpleOrMapper.readAll(Simple12.class); } catch (Exception e) { - assertThat(e.getCause().getMessage()).contains("default constructor"); + assertThat(e.getMessage()).contains("default constructor"); } } From 00d684741c51fbf1b89597b46dcab3e3f01afef4 Mon Sep 17 00:00:00 2001 From: Yuu Nakajima Date: Thu, 22 Apr 2021 09:53:45 +0900 Subject: [PATCH 09/20] Remove invalid javadoc tag --- .../org/nkjmlab/sorm4j/extension/DefaultSqlParametersSetter.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/org/nkjmlab/sorm4j/extension/DefaultSqlParametersSetter.java b/src/main/java/org/nkjmlab/sorm4j/extension/DefaultSqlParametersSetter.java index 5e4214e0..9d178b7c 100644 --- a/src/main/java/org/nkjmlab/sorm4j/extension/DefaultSqlParametersSetter.java +++ b/src/main/java/org/nkjmlab/sorm4j/extension/DefaultSqlParametersSetter.java @@ -237,7 +237,6 @@ private static final int getSize(Reader reader) { /** * Treats array. * - * @param type * @param stmt * @param parameterIndex * @param parameter From 1953abe79e1040a578fded5f8f197d563ff6a32b Mon Sep 17 00:00:00 2001 From: Yuu Nakajima Date: Thu, 22 Apr 2021 13:10:55 +0900 Subject: [PATCH 10/20] Rename class --- .../java/org/nkjmlab/sorm4j/OrmMapReader.java | 10 ++--- .../java/org/nkjmlab/sorm4j/OrmReader.java | 14 +++---- .../java/org/nkjmlab/sorm4j/SqlExecutor.java | 12 +++--- .../nkjmlab/sorm4j/TypedOrmConnection.java | 2 + .../org/nkjmlab/sorm4j/TypedOrmReader.java | 10 ++--- .../internal/mapping/OrmConnectionImpl.java | 32 ++++++++-------- .../mapping/TypedOrmConnectionImpl.java | 28 +++++++------- .../sorm4j/internal/sql/AbstractQuery.java | 13 +++---- .../internal/sql/NamedParameterQueryImpl.java | 6 +-- .../sql/NamedParameterRequestImpl.java | 12 +++--- .../internal/sql/NamedParameterSqlImpl.java | 8 ++-- .../sql/OrderedParameterQueryImpl.java | 6 +-- .../sql/OrderedParameterRequestImpl.java | 12 +++--- .../internal/sql/OrderedParameterSqlImpl.java | 6 +-- ...entImpl.java => ParameterizedSqlImpl.java} | 18 ++++----- .../sorm4j/internal/sql/QueryExecutor.java | 18 ++++----- .../sorm4j/internal/sql/QueryOrmExecutor.java | 18 ++++----- .../internal/sql/QueryTypedOrmExecutor.java | 18 ++++----- .../internal/sql/SelectBuilderImpl.java | 6 +-- .../sorm4j/internal/sql/SelectQueryImpl.java | 6 +-- .../nkjmlab/sorm4j/sql/NamedParameterSql.java | 9 +++-- .../sorm4j/sql/OrderedParameterSql.java | 8 ++-- ...qlStatement.java => ParameterizedSql.java} | 18 ++++++--- .../sorm4j/sql/ParameterizedSqlParser.java | 11 ++++++ .../org/nkjmlab/sorm4j/sql/SelectBuilder.java | 2 +- .../org/nkjmlab/sorm4j/sql/SelectQuery.java | 2 +- .../sorm4j/sql/SqlStatementSupplier.java | 11 ------ .../org/nkjmlab/sorm4j/OrmConnectionTest.java | 28 +++++++------- .../nkjmlab/sorm4j/ResultSetMapperTest.java | 10 ++--- .../sorm4j/TypedOrmConnectionTest.java | 38 +++++++++---------- .../sorm4j/sql/NamedParameterSqlTest.java | 22 +++++------ .../sql/NamedParametersQueryImplTest.java | 12 +++--- .../sorm4j/sql/OrderedParameterSqlTest.java | 8 ++-- .../nkjmlab/sorm4j/sql/SelectBuilderTest.java | 6 +-- .../nkjmlab/sorm4j/sql/SelectQueryTest.java | 2 +- .../postgresql/TestPostgreSQLSqlMapper.java | 6 +-- 36 files changed, 229 insertions(+), 219 deletions(-) rename src/main/java/org/nkjmlab/sorm4j/internal/sql/{SqlStatementImpl.java => ParameterizedSqlImpl.java} (83%) rename src/main/java/org/nkjmlab/sorm4j/sql/{SqlStatement.java => ParameterizedSql.java} (57%) create mode 100644 src/main/java/org/nkjmlab/sorm4j/sql/ParameterizedSqlParser.java delete mode 100644 src/main/java/org/nkjmlab/sorm4j/sql/SqlStatementSupplier.java diff --git a/src/main/java/org/nkjmlab/sorm4j/OrmMapReader.java b/src/main/java/org/nkjmlab/sorm4j/OrmMapReader.java index dc474f57..1cf98266 100644 --- a/src/main/java/org/nkjmlab/sorm4j/OrmMapReader.java +++ b/src/main/java/org/nkjmlab/sorm4j/OrmMapReader.java @@ -8,7 +8,7 @@ import org.nkjmlab.sorm4j.extension.ResultSetConverter; import org.nkjmlab.sorm4j.extension.SqlParametersSetter; import org.nkjmlab.sorm4j.sql.LazyResultSet; -import org.nkjmlab.sorm4j.sql.SqlStatement; +import org.nkjmlab.sorm4j.sql.ParameterizedSql; /** @@ -24,7 +24,7 @@ public interface OrmMapReader { * @param sql * @return */ - Map readMapFirst(SqlStatement sql); + Map readMapFirst(ParameterizedSql sql); /** * Reads a first row from the database by mapping the results of the SQL query into an instance of @@ -48,7 +48,7 @@ public interface OrmMapReader { * @param sql * @return */ - LazyResultSet> readMapLazy(SqlStatement sql); + LazyResultSet> readMapLazy(ParameterizedSql sql); /** * Returns an {@link LazyResultSet} instance containing data from the execution of the provided @@ -72,7 +72,7 @@ public interface OrmMapReader { * @param sql * @return */ - List> readMapList(SqlStatement sql); + List> readMapList(ParameterizedSql sql); /** * Reads a list of objects from the database by mapping the SQL execution results to instances of @@ -96,7 +96,7 @@ public interface OrmMapReader { * @param sql * @return */ - Map readMapOne(SqlStatement sql); + Map readMapOne(ParameterizedSql sql); /** * Reads a first row from the database by mapping the results of the SQL query into an instance of diff --git a/src/main/java/org/nkjmlab/sorm4j/OrmReader.java b/src/main/java/org/nkjmlab/sorm4j/OrmReader.java index 9f82981f..1adca650 100644 --- a/src/main/java/org/nkjmlab/sorm4j/OrmReader.java +++ b/src/main/java/org/nkjmlab/sorm4j/OrmReader.java @@ -7,7 +7,7 @@ import org.nkjmlab.sorm4j.extension.SormOptions; import org.nkjmlab.sorm4j.extension.SqlParametersSetter; import org.nkjmlab.sorm4j.sql.LazyResultSet; -import org.nkjmlab.sorm4j.sql.SqlStatement; +import org.nkjmlab.sorm4j.sql.ParameterizedSql; import org.nkjmlab.sorm4j.sql.tuple.Tuple2; import org.nkjmlab.sorm4j.sql.tuple.Tuple3; @@ -65,7 +65,7 @@ public interface OrmReader { * @param sql * @return */ - T readFirst(Class objectClass, SqlStatement sql); + T readFirst(Class objectClass, ParameterizedSql sql); /** * Reads an object from the database. @@ -87,7 +87,7 @@ public interface OrmReader { * @param sql * @return */ - LazyResultSet readLazy(Class objectClass, SqlStatement sql); + LazyResultSet readLazy(Class objectClass, ParameterizedSql sql); /** * Returns an {@link LazyResultSet}. It is able to convert to Stream, List, and so on. @@ -110,7 +110,7 @@ public interface OrmReader { * @return */ - List readList(Class objectClass, SqlStatement sql); + List readList(Class objectClass, ParameterizedSql sql); /** * Reads a list of objects from the database by mapping the results of the parameterized SQL query @@ -131,7 +131,7 @@ public interface OrmReader { * @param sql * @return */ - T readOne(Class objectClass, SqlStatement sql); + T readOne(Class objectClass, ParameterizedSql sql); /** * Reads only one object from the database. @@ -176,7 +176,7 @@ List> readTupleList(Class t1, Class t2, String s * @return */ @Experimental - List> readTupleList(Class t1, Class t2, SqlStatement sql); + List> readTupleList(Class t1, Class t2, ParameterizedSql sql); /** * Reads results as List of {@link Tuple3} for reading JOIN SQL results typically. @@ -212,7 +212,7 @@ List> readTupleList(Class t1, Class t2, */ @Experimental List> readTupleList(Class t1, Class t2, Class t3, - SqlStatement sql); + ParameterizedSql sql); } diff --git a/src/main/java/org/nkjmlab/sorm4j/SqlExecutor.java b/src/main/java/org/nkjmlab/sorm4j/SqlExecutor.java index 6cb5a61c..5c2dd1a8 100644 --- a/src/main/java/org/nkjmlab/sorm4j/SqlExecutor.java +++ b/src/main/java/org/nkjmlab/sorm4j/SqlExecutor.java @@ -7,7 +7,7 @@ import org.nkjmlab.sorm4j.annotation.Experimental; import org.nkjmlab.sorm4j.extension.SormOptions; import org.nkjmlab.sorm4j.extension.SqlParametersSetter; -import org.nkjmlab.sorm4j.sql.SqlStatement; +import org.nkjmlab.sorm4j.sql.ParameterizedSql; /** * A interface for executing SQL with parameters. @@ -25,7 +25,7 @@ public interface SqlExecutor { * @param handler */ @Experimental - void acceptPreparedStatementHandler(SqlStatement sql, ConsumerHandler handler); + void acceptPreparedStatementHandler(ParameterizedSql sql, ConsumerHandler handler); /** @@ -37,7 +37,7 @@ public interface SqlExecutor { * @return */ @Experimental - T applyPreparedStatementHandler(SqlStatement sql, + T applyPreparedStatementHandler(ParameterizedSql sql, FunctionHandler handler); /** @@ -53,7 +53,7 @@ T applyPreparedStatementHandler(SqlStatement sql, * @param resultSetHandler * @return */ - T executeQuery(SqlStatement sql, FunctionHandler resultSetHandler); + T executeQuery(ParameterizedSql sql, FunctionHandler resultSetHandler); /** @@ -64,7 +64,7 @@ T applyPreparedStatementHandler(SqlStatement sql, * @param rowMapper * @return */ - List executeQuery(SqlStatement sql, RowMapper rowMapper); + List executeQuery(ParameterizedSql sql, RowMapper rowMapper); /** * Executes an update and returns the number of rows modified. @@ -86,7 +86,7 @@ T applyPreparedStatementHandler(SqlStatement sql, * @param sql * @return */ - int executeUpdate(SqlStatement sql); + int executeUpdate(ParameterizedSql sql); /** * Gets {@link Connection}. diff --git a/src/main/java/org/nkjmlab/sorm4j/TypedOrmConnection.java b/src/main/java/org/nkjmlab/sorm4j/TypedOrmConnection.java index a8d591ea..e6b9195a 100644 --- a/src/main/java/org/nkjmlab/sorm4j/TypedOrmConnection.java +++ b/src/main/java/org/nkjmlab/sorm4j/TypedOrmConnection.java @@ -1,5 +1,6 @@ package org.nkjmlab.sorm4j; +import org.nkjmlab.sorm4j.annotation.Experimental; import org.nkjmlab.sorm4j.sql.NamedParameterQuery; import org.nkjmlab.sorm4j.sql.NamedParameterRequest; import org.nkjmlab.sorm4j.sql.OrderedParameterQuery; @@ -14,6 +15,7 @@ * @author nkjm * */ +@Experimental public interface TypedOrmConnection extends TypedOrmReader, TypedOrmUpdater, OrmMapReader, SqlExecutor, TypedResultSetMapper, ResultSetMapMapper, TransactionFunction, AutoCloseable { diff --git a/src/main/java/org/nkjmlab/sorm4j/TypedOrmReader.java b/src/main/java/org/nkjmlab/sorm4j/TypedOrmReader.java index fac3dad8..8a624709 100644 --- a/src/main/java/org/nkjmlab/sorm4j/TypedOrmReader.java +++ b/src/main/java/org/nkjmlab/sorm4j/TypedOrmReader.java @@ -6,7 +6,7 @@ import org.nkjmlab.sorm4j.extension.SormOptions; import org.nkjmlab.sorm4j.extension.SqlParametersSetter; import org.nkjmlab.sorm4j.sql.LazyResultSet; -import org.nkjmlab.sorm4j.sql.SqlStatement; +import org.nkjmlab.sorm4j.sql.ParameterizedSql; /** * The typed interface of reading functions of object-relation mapping. @@ -53,7 +53,7 @@ public interface TypedOrmReader { * @param sql * @return */ - T readFirst(SqlStatement sql); + T readFirst(ParameterizedSql sql); /** * Reads an object from the database. @@ -71,7 +71,7 @@ public interface TypedOrmReader { * @param sql * @return */ - LazyResultSet readLazy(SqlStatement sql); + LazyResultSet readLazy(ParameterizedSql sql); /** * Returns an {@link LazyResultSet}. It is able to convert to Stream, List, and so on. @@ -91,7 +91,7 @@ public interface TypedOrmReader { * @param sql * @return */ - List readList(SqlStatement sql); + List readList(ParameterizedSql sql); /** * Reads a list of objects from the database by mapping the results of the parameterized SQL query @@ -114,7 +114,7 @@ public interface TypedOrmReader { * @param sql * @return */ - T readOne(SqlStatement sql); + T readOne(ParameterizedSql sql); /** * Reads only one object from the database. diff --git a/src/main/java/org/nkjmlab/sorm4j/internal/mapping/OrmConnectionImpl.java b/src/main/java/org/nkjmlab/sorm4j/internal/mapping/OrmConnectionImpl.java index 84b3ea89..38e137bb 100644 --- a/src/main/java/org/nkjmlab/sorm4j/internal/mapping/OrmConnectionImpl.java +++ b/src/main/java/org/nkjmlab/sorm4j/internal/mapping/OrmConnectionImpl.java @@ -36,7 +36,7 @@ import org.nkjmlab.sorm4j.sql.OrderedParameterQuery; import org.nkjmlab.sorm4j.sql.OrderedParameterRequest; import org.nkjmlab.sorm4j.sql.SelectQuery; -import org.nkjmlab.sorm4j.sql.SqlStatement; +import org.nkjmlab.sorm4j.sql.ParameterizedSql; import org.nkjmlab.sorm4j.sql.tuple.Tuple2; import org.nkjmlab.sorm4j.sql.tuple.Tuple3; import org.nkjmlab.sorm4j.sql.tuple.Tuples; @@ -260,7 +260,7 @@ private final R execSqlIfParameterExists(T[] objects, } @Override - public void acceptPreparedStatementHandler(SqlStatement sql, + public void acceptPreparedStatementHandler(ParameterizedSql sql, ConsumerHandler handler) { try (PreparedStatement stmt = connection.prepareStatement(sql.getSql())) { sqlParametersSetter.setParameters(mappings.getOptions(), stmt, sql.getParameters()); @@ -279,7 +279,7 @@ public void acceptPreparedStatementHandler(SqlStatement sql, } @Override - public T applyPreparedStatementHandler(SqlStatement sql, + public T applyPreparedStatementHandler(ParameterizedSql sql, FunctionHandler handler) { try (PreparedStatement stmt = connection.prepareStatement(sql.getSql())) { sqlParametersSetter.setParameters(mappings.getOptions(), stmt, sql.getParameters()); @@ -299,18 +299,18 @@ public T applyPreparedStatementHandler(SqlStatement sql, } @Override - public T executeQuery(SqlStatement sql, FunctionHandler resultSetHandler) { + public T executeQuery(ParameterizedSql sql, FunctionHandler resultSetHandler) { return executeQueryAndRead(mappings.getOptions(), getJdbcConnection(), sqlParametersSetter, sql.getSql(), sql.getParameters(), resultSetHandler); } @Override - public List executeQuery(SqlStatement sql, RowMapper rowMapper) { + public List executeQuery(ParameterizedSql sql, RowMapper rowMapper) { return executeQuery(sql, RowMapper.convertToRowListMapper(rowMapper)); } @Override - public int executeUpdate(SqlStatement sql) { + public int executeUpdate(ParameterizedSql sql) { return executeUpdate(sql.getSql(), sql.getParameters()); } @@ -640,7 +640,7 @@ public T readByPrimaryKeyOf(T object) { @Override - public T readFirst(Class objectClass, SqlStatement sql) { + public T readFirst(Class objectClass, ParameterizedSql sql) { return readFirst(objectClass, sql.getSql(), sql.getParameters()); } @@ -651,7 +651,7 @@ public T readFirst(Class objectClass, String sql, Object... parameters) { } @Override - public LazyResultSet readLazy(Class objectClass, SqlStatement sql) { + public LazyResultSet readLazy(Class objectClass, ParameterizedSql sql) { return readLazy(objectClass, sql.getSql(), sql.getParameters()); } @@ -675,7 +675,7 @@ public LazyResultSet readLazy(Class objectClass, String sql, Object... @Override - public List readList(Class objectClass, SqlStatement sql) { + public List readList(Class objectClass, ParameterizedSql sql) { return readList(objectClass, sql.getSql(), sql.getParameters()); } @@ -686,7 +686,7 @@ public List readList(Class objectClass, String sql, Object... paramete } @Override - public Map readMapFirst(SqlStatement sql) { + public Map readMapFirst(ParameterizedSql sql) { return readMapFirst(sql.getSql(), sql.getParameters()); } @@ -706,7 +706,7 @@ public Map readMapFirst(final String sql, final Object... parame } @Override - public LazyResultSet> readMapLazy(SqlStatement sql) { + public LazyResultSet> readMapLazy(ParameterizedSql sql) { return readMapLazy(sql.getSql(), sql.getParameters()); } @@ -735,7 +735,7 @@ public LazyResultSet> readMapLazy(String sql, Object... para } @Override - public List> readMapList(SqlStatement sql) { + public List> readMapList(ParameterizedSql sql) { return readMapList(sql.getSql(), sql.getParameters()); } @@ -746,7 +746,7 @@ public List> readMapList(final String sql, final Object... p } @Override - public Map readMapOne(SqlStatement sql) { + public Map readMapOne(ParameterizedSql sql) { return readMapOne(sql.getSql(), sql.getParameters()); } @@ -768,7 +768,7 @@ public Map readMapOne(final String sql, final Object... paramete } @Override - public T readOne(Class objectClass, SqlStatement sql) { + public T readOne(Class objectClass, ParameterizedSql sql) { return readOne(objectClass, sql.getSql(), sql.getParameters()); } @@ -791,7 +791,7 @@ public T readOne(Class objectClass, String sql, Object... parameters) { @Override public List> readTupleList(Class t1, Class t2, - Class t3, SqlStatement sql) { + Class t3, ParameterizedSql sql) { return readTupleList(t1, t2, t3, sql.getSql(), sql.getParameters()); } @@ -812,7 +812,7 @@ public List> readTupleList(Class t1, Class List> readTupleList(Class t1, Class t2, SqlStatement sql) { + public List> readTupleList(Class t1, Class t2, ParameterizedSql sql) { return readTupleList(t1, t2, sql.getSql(), sql.getParameters()); } diff --git a/src/main/java/org/nkjmlab/sorm4j/internal/mapping/TypedOrmConnectionImpl.java b/src/main/java/org/nkjmlab/sorm4j/internal/mapping/TypedOrmConnectionImpl.java index 1537f9b5..38f7eba9 100644 --- a/src/main/java/org/nkjmlab/sorm4j/internal/mapping/TypedOrmConnectionImpl.java +++ b/src/main/java/org/nkjmlab/sorm4j/internal/mapping/TypedOrmConnectionImpl.java @@ -21,7 +21,7 @@ import org.nkjmlab.sorm4j.sql.OrderedParameterQuery; import org.nkjmlab.sorm4j.sql.OrderedParameterRequest; import org.nkjmlab.sorm4j.sql.SelectQuery; -import org.nkjmlab.sorm4j.sql.SqlStatement; +import org.nkjmlab.sorm4j.sql.ParameterizedSql; /** * A database connection with object-relation mapping function with type. The main class for the @@ -146,20 +146,20 @@ public int[] deleteOn(String tableName, @SuppressWarnings("unchecked") T... obje } @Override - public S executeQuery(SqlStatement sql, FunctionHandler resultSetHandler) { + public S executeQuery(ParameterizedSql sql, FunctionHandler resultSetHandler) { return conn.executeQuery(sql, resultSetHandler); } @Override - public List executeQuery(SqlStatement sql, RowMapper rowMapper) { + public List executeQuery(ParameterizedSql sql, RowMapper rowMapper) { return conn.executeQuery(sql, rowMapper); } @Override - public int executeUpdate(SqlStatement sql) { + public int executeUpdate(ParameterizedSql sql) { return conn.executeUpdate(sql); } @@ -328,7 +328,7 @@ public T readByPrimaryKeyOf(T object) { } @Override - public T readFirst(SqlStatement sql) { + public T readFirst(ParameterizedSql sql) { return conn.readFirst(objectClass, sql); } @@ -338,7 +338,7 @@ public T readFirst(String sql, Object... parameters) { } @Override - public LazyResultSet readLazy(SqlStatement sql) { + public LazyResultSet readLazy(ParameterizedSql sql) { return conn.readLazy(objectClass, sql); } @@ -348,7 +348,7 @@ public LazyResultSet readLazy(String sql, Object... parameters) { } @Override - public List readList(SqlStatement sql) { + public List readList(ParameterizedSql sql) { return conn.readList(objectClass, sql); } @@ -358,7 +358,7 @@ public List readList(String sql, Object... parameters) { } @Override - public Map readMapFirst(SqlStatement sql) { + public Map readMapFirst(ParameterizedSql sql) { return conn.readMapFirst(sql.getSql(), sql.getParameters()); } @@ -368,7 +368,7 @@ public Map readMapFirst(String sql, Object... parameters) { } @Override - public LazyResultSet> readMapLazy(SqlStatement sql) { + public LazyResultSet> readMapLazy(ParameterizedSql sql) { return conn.readMapLazy(sql.getSql(), sql.getParameters()); } @@ -378,7 +378,7 @@ public LazyResultSet> readMapLazy(String sql, Object... para } @Override - public List> readMapList(SqlStatement sql) { + public List> readMapList(ParameterizedSql sql) { return conn.readMapList(sql.getSql(), sql.getParameters()); } @@ -388,7 +388,7 @@ public List> readMapList(String sql, Object... parameters) { } @Override - public Map readMapOne(SqlStatement sql) { + public Map readMapOne(ParameterizedSql sql) { return conn.readMapOne(sql.getSql(), sql.getParameters()); } @@ -398,7 +398,7 @@ public Map readMapOne(String sql, Object... parameters) { } @Override - public T readOne(SqlStatement sql) { + public T readOne(ParameterizedSql sql) { return conn.readOne(objectClass, sql.getSql(), sql.getParameters()); } @@ -458,13 +458,13 @@ public int[] updateOn(String tableName, @SuppressWarnings("unchecked") T... obje } @Override - public S applyPreparedStatementHandler(SqlStatement sql, + public S applyPreparedStatementHandler(ParameterizedSql sql, FunctionHandler handler) { return conn.applyPreparedStatementHandler(sql, handler); } @Override - public void acceptPreparedStatementHandler(SqlStatement sql, + public void acceptPreparedStatementHandler(ParameterizedSql sql, ConsumerHandler handler) { conn.acceptPreparedStatementHandler(sql, handler); } diff --git a/src/main/java/org/nkjmlab/sorm4j/internal/sql/AbstractQuery.java b/src/main/java/org/nkjmlab/sorm4j/internal/sql/AbstractQuery.java index 2c1003b3..a180628d 100644 --- a/src/main/java/org/nkjmlab/sorm4j/internal/sql/AbstractQuery.java +++ b/src/main/java/org/nkjmlab/sorm4j/internal/sql/AbstractQuery.java @@ -3,12 +3,11 @@ import java.util.List; import org.nkjmlab.sorm4j.sql.LazyResultSet; import org.nkjmlab.sorm4j.sql.Query; -import org.nkjmlab.sorm4j.sql.SqlStatement; +import org.nkjmlab.sorm4j.sql.ParameterizedSqlParser; -public abstract class AbstractQuery implements Query { +public abstract class AbstractQuery implements Query, ParameterizedSqlParser { protected final QueryExecutor executor; - abstract SqlStatement toSqlStatement(); public AbstractQuery(QueryExecutor executor) { this.executor = executor; @@ -16,22 +15,22 @@ public AbstractQuery(QueryExecutor executor) { @Override public T readOne() { - return executor.readOne(toSqlStatement()); + return executor.readOne(parse()); } @Override public T readFirst() { - return executor.readFirst(toSqlStatement()); + return executor.readFirst(parse()); } @Override public LazyResultSet readLazy() { - return executor.readLazy(toSqlStatement()); + return executor.readLazy(parse()); } @Override public List readList() { - return executor.readList(toSqlStatement()); + return executor.readList(parse()); } } diff --git a/src/main/java/org/nkjmlab/sorm4j/internal/sql/NamedParameterQueryImpl.java b/src/main/java/org/nkjmlab/sorm4j/internal/sql/NamedParameterQueryImpl.java index 677b2120..a5498c54 100644 --- a/src/main/java/org/nkjmlab/sorm4j/internal/sql/NamedParameterQueryImpl.java +++ b/src/main/java/org/nkjmlab/sorm4j/internal/sql/NamedParameterQueryImpl.java @@ -3,7 +3,7 @@ import java.util.Map; import org.nkjmlab.sorm4j.sql.NamedParameterQuery; import org.nkjmlab.sorm4j.sql.NamedParameterSql; -import org.nkjmlab.sorm4j.sql.SqlStatement; +import org.nkjmlab.sorm4j.sql.ParameterizedSql; /** * An implementation of {@link NamedParameterQuery} @@ -35,8 +35,8 @@ public NamedParameterQuery bind(String key, Object value) { } @Override - public SqlStatement toSqlStatement() { - return namedParameterSql.toSqlStatement(); + public ParameterizedSql parse() { + return namedParameterSql.parse(); } diff --git a/src/main/java/org/nkjmlab/sorm4j/internal/sql/NamedParameterRequestImpl.java b/src/main/java/org/nkjmlab/sorm4j/internal/sql/NamedParameterRequestImpl.java index 5bedef26..3583520b 100644 --- a/src/main/java/org/nkjmlab/sorm4j/internal/sql/NamedParameterRequestImpl.java +++ b/src/main/java/org/nkjmlab/sorm4j/internal/sql/NamedParameterRequestImpl.java @@ -8,7 +8,7 @@ import org.nkjmlab.sorm4j.SqlExecutor; import org.nkjmlab.sorm4j.sql.NamedParameterRequest; import org.nkjmlab.sorm4j.sql.NamedParameterSql; -import org.nkjmlab.sorm4j.sql.SqlStatement; +import org.nkjmlab.sorm4j.sql.ParameterizedSql; public class NamedParameterRequestImpl implements NamedParameterRequest { @@ -22,22 +22,22 @@ public NamedParameterRequestImpl(SqlExecutor sqlExecutor, String sql) { @Override public T executeQuery(FunctionHandler resultSetHandler) { - return sqlExecutor.executeQuery(toSqlStatement(), resultSetHandler); + return sqlExecutor.executeQuery(parse(), resultSetHandler); } @Override public List executeQuery(RowMapper rowMapper) { - return sqlExecutor.executeQuery(toSqlStatement(), rowMapper); + return sqlExecutor.executeQuery(parse(), rowMapper); } @Override public int executeUpdate() { - return sqlExecutor.executeUpdate(toSqlStatement()); + return sqlExecutor.executeUpdate(parse()); } @Override - public SqlStatement toSqlStatement() { - return sql.toSqlStatement(); + public ParameterizedSql parse() { + return sql.parse(); } @Override diff --git a/src/main/java/org/nkjmlab/sorm4j/internal/sql/NamedParameterSqlImpl.java b/src/main/java/org/nkjmlab/sorm4j/internal/sql/NamedParameterSqlImpl.java index 1ba16637..68c2ce86 100644 --- a/src/main/java/org/nkjmlab/sorm4j/internal/sql/NamedParameterSqlImpl.java +++ b/src/main/java/org/nkjmlab/sorm4j/internal/sql/NamedParameterSqlImpl.java @@ -12,10 +12,10 @@ import org.nkjmlab.sorm4j.internal.mapping.ColumnToAccessorMap; import org.nkjmlab.sorm4j.internal.util.Try; import org.nkjmlab.sorm4j.sql.NamedParameterSql; -import org.nkjmlab.sorm4j.sql.SqlStatement; +import org.nkjmlab.sorm4j.sql.ParameterizedSql; /** - * SQL with named parameters. The instance could be convert to {@link SqlStatement}.The class could + * SQL with named parameters. The instance could be convert to {@link ParameterizedSql}.The class could * treat {@link List} parameter. * * @author nkjm @@ -64,7 +64,7 @@ public NamedParameterSql bindBean(Object bean) { @Override - public SqlStatement toSqlStatement() { + public ParameterizedSql parse() { TreeMap orderdParams = new TreeMap<>(); String resultSql = this.sql; @@ -95,7 +95,7 @@ public SqlStatement toSqlStatement() { } } } - return SqlStatementImpl.parse(resultSql, orderdParams.values().toArray()); + return ParameterizedSqlImpl.parse(resultSql, orderdParams.values().toArray()); } private List createParameters() { diff --git a/src/main/java/org/nkjmlab/sorm4j/internal/sql/OrderedParameterQueryImpl.java b/src/main/java/org/nkjmlab/sorm4j/internal/sql/OrderedParameterQueryImpl.java index 45c21a0d..82d60c84 100644 --- a/src/main/java/org/nkjmlab/sorm4j/internal/sql/OrderedParameterQueryImpl.java +++ b/src/main/java/org/nkjmlab/sorm4j/internal/sql/OrderedParameterQueryImpl.java @@ -2,7 +2,7 @@ import org.nkjmlab.sorm4j.sql.OrderedParameterQuery; import org.nkjmlab.sorm4j.sql.OrderedParameterSql; -import org.nkjmlab.sorm4j.sql.SqlStatement; +import org.nkjmlab.sorm4j.sql.ParameterizedSql; /** * An implementation of {@link OrderedParameterQuery} @@ -34,8 +34,8 @@ public OrderedParameterQuery addParameter(Object... parameters) { } @Override - public SqlStatement toSqlStatement() { - return orderedParameterSql.toSqlStatement(); + public ParameterizedSql parse() { + return orderedParameterSql.parse(); } diff --git a/src/main/java/org/nkjmlab/sorm4j/internal/sql/OrderedParameterRequestImpl.java b/src/main/java/org/nkjmlab/sorm4j/internal/sql/OrderedParameterRequestImpl.java index 64012a2f..5162e9ca 100644 --- a/src/main/java/org/nkjmlab/sorm4j/internal/sql/OrderedParameterRequestImpl.java +++ b/src/main/java/org/nkjmlab/sorm4j/internal/sql/OrderedParameterRequestImpl.java @@ -7,7 +7,7 @@ import org.nkjmlab.sorm4j.SqlExecutor; import org.nkjmlab.sorm4j.sql.OrderedParameterRequest; import org.nkjmlab.sorm4j.sql.OrderedParameterSql; -import org.nkjmlab.sorm4j.sql.SqlStatement; +import org.nkjmlab.sorm4j.sql.ParameterizedSql; public class OrderedParameterRequestImpl implements OrderedParameterRequest { @@ -21,22 +21,22 @@ public OrderedParameterRequestImpl(SqlExecutor sqlExecutor, String sql) { @Override public T executeQuery(FunctionHandler resultSetHandler) { - return sqlExecutor.executeQuery(toSqlStatement(), resultSetHandler); + return sqlExecutor.executeQuery(parse(), resultSetHandler); } @Override public List executeQuery(RowMapper rowMapper) { - return sqlExecutor.executeQuery(toSqlStatement(), rowMapper); + return sqlExecutor.executeQuery(parse(), rowMapper); } @Override public int executeUpdate() { - return sqlExecutor.executeUpdate(toSqlStatement()); + return sqlExecutor.executeUpdate(parse()); } @Override - public SqlStatement toSqlStatement() { - return sql.toSqlStatement(); + public ParameterizedSql parse() { + return sql.parse(); } @Override diff --git a/src/main/java/org/nkjmlab/sorm4j/internal/sql/OrderedParameterSqlImpl.java b/src/main/java/org/nkjmlab/sorm4j/internal/sql/OrderedParameterSqlImpl.java index bf6986ea..0e39b4c8 100644 --- a/src/main/java/org/nkjmlab/sorm4j/internal/sql/OrderedParameterSqlImpl.java +++ b/src/main/java/org/nkjmlab/sorm4j/internal/sql/OrderedParameterSqlImpl.java @@ -4,7 +4,7 @@ import java.util.Arrays; import java.util.List; import org.nkjmlab.sorm4j.sql.OrderedParameterSql; -import org.nkjmlab.sorm4j.sql.SqlStatement; +import org.nkjmlab.sorm4j.sql.ParameterizedSql; /** * An implementation of {@link OrderedParameterSql} @@ -34,8 +34,8 @@ public OrderedParameterSql addParameter(Object parameter) { } @Override - public SqlStatement toSqlStatement() { - return SqlStatementImpl.parse(sql, parameters.toArray()); + public ParameterizedSql parse() { + return ParameterizedSqlImpl.parse(sql, parameters.toArray()); } diff --git a/src/main/java/org/nkjmlab/sorm4j/internal/sql/SqlStatementImpl.java b/src/main/java/org/nkjmlab/sorm4j/internal/sql/ParameterizedSqlImpl.java similarity index 83% rename from src/main/java/org/nkjmlab/sorm4j/internal/sql/SqlStatementImpl.java rename to src/main/java/org/nkjmlab/sorm4j/internal/sql/ParameterizedSqlImpl.java index a29608e8..e674e57e 100644 --- a/src/main/java/org/nkjmlab/sorm4j/internal/sql/SqlStatementImpl.java +++ b/src/main/java/org/nkjmlab/sorm4j/internal/sql/ParameterizedSqlImpl.java @@ -8,7 +8,7 @@ import org.nkjmlab.sorm4j.SormException; import org.nkjmlab.sorm4j.internal.util.SqlUtils; import org.nkjmlab.sorm4j.internal.util.StringUtils; -import org.nkjmlab.sorm4j.sql.SqlStatement; +import org.nkjmlab.sorm4j.sql.ParameterizedSql; /** * This class represents a sql statement with ordered parameters. @@ -16,14 +16,14 @@ * @author nkjm * */ -public final class SqlStatementImpl implements SqlStatement { +public final class ParameterizedSqlImpl implements ParameterizedSql { // with ? placeholder private final String sql; // ordered parameters private final Object[] parameters; - private SqlStatementImpl(String sql, Object... parameters) { + private ParameterizedSqlImpl(String sql, Object... parameters) { this.sql = sql; this.parameters = parameters; } @@ -48,8 +48,8 @@ public final Object[] getParameters() { private static final String LIST_PLACEHOLDER = ""; private static final String EMBEDDED_PLACEHOLDER = "{?}"; - public static SqlStatement parse(String sql, Object... parameters) { - SqlStatement st = new SqlStatementImpl(sql, parameters); + public static ParameterizedSql parse(String sql, Object... parameters) { + ParameterizedSql st = new ParameterizedSqlImpl(sql, parameters); if (parameters.length == 0) { return st; } @@ -61,7 +61,7 @@ public static SqlStatement parse(String sql, Object... parameters) { } - private static SqlStatement procListPlaceholder(String sql, Object[] parameters) { + private static ParameterizedSql procListPlaceholder(String sql, Object[] parameters) { final List specialParameterIndexes = createSpecialParameterIndexes(sql, '<', '?', '>'); List flattenListParams = new ArrayList<>(); @@ -88,7 +88,7 @@ private static SqlStatement procListPlaceholder(String sql, Object[] parameters) int parameterLength = getSize(parameters[specialParameterIndexes.get(index)]); return "?,".repeat(parameterLength).substring(0, 2 * parameterLength - 1); }); - return new SqlStatementImpl(_sql, flattenListParams.toArray()); + return new ParameterizedSqlImpl(_sql, flattenListParams.toArray()); } @@ -104,7 +104,7 @@ private static int getSize(Object object) { } - private static SqlStatement procEmbeddedPlaceholder(String sql, Object[] parameters) { + private static ParameterizedSql procEmbeddedPlaceholder(String sql, Object[] parameters) { final List specialParameterIndexes = createSpecialParameterIndexes(sql, '{', '?', '}'); @@ -118,7 +118,7 @@ private static SqlStatement procEmbeddedPlaceholder(String sql, Object[] paramet StringUtils.replacePlaceholder(sql, EMBEDDED_PLACEHOLDER, specialParameterIndexes.size(), index -> SqlUtils.literal(parameters[specialParameterIndexes.get(index)])); - return new SqlStatementImpl(_sql, removedEmbeddedParams.toArray()); + return new ParameterizedSqlImpl(_sql, removedEmbeddedParams.toArray()); } diff --git a/src/main/java/org/nkjmlab/sorm4j/internal/sql/QueryExecutor.java b/src/main/java/org/nkjmlab/sorm4j/internal/sql/QueryExecutor.java index a94c6db9..500a719b 100644 --- a/src/main/java/org/nkjmlab/sorm4j/internal/sql/QueryExecutor.java +++ b/src/main/java/org/nkjmlab/sorm4j/internal/sql/QueryExecutor.java @@ -3,34 +3,34 @@ import java.util.List; import org.nkjmlab.sorm4j.TypedOrmReader; import org.nkjmlab.sorm4j.sql.LazyResultSet; -import org.nkjmlab.sorm4j.sql.SqlStatement; +import org.nkjmlab.sorm4j.sql.ParameterizedSql; public interface QueryExecutor { /** - * see {@link TypedOrmReader#readOne(SqlStatement)} + * see {@link TypedOrmReader#readOne(ParameterizedSql)} * * @return */ - T readOne(SqlStatement sqlStatement); + T readOne(ParameterizedSql parameterizedSql); /** - * see {@link TypedOrmReader#readFirst(SqlStatement)} + * see {@link TypedOrmReader#readFirst(ParameterizedSql)} * * @return */ - T readFirst(SqlStatement sqlStatement); + T readFirst(ParameterizedSql parameterizedSql); /** - * see {@link TypedOrmReader#readLazy(SqlStatement)} + * see {@link TypedOrmReader#readLazy(ParameterizedSql)} * * @return */ - LazyResultSet readLazy(SqlStatement sqlStatement); + LazyResultSet readLazy(ParameterizedSql parameterizedSql); /** - * see {@link TypedOrmReader#readList(SqlStatement)} + * see {@link TypedOrmReader#readList(ParameterizedSql)} * * @return */ - List readList(SqlStatement sqlStatement); + List readList(ParameterizedSql parameterizedSql); } diff --git a/src/main/java/org/nkjmlab/sorm4j/internal/sql/QueryOrmExecutor.java b/src/main/java/org/nkjmlab/sorm4j/internal/sql/QueryOrmExecutor.java index 66806797..2589cf26 100644 --- a/src/main/java/org/nkjmlab/sorm4j/internal/sql/QueryOrmExecutor.java +++ b/src/main/java/org/nkjmlab/sorm4j/internal/sql/QueryOrmExecutor.java @@ -3,7 +3,7 @@ import java.util.List; import org.nkjmlab.sorm4j.OrmReader; import org.nkjmlab.sorm4j.sql.LazyResultSet; -import org.nkjmlab.sorm4j.sql.SqlStatement; +import org.nkjmlab.sorm4j.sql.ParameterizedSql; public class QueryOrmExecutor implements QueryExecutor { @@ -17,23 +17,23 @@ public QueryOrmExecutor(OrmReader conn, Class objectClass) { } @Override - public T readOne(SqlStatement sqlStatement) { - return conn.readOne(objectClass, sqlStatement); + public T readOne(ParameterizedSql parameterizedSql) { + return conn.readOne(objectClass, parameterizedSql); } @Override - public T readFirst(SqlStatement sqlStatement) { - return conn.readFirst(objectClass, sqlStatement); + public T readFirst(ParameterizedSql parameterizedSql) { + return conn.readFirst(objectClass, parameterizedSql); } @Override - public LazyResultSet readLazy(SqlStatement sqlStatement) { - return conn.readLazy(objectClass, sqlStatement); + public LazyResultSet readLazy(ParameterizedSql parameterizedSql) { + return conn.readLazy(objectClass, parameterizedSql); } @Override - public List readList(SqlStatement sqlStatement) { - return conn.readList(objectClass, sqlStatement); + public List readList(ParameterizedSql parameterizedSql) { + return conn.readList(objectClass, parameterizedSql); } diff --git a/src/main/java/org/nkjmlab/sorm4j/internal/sql/QueryTypedOrmExecutor.java b/src/main/java/org/nkjmlab/sorm4j/internal/sql/QueryTypedOrmExecutor.java index c54e77bb..2a2e5dc6 100644 --- a/src/main/java/org/nkjmlab/sorm4j/internal/sql/QueryTypedOrmExecutor.java +++ b/src/main/java/org/nkjmlab/sorm4j/internal/sql/QueryTypedOrmExecutor.java @@ -3,7 +3,7 @@ import java.util.List; import org.nkjmlab.sorm4j.TypedOrmReader; import org.nkjmlab.sorm4j.sql.LazyResultSet; -import org.nkjmlab.sorm4j.sql.SqlStatement; +import org.nkjmlab.sorm4j.sql.ParameterizedSql; public class QueryTypedOrmExecutor implements QueryExecutor { @@ -14,23 +14,23 @@ public QueryTypedOrmExecutor(TypedOrmReader conn) { } @Override - public T readOne(SqlStatement sqlStatement) { - return conn.readOne(sqlStatement); + public T readOne(ParameterizedSql parameterizedSql) { + return conn.readOne(parameterizedSql); } @Override - public T readFirst(SqlStatement sqlStatement) { - return conn.readFirst(sqlStatement); + public T readFirst(ParameterizedSql parameterizedSql) { + return conn.readFirst(parameterizedSql); } @Override - public LazyResultSet readLazy(SqlStatement sqlStatement) { - return conn.readLazy(sqlStatement); + public LazyResultSet readLazy(ParameterizedSql parameterizedSql) { + return conn.readLazy(parameterizedSql); } @Override - public List readList(SqlStatement sqlStatement) { - return conn.readList(sqlStatement); + public List readList(ParameterizedSql parameterizedSql) { + return conn.readList(parameterizedSql); } diff --git a/src/main/java/org/nkjmlab/sorm4j/internal/sql/SelectBuilderImpl.java b/src/main/java/org/nkjmlab/sorm4j/internal/sql/SelectBuilderImpl.java index a8e909c8..798616b3 100644 --- a/src/main/java/org/nkjmlab/sorm4j/internal/sql/SelectBuilderImpl.java +++ b/src/main/java/org/nkjmlab/sorm4j/internal/sql/SelectBuilderImpl.java @@ -3,7 +3,7 @@ import java.util.Arrays; import java.util.stream.Collectors; import org.nkjmlab.sorm4j.sql.SelectBuilder; -import org.nkjmlab.sorm4j.sql.SqlStatement; +import org.nkjmlab.sorm4j.sql.ParameterizedSql; /** * An builder of select SQL. @@ -153,8 +153,8 @@ public SelectBuilder where(String expr) { } @Override - public SqlStatement toSqlStatement() { - return SqlStatement.from(buildSql()); + public ParameterizedSql parse() { + return ParameterizedSql.from(buildSql()); } } diff --git a/src/main/java/org/nkjmlab/sorm4j/internal/sql/SelectQueryImpl.java b/src/main/java/org/nkjmlab/sorm4j/internal/sql/SelectQueryImpl.java index 357d4213..b0e36b14 100644 --- a/src/main/java/org/nkjmlab/sorm4j/internal/sql/SelectQueryImpl.java +++ b/src/main/java/org/nkjmlab/sorm4j/internal/sql/SelectQueryImpl.java @@ -5,7 +5,7 @@ import org.nkjmlab.sorm4j.sql.OrderedParameterQuery; import org.nkjmlab.sorm4j.sql.SelectBuilder; import org.nkjmlab.sorm4j.sql.SelectQuery; -import org.nkjmlab.sorm4j.sql.SqlStatement; +import org.nkjmlab.sorm4j.sql.ParameterizedSql; /** * This class represents a select query. This class has functions as SQL select builder. @@ -68,8 +68,8 @@ public NamedParameterQuery bindBean(Object bean) { @Override - public SqlStatement toSqlStatement() { - return SqlStatement.from(buildSql()); + public ParameterizedSql parse() { + return ParameterizedSql.from(buildSql()); } @Override diff --git a/src/main/java/org/nkjmlab/sorm4j/sql/NamedParameterSql.java b/src/main/java/org/nkjmlab/sorm4j/sql/NamedParameterSql.java index 7ee2daca..cc01a627 100644 --- a/src/main/java/org/nkjmlab/sorm4j/sql/NamedParameterSql.java +++ b/src/main/java/org/nkjmlab/sorm4j/sql/NamedParameterSql.java @@ -11,7 +11,7 @@ * @author nkjm * */ -public interface NamedParameterSql extends SqlStatementSupplier { +public interface NamedParameterSql extends ParameterizedSqlParser { /** * Binds key-value pairs to named parameters in a SQL statement. @@ -48,7 +48,8 @@ public interface NamedParameterSql extends SqlStatementSupplier { * @param suffix * @return */ - static NamedParameterSql from(String sql, char prefix, char suffix, + @Experimental + static NamedParameterSql parse(String sql, char prefix, char suffix, ColumnFieldMapper columnFieldMapper) { return new NamedParameterSqlImpl(sql, prefix, suffix, columnFieldMapper); } @@ -71,8 +72,8 @@ static NamedParameterSql from(String sql) { * @param namedParameters * @return */ - static SqlStatement toSqlStatement(String sql, Map namedParameters) { - return NamedParameterSql.from(sql).bindAll(namedParameters).toSqlStatement(); + static ParameterizedSql parse(String sql, Map namedParameters) { + return NamedParameterSql.from(sql).bindAll(namedParameters).parse(); } diff --git a/src/main/java/org/nkjmlab/sorm4j/sql/OrderedParameterSql.java b/src/main/java/org/nkjmlab/sorm4j/sql/OrderedParameterSql.java index 3a6248ba..2db7c3f1 100644 --- a/src/main/java/org/nkjmlab/sorm4j/sql/OrderedParameterSql.java +++ b/src/main/java/org/nkjmlab/sorm4j/sql/OrderedParameterSql.java @@ -4,13 +4,13 @@ import org.nkjmlab.sorm4j.internal.sql.OrderedParameterSqlImpl; /** - * SQL with ordered parameters. The instance could be convert to {@link SqlStatement}. The class + * SQL with ordered parameters. The instance could be convert to {@link ParameterizedSql}. The class * could treat {@link List} parameter. * * @author nkjm * */ -public interface OrderedParameterSql extends SqlStatementSupplier { +public interface OrderedParameterSql extends ParameterizedSqlParser { /** * Add one parameter to the SQL statement sequentially. @@ -35,8 +35,8 @@ public interface OrderedParameterSql extends SqlStatementSupplier { * @param parameters * @return */ - static SqlStatement toSqlStatement(String sql, Object... parameters) { - return from(sql).addParameter(parameters).toSqlStatement(); + static ParameterizedSql parse(String sql, Object... parameters) { + return from(sql).addParameter(parameters).parse(); } /** diff --git a/src/main/java/org/nkjmlab/sorm4j/sql/SqlStatement.java b/src/main/java/org/nkjmlab/sorm4j/sql/ParameterizedSql.java similarity index 57% rename from src/main/java/org/nkjmlab/sorm4j/sql/SqlStatement.java rename to src/main/java/org/nkjmlab/sorm4j/sql/ParameterizedSql.java index 958efa25..54a00c3e 100644 --- a/src/main/java/org/nkjmlab/sorm4j/sql/SqlStatement.java +++ b/src/main/java/org/nkjmlab/sorm4j/sql/ParameterizedSql.java @@ -1,6 +1,7 @@ package org.nkjmlab.sorm4j.sql; -import org.nkjmlab.sorm4j.internal.sql.SqlStatementImpl; +import java.util.Map; +import org.nkjmlab.sorm4j.internal.sql.ParameterizedSqlImpl; import org.nkjmlab.sorm4j.internal.util.SqlUtils; @@ -11,7 +12,7 @@ * */ -public interface SqlStatement { +public interface ParameterizedSql { /** * Gets this SQL statement. @@ -27,16 +28,23 @@ public interface SqlStatement { */ Object[] getParameters(); + static ParameterizedSql parseAsOrdered(String sql, Object... orderedParameters) { + return OrderedParameterSql.parse(sql, orderedParameters); + } + + static ParameterizedSql parseAsNamed(String sql, Map namedParameters) { + return NamedParameterSql.parse(sql, namedParameters); + } /** - * Creates {@link SqlStatement} object from the given SQL string. When you use a SQL statement + * Creates {@link ParameterizedSql} object from the given SQL string. When you use a SQL statement * with parameter, use {@link NamedParameterSql}, {@link OrderedParameterSql}. * * @param sql without parameter. * @return */ - static SqlStatement from(String sql) { - return SqlStatementImpl.parse(sql); + static ParameterizedSql from(String sql) { + return ParameterizedSqlImpl.parse(sql); } /** diff --git a/src/main/java/org/nkjmlab/sorm4j/sql/ParameterizedSqlParser.java b/src/main/java/org/nkjmlab/sorm4j/sql/ParameterizedSqlParser.java new file mode 100644 index 00000000..05011fe8 --- /dev/null +++ b/src/main/java/org/nkjmlab/sorm4j/sql/ParameterizedSqlParser.java @@ -0,0 +1,11 @@ +package org.nkjmlab.sorm4j.sql; + +public interface ParameterizedSqlParser { + /** + * Convert {@link ParameterizedSql} objects. + * + * @return + */ + ParameterizedSql parse(); + +} diff --git a/src/main/java/org/nkjmlab/sorm4j/sql/SelectBuilder.java b/src/main/java/org/nkjmlab/sorm4j/sql/SelectBuilder.java index 871d6398..eae7da53 100644 --- a/src/main/java/org/nkjmlab/sorm4j/sql/SelectBuilder.java +++ b/src/main/java/org/nkjmlab/sorm4j/sql/SelectBuilder.java @@ -11,7 +11,7 @@ * @author nkjm * */ -public interface SelectBuilder extends SqlStatementSupplier { +public interface SelectBuilder extends ParameterizedSqlParser { /** * Value object represents conditions of where clause or having clause. This object could include diff --git a/src/main/java/org/nkjmlab/sorm4j/sql/SelectQuery.java b/src/main/java/org/nkjmlab/sorm4j/sql/SelectQuery.java index 8647707b..c3b1ed36 100644 --- a/src/main/java/org/nkjmlab/sorm4j/sql/SelectQuery.java +++ b/src/main/java/org/nkjmlab/sorm4j/sql/SelectQuery.java @@ -12,7 +12,7 @@ * @param */ public interface SelectQuery - extends SelectBuilder, NamedParameterSql, OrderedParameterSql, SqlStatementSupplier, Query { + extends SelectBuilder, NamedParameterSql, OrderedParameterSql, ParameterizedSqlParser, Query { @Override OrderedParameterQuery addParameter(Object... parameters); diff --git a/src/main/java/org/nkjmlab/sorm4j/sql/SqlStatementSupplier.java b/src/main/java/org/nkjmlab/sorm4j/sql/SqlStatementSupplier.java deleted file mode 100644 index 2233ff73..00000000 --- a/src/main/java/org/nkjmlab/sorm4j/sql/SqlStatementSupplier.java +++ /dev/null @@ -1,11 +0,0 @@ -package org.nkjmlab.sorm4j.sql; - -public interface SqlStatementSupplier { - /** - * Convert {@link SqlStatement} objects. - * - * @return - */ - SqlStatement toSqlStatement(); - -} diff --git a/src/test/java/org/nkjmlab/sorm4j/OrmConnectionTest.java b/src/test/java/org/nkjmlab/sorm4j/OrmConnectionTest.java index d1198aa4..15369336 100644 --- a/src/test/java/org/nkjmlab/sorm4j/OrmConnectionTest.java +++ b/src/test/java/org/nkjmlab/sorm4j/OrmConnectionTest.java @@ -21,7 +21,7 @@ import org.nkjmlab.sorm4j.sql.InsertResult; import org.nkjmlab.sorm4j.sql.NamedParameterSql; import org.nkjmlab.sorm4j.sql.OrderedParameterSql; -import org.nkjmlab.sorm4j.sql.SqlStatement; +import org.nkjmlab.sorm4j.sql.ParameterizedSql; import org.nkjmlab.sorm4j.sql.tuple.Tuple2; import org.nkjmlab.sorm4j.sql.tuple.Tuple3; @@ -100,10 +100,10 @@ void testNamedRequest() { row = sorm.apply(conn -> { NamedParameterSql sql = - NamedParameterSql.from("insert into players values(`id`, `name`, `address`)", '`', '`', + NamedParameterSql.parse("insert into players values(`id`, `name`, `address`)", '`', '`', Configurator.DEFAULT_COLUMN_FIELD_MAPPER); sql.bind("id", id.incrementAndGet()).bind("name", "Frank").bind("address", "Tokyo"); - return conn.executeUpdate(sql.toSqlStatement()); + return conn.executeUpdate(sql.parse()); }); assertThat(row).isEqualTo(1); @@ -318,7 +318,7 @@ void testExec() { sorm.accept(m -> { m.insert(a); m.executeUpdate("DROP TABLE IF EXISTS PLAYERS1"); - m.executeUpdate(SqlStatement.from("DROP TABLE IF EXISTS PLAYERS1")); + m.executeUpdate(ParameterizedSql.from("DROP TABLE IF EXISTS PLAYERS1")); }); } @@ -392,11 +392,11 @@ void testReadLazy() { sorm.accept(m -> { m.insert(List.of(a, b)); Map map = - m.readMapLazy(SqlStatement.from("select * from players")).toList().get(0); + m.readMapLazy(ParameterizedSql.from("select * from players")).toList().get(0); assertThat(map.get("NAME") != null ? map.get("NAME") : map.get("name")) .isEqualTo(a.getName()); - map = m.readMapFirst(SqlStatement.from("select * from players")); + map = m.readMapFirst(ParameterizedSql.from("select * from players")); assertThat(map.get("NAME") != null ? map.get("NAME") : map.get("name")) .isEqualTo(a.getName()); @@ -510,19 +510,19 @@ void testReadAllLazy() { .isEqualTo(a.getName()); }); sorm.accept(m -> { - Map map = m.readMapList(SqlStatement.from("select * from players")).get(0); + Map map = m.readMapList(ParameterizedSql.from("select * from players")).get(0); assertThat(map.get("NAME") != null ? map.get("NAME") : map.get("name")) .isEqualTo(a.getName()); }); sorm.accept(m -> { Map map = - m.readMapOne(OrderedParameterSql.toSqlStatement("select * from players where id=?", 1)); + m.readMapOne(OrderedParameterSql.parse("select * from players where id=?", 1)); assertThat(map.get("NAME") != null ? map.get("NAME") : map.get("name")) .isEqualTo(a.getName()); }); sorm.accept(m -> { Map map = - m.readMapLazy(SqlStatement.from("select * from players")).toList().get(0); + m.readMapLazy(ParameterizedSql.from("select * from players")).toList().get(0); assertThat(map.get("NAME") != null ? map.get("NAME") : map.get("name")) .isEqualTo(a.getName()); }); @@ -557,10 +557,10 @@ void testReadList() { Player b = SormTestUtils.PLAYER_BOB; m.insert(a, b); assertThat(m.readList(Player.class, "select * from players")).contains(a, b); - assertThat(m.readList(Player.class, SqlStatement.from("select * from players"))).contains(a, + assertThat(m.readList(Player.class, ParameterizedSql.from("select * from players"))).contains(a, b); assertThat(m.readOne(Player.class, - OrderedParameterSql.toSqlStatement("select * from players where id=?", 1))).isEqualTo(a); + OrderedParameterSql.parse("select * from players where id=?", 1))).isEqualTo(a); assertThat(m.readOne(Player.class, "select * from players where id=?", 1)).isEqualTo(a); @@ -576,10 +576,10 @@ void testReadOne() { m.insert(a); m.insert(b); Guest g = m.readOne(Guest.class, - OrderedParameterSql.toSqlStatement("select * from guests where id=?", 1)); + OrderedParameterSql.parse("select * from guests where id=?", 1)); assertThat(g.getAddress()).isEqualTo(a.getAddress()); assertThat(g.getName()).isEqualTo(a.getName()); - g = m.readOne(Guest.class, SqlStatement.from("select * from guests")); + g = m.readOne(Guest.class, ParameterizedSql.from("select * from guests")); failBecauseExceptionWasNotThrown(SormException.class); }); } catch (SormException e) { @@ -604,7 +604,7 @@ void testTransaction() { m.insert(a); Guest g = m.readFirst(Guest.class, "SELECT * FROM GUESTS"); assertThat(g.getAddress()).isEqualTo(a.getAddress()); - g = m.readFirst(Guest.class, SqlStatement.from("SELECT * FROM GUESTS")); + g = m.readFirst(Guest.class, ParameterizedSql.from("SELECT * FROM GUESTS")); assertThat(g.getAddress()).isEqualTo(a.getAddress()); }); } diff --git a/src/test/java/org/nkjmlab/sorm4j/ResultSetMapperTest.java b/src/test/java/org/nkjmlab/sorm4j/ResultSetMapperTest.java index c415f165..69c12015 100644 --- a/src/test/java/org/nkjmlab/sorm4j/ResultSetMapperTest.java +++ b/src/test/java/org/nkjmlab/sorm4j/ResultSetMapperTest.java @@ -5,7 +5,7 @@ import org.junit.jupiter.api.Test; import org.nkjmlab.sorm4j.common.Player; import org.nkjmlab.sorm4j.common.SormTestUtils; -import org.nkjmlab.sorm4j.sql.SqlStatement; +import org.nkjmlab.sorm4j.sql.ParameterizedSql; class ResultSetMapperTest { @@ -19,25 +19,25 @@ void setUp() { @Test void testMapRowClassOfTResultSet() { - sorm.apply(conn -> conn.executeQuery(SqlStatement.from("select * from players"), + sorm.apply(conn -> conn.executeQuery(ParameterizedSql.from("select * from players"), (rs, rowNum) -> conn.mapRow(Player.class, rs))); } @Test void testMapRowResultSet() { - sorm.apply(conn -> conn.executeQuery(SqlStatement.from("select * from players"), + sorm.apply(conn -> conn.executeQuery(ParameterizedSql.from("select * from players"), (rs, rowNum) -> conn.mapRowToMap(rs))); } @Test void testMapRowsClassOfTResultSet() { - sorm.apply(conn -> conn.executeQuery(SqlStatement.from("select * from players"), + sorm.apply(conn -> conn.executeQuery(ParameterizedSql.from("select * from players"), rs -> conn.mapRowList(Player.class, rs))); } @Test void testMapRowsResultSet() { - sorm.apply(conn -> conn.executeQuery(SqlStatement.from("select * from players"), + sorm.apply(conn -> conn.executeQuery(ParameterizedSql.from("select * from players"), rs -> conn.mapRowsToMapList(rs))); } diff --git a/src/test/java/org/nkjmlab/sorm4j/TypedOrmConnectionTest.java b/src/test/java/org/nkjmlab/sorm4j/TypedOrmConnectionTest.java index 2f056659..d346d572 100644 --- a/src/test/java/org/nkjmlab/sorm4j/TypedOrmConnectionTest.java +++ b/src/test/java/org/nkjmlab/sorm4j/TypedOrmConnectionTest.java @@ -21,7 +21,7 @@ import org.nkjmlab.sorm4j.sql.InsertResult; import org.nkjmlab.sorm4j.sql.LazyResultSet; import org.nkjmlab.sorm4j.sql.OrderedParameterSql; -import org.nkjmlab.sorm4j.sql.SqlStatement; +import org.nkjmlab.sorm4j.sql.ParameterizedSql; class TypedOrmConnectionTest { @@ -51,20 +51,20 @@ void testOrderedRequest() { List ret1 = sorm.apply(Player.class, conn -> conn - .executeQuery(SqlStatement.from("select * from players"), (rs, rn) -> conn.mapRow(rs))); + .executeQuery(ParameterizedSql.from("select * from players"), (rs, rn) -> conn.mapRow(rs))); assertThat(ret1.size()).isEqualTo(2); ret1 = sorm.apply(Player.class, conn -> conn - .executeQuery(SqlStatement.from("select * from players"), rs -> conn.mapRowList(rs))); + .executeQuery(ParameterizedSql.from("select * from players"), rs -> conn.mapRowList(rs))); assertThat(ret1.size()).isEqualTo(2); List> ret2 = sorm.apply(Player.class, conn -> conn - .executeQuery(SqlStatement.from("select * from players"), rs -> conn.mapRowsToMapList(rs))); + .executeQuery(ParameterizedSql.from("select * from players"), rs -> conn.mapRowsToMapList(rs))); assertThat(ret2.size()).isEqualTo(2); ret2 = sorm.apply(Player.class, - conn -> conn.executeQuery(SqlStatement.from("select * from players"), + conn -> conn.executeQuery(ParameterizedSql.from("select * from players"), (rs, rowNum) -> conn.mapRowToMap(rs))); assertThat(ret2.size()).isEqualTo(2); @@ -331,7 +331,7 @@ void testExec() { sorm.accept(Player.class, m -> { m.insert(a); m.executeUpdate("DROP TABLE IF EXISTS PLAYERS1"); - m.executeUpdate(SqlStatement.from("DROP TABLE IF EXISTS PLAYERS1")); + m.executeUpdate(ParameterizedSql.from("DROP TABLE IF EXISTS PLAYERS1")); }); } @@ -345,22 +345,22 @@ void testReadLazy() { sorm.accept(Player.class, m -> { m.insert(List.of(a, b)); - Player p1 = m.readLazy(SqlStatement.from("select * from players")) + Player p1 = m.readLazy(ParameterizedSql.from("select * from players")) .toList((rs, rowNum) -> m.mapRow(rs)).get(0); assertThat(p1.getName()).isEqualTo(a.getName()); Map map = - m.readMapLazy(SqlStatement.from("select * from players")).toList().get(0); + m.readMapLazy(ParameterizedSql.from("select * from players")).toList().get(0); assertThat(map.get("NAME") != null ? map.get("NAME") : map.get("name")) .isEqualTo(a.getName()); - map = m.readMapLazy(SqlStatement.from("select * from players")).toList().get(0); + map = m.readMapLazy(ParameterizedSql.from("select * from players")).toList().get(0); assertThat(map.get("NAME") != null ? map.get("NAME") : map.get("name")) .isEqualTo(a.getName()); - map = m.readMapFirst(SqlStatement.from("select * from players")); + map = m.readMapFirst(ParameterizedSql.from("select * from players")); assertThat(map.get("NAME") != null ? map.get("NAME") : map.get("name")) .isEqualTo(a.getName()); @@ -370,7 +370,7 @@ void testReadLazy() { map = m.readMapFirst( - OrderedParameterSql.toSqlStatement("select * from players WHERE id=?", 100)); + OrderedParameterSql.parse("select * from players WHERE id=?", 100)); assertThat(map).isNull(); @@ -426,7 +426,7 @@ void testReadAllLazy() { sorm.accept(Player.class, m -> { - Map map = m.readMapList(SqlStatement.from("select * from players")).get(0); + Map map = m.readMapList(ParameterizedSql.from("select * from players")).get(0); assertThat(map.get("NAME") != null ? map.get("NAME") : map.get("name")) .isEqualTo(a.getName()); }); @@ -439,7 +439,7 @@ void testReadAllLazy() { sorm.accept(Player.class, m -> { Map map = - m.readMapOne(OrderedParameterSql.toSqlStatement("select * from players where id=?", 1)); + m.readMapOne(OrderedParameterSql.parse("select * from players where id=?", 1)); assertThat(map.get("NAME") != null ? map.get("NAME") : map.get("name")) .isEqualTo(a.getName()); }); @@ -450,7 +450,7 @@ void testReadAllLazy() { }); sorm.accept(Player.class, m -> { Map map = - m.readMapLazy(SqlStatement.from("select * from players")).toList().get(0); + m.readMapLazy(ParameterizedSql.from("select * from players")).toList().get(0); assertThat(map.get("NAME") != null ? map.get("NAME") : map.get("name")) .isEqualTo(a.getName()); }); @@ -474,9 +474,9 @@ void testReadList() { Player b = SormTestUtils.PLAYER_BOB; m.insert(a, b); assertThat(m.readList("select * from players")).contains(a, b); - assertThat(m.readList(SqlStatement.from("select * from players"))).contains(a, b); + assertThat(m.readList(ParameterizedSql.from("select * from players"))).contains(a, b); assertThat( - m.readOne(OrderedParameterSql.toSqlStatement("select * from players where id=?", 1))) + m.readOne(OrderedParameterSql.parse("select * from players where id=?", 1))) .isEqualTo(a); assertThat(m.readOne("select * from players where id=?", 1)).isEqualTo(a); }); @@ -497,10 +497,10 @@ void testReadOne() { m.insert(a); m.insert(b); Guest g = - m.readOne(OrderedParameterSql.toSqlStatement("select * from guests where id=?", 1)); + m.readOne(OrderedParameterSql.parse("select * from guests where id=?", 1)); assertThat(g.getAddress()).isEqualTo(a.getAddress()); assertThat(g.getName()).isEqualTo(a.getName()); - g = m.readOne(SqlStatement.from("select * from guests")); + g = m.readOne(ParameterizedSql.from("select * from guests")); failBecauseExceptionWasNotThrown(SormException.class); }); } catch (SormException e) { @@ -554,7 +554,7 @@ void testTransaction() { m = m.untype().type(Guest.class); Guest g = m.readFirst("SELECT * FROM GUESTS"); assertThat(g.getAddress()).isEqualTo(a.getAddress()); - g = m.readFirst(SqlStatement.from("SELECT * FROM GUESTS")); + g = m.readFirst(ParameterizedSql.from("SELECT * FROM GUESTS")); assertThat(g.getAddress()).isEqualTo(a.getAddress()); m.commit(); }); diff --git a/src/test/java/org/nkjmlab/sorm4j/sql/NamedParameterSqlTest.java b/src/test/java/org/nkjmlab/sorm4j/sql/NamedParameterSqlTest.java index 8593c16d..4cb3065c 100644 --- a/src/test/java/org/nkjmlab/sorm4j/sql/NamedParameterSqlTest.java +++ b/src/test/java/org/nkjmlab/sorm4j/sql/NamedParameterSqlTest.java @@ -20,7 +20,7 @@ void testCustomer() { sorm.apply(conn -> conn.insert(ALICE, BOB, CAROL, DAVE)); { - SqlStatement statement = OrderedParameterSql.toSqlStatement( + ParameterizedSql statement = OrderedParameterSql.parse( "select * from customer where name like {?} and address in() and id=?", "A%", List.of("Tokyo", "Kyoto"), 1); System.out.println(statement); @@ -30,14 +30,14 @@ void testCustomer() { { String sql = "select * from customer where id=:id and address=:address"; - SqlStatement statement = - NamedParameterSql.from(sql).bind("id", 1).bind("address", "Kyoto").toSqlStatement(); + ParameterizedSql statement = + NamedParameterSql.from(sql).bind("id", 1).bind("address", "Kyoto").parse(); System.out.println(statement); List ret = sorm.apply(conn -> conn.readList(Customer.class, statement)); System.out.println(ret); } { - SqlStatement statement = NamedParameterSql.toSqlStatement( + ParameterizedSql statement = NamedParameterSql.parse( "select * from customer where name like {:name} and address in(<:address>) and id=:id", Map.of("id", 1, "address", List.of("Tokyo", "Kyoto"), "name", "A%")); System.out.println(statement); @@ -48,7 +48,7 @@ void testCustomer() { @Test void testCreate() { - SqlStatement sp = NamedParameterSql.toSqlStatement(sql, namedParams); + ParameterizedSql sp = NamedParameterSql.parse(sql, namedParams); assertThat(sp.getSql()).isEqualTo("select * from simple where id=? and name=?"); @@ -57,12 +57,12 @@ void testCreate() { assertThat(sp.toString()) .isEqualTo("sql=[select * from simple where id=? and name=?], parameters=[2, foo]"); - assertThat(SqlStatement.from("select * from test").toString()).contains("[select * from test]"); + assertThat(ParameterizedSql.from("select * from test").toString()).contains("[select * from test]"); } @Test void testBindAll() { - SqlStatement sp = NamedParameterSql.from(sql).bindAll(namedParams).toSqlStatement(); + ParameterizedSql sp = NamedParameterSql.from(sql).bindAll(namedParams).parse(); assertThat(sp.getSql()).isEqualTo("select * from simple where id=? and name=?"); org.assertj.core.api.Assertions.assertThat(sp.getParameters()) .isEqualTo(new Object[] {2, "foo"}); @@ -71,8 +71,8 @@ void testBindAll() { @Test void testBind() { - SqlStatement sp = NamedParameterSql.from(sql).bind("name", "foo").bind("id", 1).bind("idid", 2) - .toSqlStatement(); + ParameterizedSql sp = NamedParameterSql.from(sql).bind("name", "foo").bind("id", 1).bind("idid", 2) + .parse(); assertThat(sp.getSql()).isEqualTo("select * from simple where id=? and name=?"); assertThat(sp.getParameters()).isEqualTo(new Object[] {2, "foo"}); @@ -81,8 +81,8 @@ void testBind() { @Test void testBindList() { - SqlStatement sp = NamedParameterSql.from("select * from where ID in(<:names>)") - .bind("names", List.of("foo", "bar")).toSqlStatement(); + ParameterizedSql sp = NamedParameterSql.from("select * from where ID in(<:names>)") + .bind("names", List.of("foo", "bar")).parse(); System.out.println(sp); diff --git a/src/test/java/org/nkjmlab/sorm4j/sql/NamedParametersQueryImplTest.java b/src/test/java/org/nkjmlab/sorm4j/sql/NamedParametersQueryImplTest.java index 1da0c82c..04aae793 100644 --- a/src/test/java/org/nkjmlab/sorm4j/sql/NamedParametersQueryImplTest.java +++ b/src/test/java/org/nkjmlab/sorm4j/sql/NamedParametersQueryImplTest.java @@ -22,17 +22,17 @@ void testBeforeEach() { void testToSqlStatement() { sorm.accept(Player.class, con -> { con.insert(PLAYER_ALICE); - SqlStatement ret = + ParameterizedSql ret = con.createNamedParameterQuery("select * from players where id=:id and name=:name") - .toSqlStatement(); + .parse(); assertThat(ret.getSql()).isEqualTo( - SqlStatement.from("select * from players where id=:id and name=:name").getSql()); + ParameterizedSql.from("select * from players where id=:id and name=:name").getSql()); }); sorm.accept(con -> { - SqlStatement ret = con.createNamedParameterQuery(Player.class, - "select * from players where id=:id and name=:name").toSqlStatement(); + ParameterizedSql ret = con.createNamedParameterQuery(Player.class, + "select * from players where id=:id and name=:name").parse(); assertThat(ret.getSql()).isEqualTo( - SqlStatement.from("select * from players where id=:id and name=:name").getSql()); + ParameterizedSql.from("select * from players where id=:id and name=:name").getSql()); }); } diff --git a/src/test/java/org/nkjmlab/sorm4j/sql/OrderedParameterSqlTest.java b/src/test/java/org/nkjmlab/sorm4j/sql/OrderedParameterSqlTest.java index c3f10f0d..caa484a4 100644 --- a/src/test/java/org/nkjmlab/sorm4j/sql/OrderedParameterSqlTest.java +++ b/src/test/java/org/nkjmlab/sorm4j/sql/OrderedParameterSqlTest.java @@ -8,8 +8,8 @@ class OrderedParameterSqlTest { @Test void testToSqlStatementStringObjectArray() { String sql = "select * from customer where id=? and address=?"; - SqlStatement statement = - OrderedParameterSql.from(sql).addParameter(1, "Kyoto").toSqlStatement(); + ParameterizedSql statement = + OrderedParameterSql.from(sql).addParameter(1, "Kyoto").parse(); System.out.println(statement); // assertThat(sqlSt.getParameters().length).isEqualTo(1); // assertThat(sqlSt.getParameters()[0]).isEqualTo("'alice', 1"); @@ -18,8 +18,8 @@ void testToSqlStatementStringObjectArray() { @Test void testToSqlStatementStringObject() { - SqlStatement sqlSt = - OrderedParameterSql.toSqlStatement("select * from a where id=? and id=?", 1, 2); + ParameterizedSql sqlSt = + OrderedParameterSql.parse("select * from a where id=? and id=?", 1, 2); assertThat(sqlSt.getParameters().length).isEqualTo(2); assertThat(sqlSt.getParameters()[0]).isEqualTo(1); assertThat(sqlSt.getParameters()[1]).isEqualTo(2); diff --git a/src/test/java/org/nkjmlab/sorm4j/sql/SelectBuilderTest.java b/src/test/java/org/nkjmlab/sorm4j/sql/SelectBuilderTest.java index 5be49208..2cd4b3f0 100644 --- a/src/test/java/org/nkjmlab/sorm4j/sql/SelectBuilderTest.java +++ b/src/test/java/org/nkjmlab/sorm4j/sql/SelectBuilderTest.java @@ -3,7 +3,7 @@ import static org.assertj.core.api.Assertions.*; import static org.nkjmlab.sorm4j.sql.SelectBuilder.*; import static org.nkjmlab.sorm4j.sql.SelectBuilder.as; -import static org.nkjmlab.sorm4j.sql.SqlStatement.*; +import static org.nkjmlab.sorm4j.sql.ParameterizedSql.*; import org.junit.jupiter.api.Test; import org.nkjmlab.sorm4j.Sorm; import org.nkjmlab.sorm4j.common.Guest; @@ -13,7 +13,7 @@ class SelectBuilderTest { @Test void testSqlStatement() { - assertThat(SqlStatement.literal("hi, my name's tim.")).isEqualTo("'hi, my name''s tim.'"); + assertThat(ParameterizedSql.literal("hi, my name's tim.")).isEqualTo("'hi, my name''s tim.'"); assertThat(SqlUtils.literal(null)).isEqualTo("null"); assertThat(SqlUtils.literal("?")).isEqualTo("?"); assertThat(SqlUtils.literal("test")).isEqualTo("'test'"); @@ -40,7 +40,7 @@ void testBuild1() { builder.groupBy("TEAM"); builder.where(or(and("ID>100", "COUNTRY IN (?)"), "YEAR>2001")); - String sql = builder.from("GUESTS").orderBy("age", "desc").limit(10).toSqlStatement().getSql(); + String sql = builder.from("GUESTS").orderBy("age", "desc").limit(10).parse().getSql(); assertThat(sql).contains( "select distinct avg(AGE) as AVERAGE_AGE, TEAM from GUESTS where ((ID>100 and COUNTRY IN (?)) or YEAR>2001) group by TEAM order by age desc limit 10"); diff --git a/src/test/java/org/nkjmlab/sorm4j/sql/SelectQueryTest.java b/src/test/java/org/nkjmlab/sorm4j/sql/SelectQueryTest.java index 2f41838f..63ce4ed6 100644 --- a/src/test/java/org/nkjmlab/sorm4j/sql/SelectQueryTest.java +++ b/src/test/java/org/nkjmlab/sorm4j/sql/SelectQueryTest.java @@ -109,7 +109,7 @@ void testCompareSelectBuilderAndSelectQuery() { String sql2 = bs.from("GUESTS").orderBy("age", "desc").limit(10).buildSql(); assertThat(sql).isEqualTo(sql2); - assertThat(builder.toSqlStatement().getSql()).isEqualTo(sql2); + assertThat(builder.parse().getSql()).isEqualTo(sql2); assertThat(builder.toPrettyString()).isEqualTo(bs.toPrettyString()); assertThat(builder.toPrettyString(true)).isEqualTo(bs.toPrettyString(true)); }); diff --git a/src/test/java/repackage/net/sf/persist/tests/engine/postgresql/TestPostgreSQLSqlMapper.java b/src/test/java/repackage/net/sf/persist/tests/engine/postgresql/TestPostgreSQLSqlMapper.java index 006ae732..21423754 100644 --- a/src/test/java/repackage/net/sf/persist/tests/engine/postgresql/TestPostgreSQLSqlMapper.java +++ b/src/test/java/repackage/net/sf/persist/tests/engine/postgresql/TestPostgreSQLSqlMapper.java @@ -36,7 +36,7 @@ import org.nkjmlab.sorm4j.extension.SormOptions; import org.nkjmlab.sorm4j.extension.SqlParametersSetter; import org.nkjmlab.sorm4j.sql.OrderedParameterSql; -import org.nkjmlab.sorm4j.sql.SqlStatement; +import org.nkjmlab.sorm4j.sql.ParameterizedSql; import org.postgresql.util.PGobject; import repackage.net.sf.persist.tests.engine.framework.DbEngineTestUtils; @@ -201,9 +201,9 @@ private void doTestIn(OrmConnection c, String column, Object param) { private void bindInTest(OrmConnection c, String column, Object param) { String messagePrefix = "bindIn: " + column + "(" + param.getClass() + ") "; try { - SqlStatement statement = OrderedParameterSql + ParameterizedSql statement = OrderedParameterSql .from("SELECT " + column + " FROM sql_mapper_test WHERE " + column + " in()") - .addParameter(param).toSqlStatement(); + .addParameter(param).parse(); Map ret = c.readMapFirst(statement); if (ret != null) { System.out.println(messagePrefix + "success => " + ret); From af1210e9cfa060168e504b8a40405421a3173870 Mon Sep 17 00:00:00 2001 From: Yuu Nakajima Date: Tue, 27 Apr 2021 10:42:48 +0900 Subject: [PATCH 11/20] Modify ParameterizedSql --- .../internal/sql/NamedParameterSqlImpl.java | 10 ++++++---- .../internal/sql/OrderedParameterSqlImpl.java | 3 +-- .../internal/sql/ParameterizedSqlImpl.java | 18 ++++++++++++++---- .../sorm4j/sql/OrderedParameterSql.java | 3 ++- .../nkjmlab/sorm4j/sql/ParameterizedSql.java | 9 +++++++++ 5 files changed, 32 insertions(+), 11 deletions(-) diff --git a/src/main/java/org/nkjmlab/sorm4j/internal/sql/NamedParameterSqlImpl.java b/src/main/java/org/nkjmlab/sorm4j/internal/sql/NamedParameterSqlImpl.java index 68c2ce86..ee5ec45a 100644 --- a/src/main/java/org/nkjmlab/sorm4j/internal/sql/NamedParameterSqlImpl.java +++ b/src/main/java/org/nkjmlab/sorm4j/internal/sql/NamedParameterSqlImpl.java @@ -15,8 +15,8 @@ import org.nkjmlab.sorm4j.sql.ParameterizedSql; /** - * SQL with named parameters. The instance could be convert to {@link ParameterizedSql}.The class could - * treat {@link List} parameter. + * SQL with named parameters. The instance could be convert to {@link ParameterizedSql}.The class + * could treat {@link List} parameter. * * @author nkjm * @@ -29,7 +29,7 @@ public class NamedParameterSqlImpl implements NamedParameterSql { private final char prefix; private final char suffix; private final ColumnFieldMapper columnFieldMapper; - private final Map parameters = new HashMap<>(); + private final Map parameters; private Object bean; public NamedParameterSqlImpl(String sql, char prefix, char suffix, @@ -38,15 +38,17 @@ public NamedParameterSqlImpl(String sql, char prefix, char suffix, this.prefix = prefix; this.suffix = suffix; this.columnFieldMapper = columnFieldMapper; + this.parameters = new HashMap<>(); } + public NamedParameterSqlImpl(String sql) { this(sql, DEFAULT_PREFIX, DEFAULT_SUFFIX, Configurator.DEFAULT_COLUMN_FIELD_MAPPER); } @Override public NamedParameterSql bindAll(Map namedParams) { - namedParams.entrySet().stream().forEach(e -> bind(e.getKey(), e.getValue())); + this.parameters.putAll(namedParams); return this; } diff --git a/src/main/java/org/nkjmlab/sorm4j/internal/sql/OrderedParameterSqlImpl.java b/src/main/java/org/nkjmlab/sorm4j/internal/sql/OrderedParameterSqlImpl.java index 0e39b4c8..11ad0a46 100644 --- a/src/main/java/org/nkjmlab/sorm4j/internal/sql/OrderedParameterSqlImpl.java +++ b/src/main/java/org/nkjmlab/sorm4j/internal/sql/OrderedParameterSqlImpl.java @@ -23,7 +23,7 @@ public OrderedParameterSqlImpl(String sql) { @Override public OrderedParameterSql addParameter(Object... parameters) { - Arrays.asList(parameters).forEach(v -> addParameter(v)); + this.parameters.addAll(Arrays.asList(parameters)); return this; } @@ -39,5 +39,4 @@ public ParameterizedSql parse() { } - } diff --git a/src/main/java/org/nkjmlab/sorm4j/internal/sql/ParameterizedSqlImpl.java b/src/main/java/org/nkjmlab/sorm4j/internal/sql/ParameterizedSqlImpl.java index e674e57e..6cd3f8e2 100644 --- a/src/main/java/org/nkjmlab/sorm4j/internal/sql/ParameterizedSqlImpl.java +++ b/src/main/java/org/nkjmlab/sorm4j/internal/sql/ParameterizedSqlImpl.java @@ -53,15 +53,15 @@ public static ParameterizedSql parse(String sql, Object... parameters) { if (parameters.length == 0) { return st; } - st = sql.contains(LIST_PLACEHOLDER) ? procListPlaceholder(sql, parameters) : st; + st = sql.contains(LIST_PLACEHOLDER) ? parseListPlaceholder(sql, parameters) : st; st = sql.contains(EMBEDDED_PLACEHOLDER) - ? procEmbeddedPlaceholder(st.getSql(), st.getParameters()) + ? parseEmbeddedPlaceholder(st.getSql(), st.getParameters()) : st; return st; } - private static ParameterizedSql procListPlaceholder(String sql, Object[] parameters) { + private static ParameterizedSql parseListPlaceholder(String sql, Object[] parameters) { final List specialParameterIndexes = createSpecialParameterIndexes(sql, '<', '?', '>'); List flattenListParams = new ArrayList<>(); @@ -104,7 +104,7 @@ private static int getSize(Object object) { } - private static ParameterizedSql procEmbeddedPlaceholder(String sql, Object[] parameters) { + public static ParameterizedSql parseEmbeddedPlaceholder(String sql, Object... parameters) { final List specialParameterIndexes = createSpecialParameterIndexes(sql, '{', '?', '}'); @@ -143,4 +143,14 @@ private static List createSpecialParameterIndexes(String str, char pref } + @Override + public String getBindedSql() { + String sql = this.sql; + for (int i = 0; i < parameters.length; i++) { + sql = sql.replaceFirst("\\?", ParameterizedSql.literal(parameters[i])); + } + return sql; + } + + } diff --git a/src/main/java/org/nkjmlab/sorm4j/sql/OrderedParameterSql.java b/src/main/java/org/nkjmlab/sorm4j/sql/OrderedParameterSql.java index 2db7c3f1..5c3a5821 100644 --- a/src/main/java/org/nkjmlab/sorm4j/sql/OrderedParameterSql.java +++ b/src/main/java/org/nkjmlab/sorm4j/sql/OrderedParameterSql.java @@ -2,6 +2,7 @@ import java.util.List; import org.nkjmlab.sorm4j.internal.sql.OrderedParameterSqlImpl; +import org.nkjmlab.sorm4j.internal.sql.ParameterizedSqlImpl; /** * SQL with ordered parameters. The instance could be convert to {@link ParameterizedSql}. The class @@ -36,7 +37,7 @@ public interface OrderedParameterSql extends ParameterizedSqlParser { * @return */ static ParameterizedSql parse(String sql, Object... parameters) { - return from(sql).addParameter(parameters).parse(); + return ParameterizedSqlImpl.parse(sql, parameters); } /** diff --git a/src/main/java/org/nkjmlab/sorm4j/sql/ParameterizedSql.java b/src/main/java/org/nkjmlab/sorm4j/sql/ParameterizedSql.java index 54a00c3e..f3ddf54b 100644 --- a/src/main/java/org/nkjmlab/sorm4j/sql/ParameterizedSql.java +++ b/src/main/java/org/nkjmlab/sorm4j/sql/ParameterizedSql.java @@ -1,6 +1,7 @@ package org.nkjmlab.sorm4j.sql; import java.util.Map; +import org.nkjmlab.sorm4j.annotation.Experimental; import org.nkjmlab.sorm4j.internal.sql.ParameterizedSqlImpl; import org.nkjmlab.sorm4j.internal.util.SqlUtils; @@ -28,10 +29,16 @@ public interface ParameterizedSql { */ Object[] getParameters(); + @Experimental + String getBindedSql(); + + + @Experimental static ParameterizedSql parseAsOrdered(String sql, Object... orderedParameters) { return OrderedParameterSql.parse(sql, orderedParameters); } + @Experimental static ParameterizedSql parseAsNamed(String sql, Map namedParameters) { return NamedParameterSql.parse(sql, namedParameters); } @@ -53,6 +60,7 @@ static ParameterizedSql from(String sql) { * @param element * @return */ + @Experimental static String literal(Object element) { return SqlUtils.literal(element); } @@ -63,6 +71,7 @@ static String literal(Object element) { * @param expr * @return */ + @Experimental static String quote(String expr) { return SqlUtils.quote(expr); } From 1fd8c3bbc289c8dc3a636812f71ccd9e32eb7373 Mon Sep 17 00:00:00 2001 From: Yuu Nakajima Date: Wed, 28 Apr 2021 16:47:24 +0900 Subject: [PATCH 12/20] Create typed package --- .../org/nkjmlab/sorm4j/OrmConnection.java | 3 + .../org/nkjmlab/sorm4j/OrmTransaction.java | 2 + src/main/java/org/nkjmlab/sorm4j/Sorm.java | 75 +------ .../java/org/nkjmlab/sorm4j/SormFactory.java | 1 + .../sorm4j/internal/mapping/ConfigStore.java | 2 +- .../internal/mapping/OrmConnectionImpl.java | 4 +- .../sorm4j/internal/mapping/SormImpl.java | 57 +----- ...mOptionsImpl.java => SormOptionsImpl.java} | 4 +- .../mapping/TypedOrmConnectionImpl.java | 4 +- .../internal/sql/ParameterizedSqlImpl.java | 3 +- .../sorm4j/internal/sql/QueryExecutor.java | 2 +- .../internal/sql/QueryTypedOrmExecutor.java | 2 +- .../sorm4j/internal/util/MethodInvoker.java | 14 +- .../nkjmlab/sorm4j/sql/ParameterizedSql.java | 4 +- .../org/nkjmlab/sorm4j/sql/SelectBuilder.java | 2 + .../org/nkjmlab/sorm4j/sql/SqlKeyword.java | 79 +++++++ .../sorm4j/sql/schema/TableSchema.java | 193 ++++++++++++++++++ .../{ => typed}/TypedOrmConnection.java | 7 +- .../sorm4j/{ => typed}/TypedOrmReader.java | 2 +- .../{ => typed}/TypedOrmTransaction.java | 4 +- .../sorm4j/{ => typed}/TypedOrmUpdater.java | 2 +- .../{ => typed}/TypedResultSetMapper.java | 2 +- .../org/nkjmlab/sorm4j/typed/package.html | 7 + .../org/nkjmlab/sorm4j/OrmConnectionTest.java | 34 ++- .../org/nkjmlab/sorm4j/SormFactoryTest.java | 5 +- .../java/org/nkjmlab/sorm4j/SormTest.java | 11 +- .../extension/DefaultTableNameMapperTest.java | 11 +- .../internal/mapping/OrmOptionsImplTest.java | 22 ++ .../internal/mapping/TableMappingTest.java | 25 ++- ...OfMultiRowInOneStatementProcessorTest.java | 11 +- .../MultiRowInOneStatementProcessorTest.java | 10 +- .../mapping/multirow/OrmConfigStoreTest.java | 2 +- .../multirow/SimpleBatchProcessorTest.java | 6 +- .../internal/util/MethodInvokerTest.java | 1 + .../sorm4j/internal/util/StringUtilsTest.java | 9 +- .../nkjmlab/sorm4j/internal/util/TryTest.java | 8 + .../sql/NamedParametersQueryImplTest.java | 22 +- .../sql/OrderedParametersQueryTest.java | 11 +- .../sorm4j/sql/ParameterizedSqlTest.java | 46 +++++ .../nkjmlab/sorm4j/sql/SelectBuilderTest.java | 15 +- .../nkjmlab/sorm4j/sql/SelectQueryTest.java | 32 ++- .../nkjmlab/sorm4j/sql/SqlKeywordTest.java | 22 ++ .../sorm4j/sql/schema/TableSchemaTest.java | 53 +++++ .../{ => typed}/TypedOrmConnectionTest.java | 163 ++++++++------- .../sf/persist/tests/common/TestSimple.java | 2 +- 45 files changed, 672 insertions(+), 324 deletions(-) rename src/main/java/org/nkjmlab/sorm4j/internal/mapping/{OrmOptionsImpl.java => SormOptionsImpl.java} (78%) create mode 100644 src/main/java/org/nkjmlab/sorm4j/sql/SqlKeyword.java create mode 100644 src/main/java/org/nkjmlab/sorm4j/sql/schema/TableSchema.java rename src/main/java/org/nkjmlab/sorm4j/{ => typed}/TypedOrmConnection.java (85%) rename src/main/java/org/nkjmlab/sorm4j/{ => typed}/TypedOrmReader.java (95%) rename src/main/java/org/nkjmlab/sorm4j/{ => typed}/TypedOrmTransaction.java (78%) rename src/main/java/org/nkjmlab/sorm4j/{ => typed}/TypedOrmUpdater.java (94%) rename src/main/java/org/nkjmlab/sorm4j/{ => typed}/TypedResultSetMapper.java (88%) create mode 100644 src/main/java/org/nkjmlab/sorm4j/typed/package.html create mode 100644 src/test/java/org/nkjmlab/sorm4j/internal/mapping/OrmOptionsImplTest.java create mode 100644 src/test/java/org/nkjmlab/sorm4j/sql/ParameterizedSqlTest.java create mode 100644 src/test/java/org/nkjmlab/sorm4j/sql/SqlKeywordTest.java create mode 100644 src/test/java/org/nkjmlab/sorm4j/sql/schema/TableSchemaTest.java rename src/test/java/org/nkjmlab/sorm4j/{ => typed}/TypedOrmConnectionTest.java (77%) diff --git a/src/main/java/org/nkjmlab/sorm4j/OrmConnection.java b/src/main/java/org/nkjmlab/sorm4j/OrmConnection.java index 831f70ef..8c127ce3 100644 --- a/src/main/java/org/nkjmlab/sorm4j/OrmConnection.java +++ b/src/main/java/org/nkjmlab/sorm4j/OrmConnection.java @@ -1,10 +1,12 @@ package org.nkjmlab.sorm4j; +import org.nkjmlab.sorm4j.annotation.Experimental; import org.nkjmlab.sorm4j.sql.NamedParameterQuery; import org.nkjmlab.sorm4j.sql.NamedParameterRequest; import org.nkjmlab.sorm4j.sql.OrderedParameterQuery; import org.nkjmlab.sorm4j.sql.OrderedParameterRequest; import org.nkjmlab.sorm4j.sql.SelectQuery; +import org.nkjmlab.sorm4j.typed.TypedOrmConnection; /** * Main API for object relation mapping. The api consists of {@link OrmReader}, {@link OrmUpdater}, @@ -68,6 +70,7 @@ public interface OrmConnection extends OrmReader, OrmUpdater, OrmMapReader, SqlE * @param objectClass * @return */ + @Experimental TypedOrmConnection type(Class objectClass); /** diff --git a/src/main/java/org/nkjmlab/sorm4j/OrmTransaction.java b/src/main/java/org/nkjmlab/sorm4j/OrmTransaction.java index c7105b54..cccd704e 100644 --- a/src/main/java/org/nkjmlab/sorm4j/OrmTransaction.java +++ b/src/main/java/org/nkjmlab/sorm4j/OrmTransaction.java @@ -1,5 +1,7 @@ package org.nkjmlab.sorm4j; +import org.nkjmlab.sorm4j.typed.TypedOrmTransaction; + /** * An transaction with object relation mapping. * diff --git a/src/main/java/org/nkjmlab/sorm4j/Sorm.java b/src/main/java/org/nkjmlab/sorm4j/Sorm.java index 3f752de4..eb8e0b46 100644 --- a/src/main/java/org/nkjmlab/sorm4j/Sorm.java +++ b/src/main/java/org/nkjmlab/sorm4j/Sorm.java @@ -12,16 +12,6 @@ */ public interface Sorm { - /** - * Accepts a {@link TypedOrmConnection} handler for a task with object-relation mapping. The - * - * connection will be closed after the process of handler. - * - * @param - * @param objectClass - * @param handler - */ - void accept(Class objectClass, ConsumerHandler> handler); /** * Accepts a {@link OrmConnection} handler for a task with object-relation mapping. The connection @@ -39,21 +29,6 @@ public interface Sorm { */ void acceptJdbcConnectionHandler(ConsumerHandler handler); - /** - * Accepts a {@link TypedOrmTransaction} handler for a task with object-relation mapping. The - * transaction will be closed after the process of handler. - * - * The transaction will be committed and the connection will be closed after the process of - * handler. When the transaction throws a exception, the transaction will be rollback. - * - * - * @param - * @param objectClass - * @param handler - */ - void acceptTransactionHandler(Class objectClass, - ConsumerHandler> handler); - /** * Accepts a {@link OrmTransaction} handler for a task with object-relation mapping. * @@ -64,17 +39,6 @@ void acceptTransactionHandler(Class objectClass, */ void acceptTransactionHandler(ConsumerHandler handler); - /** - * Applies a {@link TypedOrmConnection} handler for a task with object-relation mapping and gets - * the result. The connection will be closed after the process of handler. - * - * @param - * @param - * @param objectClass - * @param handler - * @return - */ - R apply(Class objectClass, FunctionHandler, R> handler); /** * Applies a {@link OrmConnection} handler for a task with object-relation mapping and gets the @@ -96,21 +60,7 @@ void acceptTransactionHandler(Class objectClass, */ R applyJdbcConnectionHandler(FunctionHandler handler); - /** - * Applies a {@link TypedOrmTransaction} handler for a task with object-relation mapping and gets - * the result. - * - * The transaction will be committed and the connection will be closed after the process of - * handler. When the transaction throws a exception, the transaction will be rollback. - * - * @param - * @param - * @param objectClass - * @param handler - * @return - */ - R applyTransactionHandler(Class objectClass, - FunctionHandler, R> handler); + /** * Applies a {@link OrmTransaction} handler for a task with object-relation mapping and gets the @@ -181,14 +131,6 @@ R applyTransactionHandler(Class objectClass, */ OrmConnection openConnection(); - /** - * Open {@link TypedOrmConnection}. You should always use try-with-resources to ensure the - * database connection is released. We recommend using {@link #accept(Class, ConsumerHandler)} or - * {@link #apply(Class, FunctionHandler)} . - * - * @return - */ - TypedOrmConnection openConnection(Class objectClass); /** * Open {@link OrmTransaction}. You should always use try-with-resources to ensure the database @@ -202,20 +144,5 @@ R applyTransactionHandler(Class objectClass, */ OrmTransaction openTransaction(); - /** - * Open {@link TypedOrmTransaction}. You should always use try-with-resources to ensure the - * database connection is released. We recommend using - * {@link #acceptTransactionHandler(Class, ConsumerHandler)} or - * {@link #applyTransactionHandler(Class, FunctionHandler)}. Default transaction level is - * {@link Connection#TRANSACTION_READ_COMMITTED}. - * - * Note: the transaction is automatically rollback if the transaction is not committed. - * - * @param - * @param objectClass - * @return - */ - TypedOrmTransaction openTransaction(Class objectClass); - } diff --git a/src/main/java/org/nkjmlab/sorm4j/SormFactory.java b/src/main/java/org/nkjmlab/sorm4j/SormFactory.java index f64cafda..f1b58b57 100644 --- a/src/main/java/org/nkjmlab/sorm4j/SormFactory.java +++ b/src/main/java/org/nkjmlab/sorm4j/SormFactory.java @@ -11,6 +11,7 @@ import org.nkjmlab.sorm4j.internal.mapping.OrmConnectionImpl; import org.nkjmlab.sorm4j.internal.mapping.SormImpl; import org.nkjmlab.sorm4j.internal.mapping.TypedOrmConnectionImpl; +import org.nkjmlab.sorm4j.typed.TypedOrmConnection; /** * Main entry point of this library. It creates {@link Sorm} object. diff --git a/src/main/java/org/nkjmlab/sorm4j/internal/mapping/ConfigStore.java b/src/main/java/org/nkjmlab/sorm4j/internal/mapping/ConfigStore.java index dba339b6..219ab48f 100644 --- a/src/main/java/org/nkjmlab/sorm4j/internal/mapping/ConfigStore.java +++ b/src/main/java/org/nkjmlab/sorm4j/internal/mapping/ConfigStore.java @@ -59,7 +59,7 @@ public ConfigStore(String cacheName, Map options, this.multiRowSize = multiRowSize; this.batchSizeWithMultiRow = batchSizeWithMultiRow; this.options = options; - SormOptions _options = new OrmOptionsImpl(options); + SormOptions _options = new SormOptionsImpl(options); this.multiRowProcessorFactory = MultiRowProcessorFactory.createMultiRowProcessorFactory(_options, sqlParametersSetter, multiRowProcessorType, batchSize, multiRowSize, batchSizeWithMultiRow); diff --git a/src/main/java/org/nkjmlab/sorm4j/internal/mapping/OrmConnectionImpl.java b/src/main/java/org/nkjmlab/sorm4j/internal/mapping/OrmConnectionImpl.java index 38e137bb..a2ee8a8b 100644 --- a/src/main/java/org/nkjmlab/sorm4j/internal/mapping/OrmConnectionImpl.java +++ b/src/main/java/org/nkjmlab/sorm4j/internal/mapping/OrmConnectionImpl.java @@ -17,7 +17,6 @@ import org.nkjmlab.sorm4j.OrmConnection; import org.nkjmlab.sorm4j.RowMapper; import org.nkjmlab.sorm4j.SormException; -import org.nkjmlab.sorm4j.TypedOrmConnection; import org.nkjmlab.sorm4j.extension.ResultSetConverter; import org.nkjmlab.sorm4j.extension.SormLogger; import org.nkjmlab.sorm4j.extension.SormOptions; @@ -35,11 +34,12 @@ import org.nkjmlab.sorm4j.sql.NamedParameterRequest; import org.nkjmlab.sorm4j.sql.OrderedParameterQuery; import org.nkjmlab.sorm4j.sql.OrderedParameterRequest; -import org.nkjmlab.sorm4j.sql.SelectQuery; import org.nkjmlab.sorm4j.sql.ParameterizedSql; +import org.nkjmlab.sorm4j.sql.SelectQuery; import org.nkjmlab.sorm4j.sql.tuple.Tuple2; import org.nkjmlab.sorm4j.sql.tuple.Tuple3; import org.nkjmlab.sorm4j.sql.tuple.Tuples; +import org.nkjmlab.sorm4j.typed.TypedOrmConnection; /** * A database connection with object-relation mapping function. The main class for the ORMapper diff --git a/src/main/java/org/nkjmlab/sorm4j/internal/mapping/SormImpl.java b/src/main/java/org/nkjmlab/sorm4j/internal/mapping/SormImpl.java index c32098a4..7f3a758e 100644 --- a/src/main/java/org/nkjmlab/sorm4j/internal/mapping/SormImpl.java +++ b/src/main/java/org/nkjmlab/sorm4j/internal/mapping/SormImpl.java @@ -11,9 +11,8 @@ import org.nkjmlab.sorm4j.OrmTransaction; import org.nkjmlab.sorm4j.Sorm; import org.nkjmlab.sorm4j.SormFactory; -import org.nkjmlab.sorm4j.TypedOrmConnection; -import org.nkjmlab.sorm4j.TypedOrmTransaction; import org.nkjmlab.sorm4j.internal.util.Try; +import org.nkjmlab.sorm4j.typed.TypedOrmTransaction; /** * An entry point of object-relation mapping. @@ -40,21 +39,6 @@ public OrmTransaction openTransaction() { return new OrmTransactionImpl(getJdbcConnection(), configStore); } - @Override - public TypedOrmTransaction openTransaction(Class objectClass) { - return new TypedOrmTransactionImpl<>(objectClass, - new OrmTransactionImpl(getJdbcConnection(), configStore)); - } - - - @Override - public R apply(Class objectClass, FunctionHandler, R> handler) { - try (TypedOrmConnection conn = openConnection(objectClass)) { - return handler.apply(conn); - } catch (Exception e) { - throw Try.rethrow(e); - } - } @Override public R apply(FunctionHandler handler) { @@ -65,18 +49,6 @@ public R apply(FunctionHandler handler) { } } - @Override - public R applyTransactionHandler(Class objectClass, - FunctionHandler, R> handler) { - try (TypedOrmTransaction transaction = openTransaction(objectClass)) { - R ret = handler.apply(transaction); - transaction.commit(); - return ret; - } catch (Exception e) { - throw Try.rethrow(e); - } - } - @Override @@ -117,12 +89,6 @@ public OrmConnection openConnection() { - @Override - public TypedOrmConnection openConnection(Class objectClass) { - return new TypedOrmConnectionImpl(objectClass, - new OrmConnectionImpl(getJdbcConnection(), configStore)); - } - @Override public DataSource getDataSource() { return this.dataSource; @@ -138,16 +104,6 @@ public Connection getJdbcConnection() { } - @Override - public void accept(Class objectClass, ConsumerHandler> handler) { - try (TypedOrmConnection conn = openConnection(objectClass)) { - try { - handler.accept(conn); - } catch (Exception e) { - throw Try.rethrow(e); - } - } - } @Override public void accept(ConsumerHandler handler) { @@ -158,17 +114,6 @@ public void accept(ConsumerHandler handler) { } } - @Override - public void acceptTransactionHandler(Class objectClass, - ConsumerHandler> handler) { - try (TypedOrmTransaction transaction = openTransaction(objectClass)) { - handler.accept(transaction); - transaction.commit(); - } catch (Exception e) { - throw Try.rethrow(e); - } - } - @Override diff --git a/src/main/java/org/nkjmlab/sorm4j/internal/mapping/OrmOptionsImpl.java b/src/main/java/org/nkjmlab/sorm4j/internal/mapping/SormOptionsImpl.java similarity index 78% rename from src/main/java/org/nkjmlab/sorm4j/internal/mapping/OrmOptionsImpl.java rename to src/main/java/org/nkjmlab/sorm4j/internal/mapping/SormOptionsImpl.java index 96a6c0c6..fb5861a8 100644 --- a/src/main/java/org/nkjmlab/sorm4j/internal/mapping/OrmOptionsImpl.java +++ b/src/main/java/org/nkjmlab/sorm4j/internal/mapping/SormOptionsImpl.java @@ -4,10 +4,10 @@ import java.util.Map; import org.nkjmlab.sorm4j.extension.SormOptions; -public class OrmOptionsImpl implements SormOptions { +public class SormOptionsImpl implements SormOptions { private final Map options; - public OrmOptionsImpl(Map options) { + public SormOptionsImpl(Map options) { this.options = new HashMap<>(options); } diff --git a/src/main/java/org/nkjmlab/sorm4j/internal/mapping/TypedOrmConnectionImpl.java b/src/main/java/org/nkjmlab/sorm4j/internal/mapping/TypedOrmConnectionImpl.java index 38f7eba9..6d0f1888 100644 --- a/src/main/java/org/nkjmlab/sorm4j/internal/mapping/TypedOrmConnectionImpl.java +++ b/src/main/java/org/nkjmlab/sorm4j/internal/mapping/TypedOrmConnectionImpl.java @@ -9,7 +9,6 @@ import org.nkjmlab.sorm4j.FunctionHandler; import org.nkjmlab.sorm4j.OrmConnection; import org.nkjmlab.sorm4j.RowMapper; -import org.nkjmlab.sorm4j.TypedOrmConnection; import org.nkjmlab.sorm4j.internal.sql.NamedParameterQueryImpl; import org.nkjmlab.sorm4j.internal.sql.OrderedParameterQueryImpl; import org.nkjmlab.sorm4j.internal.sql.QueryTypedOrmExecutor; @@ -20,8 +19,9 @@ import org.nkjmlab.sorm4j.sql.NamedParameterRequest; import org.nkjmlab.sorm4j.sql.OrderedParameterQuery; import org.nkjmlab.sorm4j.sql.OrderedParameterRequest; -import org.nkjmlab.sorm4j.sql.SelectQuery; import org.nkjmlab.sorm4j.sql.ParameterizedSql; +import org.nkjmlab.sorm4j.sql.SelectQuery; +import org.nkjmlab.sorm4j.typed.TypedOrmConnection; /** * A database connection with object-relation mapping function with type. The main class for the diff --git a/src/main/java/org/nkjmlab/sorm4j/internal/sql/ParameterizedSqlImpl.java b/src/main/java/org/nkjmlab/sorm4j/internal/sql/ParameterizedSqlImpl.java index 6cd3f8e2..f594037f 100644 --- a/src/main/java/org/nkjmlab/sorm4j/internal/sql/ParameterizedSqlImpl.java +++ b/src/main/java/org/nkjmlab/sorm4j/internal/sql/ParameterizedSqlImpl.java @@ -95,7 +95,7 @@ private static ParameterizedSql parseListPlaceholder(String sql, Object[] parame private static int getSize(Object object) { if (object instanceof Collection) { - return ((Collection) object).size(); + return ((Collection) object).size(); } else if (object.getClass().isArray()) { return Array.getLength(object); } else { @@ -152,5 +152,4 @@ public String getBindedSql() { return sql; } - } diff --git a/src/main/java/org/nkjmlab/sorm4j/internal/sql/QueryExecutor.java b/src/main/java/org/nkjmlab/sorm4j/internal/sql/QueryExecutor.java index 500a719b..0d6f02c8 100644 --- a/src/main/java/org/nkjmlab/sorm4j/internal/sql/QueryExecutor.java +++ b/src/main/java/org/nkjmlab/sorm4j/internal/sql/QueryExecutor.java @@ -1,9 +1,9 @@ package org.nkjmlab.sorm4j.internal.sql; import java.util.List; -import org.nkjmlab.sorm4j.TypedOrmReader; import org.nkjmlab.sorm4j.sql.LazyResultSet; import org.nkjmlab.sorm4j.sql.ParameterizedSql; +import org.nkjmlab.sorm4j.typed.TypedOrmReader; public interface QueryExecutor { /** diff --git a/src/main/java/org/nkjmlab/sorm4j/internal/sql/QueryTypedOrmExecutor.java b/src/main/java/org/nkjmlab/sorm4j/internal/sql/QueryTypedOrmExecutor.java index 2a2e5dc6..37b31cd5 100644 --- a/src/main/java/org/nkjmlab/sorm4j/internal/sql/QueryTypedOrmExecutor.java +++ b/src/main/java/org/nkjmlab/sorm4j/internal/sql/QueryTypedOrmExecutor.java @@ -1,9 +1,9 @@ package org.nkjmlab.sorm4j.internal.sql; import java.util.List; -import org.nkjmlab.sorm4j.TypedOrmReader; import org.nkjmlab.sorm4j.sql.LazyResultSet; import org.nkjmlab.sorm4j.sql.ParameterizedSql; +import org.nkjmlab.sorm4j.typed.TypedOrmReader; public class QueryTypedOrmExecutor implements QueryExecutor { diff --git a/src/main/java/org/nkjmlab/sorm4j/internal/util/MethodInvoker.java b/src/main/java/org/nkjmlab/sorm4j/internal/util/MethodInvoker.java index bff59101..b11fb42b 100644 --- a/src/main/java/org/nkjmlab/sorm4j/internal/util/MethodInvoker.java +++ b/src/main/java/org/nkjmlab/sorm4j/internal/util/MethodInvoker.java @@ -18,21 +18,15 @@ public MethodInvoker() {} */ public static String getSummary(int depth, String label) { StackTraceElement e = getStackTraceElement(depth); - return dateTimeFormatter.format(LocalDateTime.now()) + " " + String.format("%5s", label) - + " [" + Thread.currentThread().getName() + "] " + getInvokerClassName(e) + "." + return dateTimeFormatter.format(LocalDateTime.now()) + " " + String.format("%5s", label) + " [" + + Thread.currentThread().getName() + "] " + getInvokerClassName(e) + "." + getInvokerMethodName(e) + "(" + getInvokerFileName(e) + ":" + getInvokerLineNumber(e) + ")"; } private static StackTraceElement getStackTraceElement(int index) { StackTraceElement[] stackTrace = new Throwable().getStackTrace(); - if (index < 0) { - return stackTrace[0]; - } else if (index >= stackTrace.length) { - return stackTrace[stackTrace.length - 1]; - } else { - return stackTrace[index]; - } + return stackTrace[Math.max(Math.min(index, stackTrace.length - 1), 0)]; } private static String getInvokerClassName(StackTraceElement e) { @@ -50,4 +44,4 @@ private static String getInvokerFileName(StackTraceElement e) { private static int getInvokerLineNumber(StackTraceElement e) { return e.getLineNumber(); } -} \ No newline at end of file +} diff --git a/src/main/java/org/nkjmlab/sorm4j/sql/ParameterizedSql.java b/src/main/java/org/nkjmlab/sorm4j/sql/ParameterizedSql.java index f3ddf54b..e49530af 100644 --- a/src/main/java/org/nkjmlab/sorm4j/sql/ParameterizedSql.java +++ b/src/main/java/org/nkjmlab/sorm4j/sql/ParameterizedSql.java @@ -34,12 +34,12 @@ public interface ParameterizedSql { @Experimental - static ParameterizedSql parseAsOrdered(String sql, Object... orderedParameters) { + static ParameterizedSql parse(String sql, Object... orderedParameters) { return OrderedParameterSql.parse(sql, orderedParameters); } @Experimental - static ParameterizedSql parseAsNamed(String sql, Map namedParameters) { + static ParameterizedSql parse(String sql, Map namedParameters) { return NamedParameterSql.parse(sql, namedParameters); } diff --git a/src/main/java/org/nkjmlab/sorm4j/sql/SelectBuilder.java b/src/main/java/org/nkjmlab/sorm4j/sql/SelectBuilder.java index eae7da53..8ac74f7f 100644 --- a/src/main/java/org/nkjmlab/sorm4j/sql/SelectBuilder.java +++ b/src/main/java/org/nkjmlab/sorm4j/sql/SelectBuilder.java @@ -2,6 +2,7 @@ import java.util.Arrays; import java.util.stream.Collectors; +import org.nkjmlab.sorm4j.annotation.Experimental; import org.nkjmlab.sorm4j.internal.sql.SelectBuilderImpl; @@ -11,6 +12,7 @@ * @author nkjm * */ +@Experimental public interface SelectBuilder extends ParameterizedSqlParser { /** diff --git a/src/main/java/org/nkjmlab/sorm4j/sql/SqlKeyword.java b/src/main/java/org/nkjmlab/sorm4j/sql/SqlKeyword.java new file mode 100644 index 00000000..05c7322c --- /dev/null +++ b/src/main/java/org/nkjmlab/sorm4j/sql/SqlKeyword.java @@ -0,0 +1,79 @@ +package org.nkjmlab.sorm4j.sql; + +import org.nkjmlab.sorm4j.annotation.Experimental; + +/** + * + * @author nkjm + * @see SQL reserved words - + * Wikipedia + */ +@Experimental +public interface SqlKeyword { + + public static final String ALL = wrapSpace("ALL"); + public static final String AND = wrapSpace("AND"); + public static final String ANY = wrapSpace("ANY"); + public static final String AS = wrapSpace("AS"); + public static final String AUTHORIZATION = wrapSpace("AUTHORIZATION"); + public static final String CASE = wrapSpace("CASE"); + public static final String CHECK = wrapSpace("CHECK"); + public static final String COLLATE = wrapSpace("COLLATE"); + public static final String COLUMN = wrapSpace("COLUMN"); + public static final String CONSTRAINT = wrapSpace("CONSTRAINT"); + public static final String CREATE = wrapSpace("CREATE"); + public static final String CROSS = wrapSpace("CROSS"); + public static final String CURRENT_DATE = wrapSpace("CURRENT_DATE"); + public static final String CURRENT_TIME = wrapSpace("CURRENT_TIME"); + public static final String CURRENT_TIMESTAMP = wrapSpace("CURRENT_TIMESTAMP"); + public static final String CURRENT_USER = wrapSpace("CURRENT_USER"); + public static final String DEFAULT = wrapSpace("DEFAULT"); + public static final String DISTINCT = wrapSpace("DISTINCT"); + public static final String ELSE = wrapSpace("ELSE"); + public static final String END = wrapSpace("END"); + public static final String EXCEPT = wrapSpace("EXCEPT"); + public static final String FETCH = wrapSpace("FETCH"); + public static final String FOR = wrapSpace("FOR"); + public static final String FOREIGN = wrapSpace("FOREIGN"); + public static final String FROM = wrapSpace("FROM"); + public static final String FULL = wrapSpace("FULL"); + public static final String GRANT = wrapSpace("GRANT"); + public static final String GROUP = wrapSpace("GROUP"); + public static final String HAVING = wrapSpace("HAVING"); + public static final String IN = wrapSpace("IN"); + public static final String INNER = wrapSpace("INNER"); + public static final String INTERSECT = wrapSpace("INTERSECT"); + public static final String INTO = wrapSpace("INTO"); + public static final String IS = wrapSpace("IS"); + public static final String JOIN = wrapSpace("JOIN"); + public static final String LEFT = wrapSpace("LEFT"); + public static final String LIKE = wrapSpace("LIKE"); + public static final String NOT = wrapSpace("NOT"); + public static final String NULL = wrapSpace("NULL"); + public static final String ON = wrapSpace("ON"); + public static final String OR = wrapSpace("OR"); + public static final String ORDER = wrapSpace("ORDER"); + public static final String OUTER = wrapSpace("OUTER"); + public static final String PRIMARY = wrapSpace("PRIMARY"); + public static final String REFERENCES = wrapSpace("REFERENCES"); + public static final String RIGHT = wrapSpace("RIGHT"); + public static final String SELECT = wrapSpace("SELECT"); + public static final String SESSION_USER = wrapSpace("SESSION_USER"); + public static final String SOME = wrapSpace("SOME"); + public static final String TABLE = wrapSpace("TABLE"); + public static final String TABLESAMPLE = wrapSpace("TABLESAMPLE"); + public static final String THEN = wrapSpace("THEN"); + public static final String TO = wrapSpace("TO"); + public static final String UNION = wrapSpace("UNION"); + public static final String UNIQUE = wrapSpace("UNIQUE"); + public static final String USER = wrapSpace("USER"); + public static final String WHEN = wrapSpace("WHEN"); + public static final String WHERE = wrapSpace("WHERE"); + public static final String WITH = wrapSpace("WITH"); + + static String wrapSpace(String str) { + return " " + str + " "; + } + + +} diff --git a/src/main/java/org/nkjmlab/sorm4j/sql/schema/TableSchema.java b/src/main/java/org/nkjmlab/sorm4j/sql/schema/TableSchema.java new file mode 100644 index 00000000..b986c194 --- /dev/null +++ b/src/main/java/org/nkjmlab/sorm4j/sql/schema/TableSchema.java @@ -0,0 +1,193 @@ +package org.nkjmlab.sorm4j.sql.schema; + +import static org.nkjmlab.sorm4j.sql.schema.TableSchema.GrammarUtils.*; +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; +import org.nkjmlab.sorm4j.annotation.Experimental; + +@Experimental +public abstract class TableSchema { + + private final String name; + private final Map columnDefinitions; + private final List uniqueColumnPairs; + private String[] primaryKeys; + + + public TableSchema(String name) { + this.name = name; + this.columnDefinitions = new LinkedHashMap<>(); + this.uniqueColumnPairs = new ArrayList<>(); + } + + /** + * Adds an unique constraint. + * + *

+ * For example, + * + *

+   * addUniqueConstraint("id","name")  converted to "UNIQUE (id, name)"
+   * 
+ * + * @param columnName + * @param dataTypeAndOptions + */ + protected void addColumnDefinition(String columnName, String... dataTypeAndOptions) { + columnDefinitions.put(columnName, dataTypeAndOptions); + } + + /** + * Adds an unique constraint. + * + *

+ * For example, + * + *

+   * addUniqueConstraint("id","name")  converted to "UNIQUE (id, name)"
+   * 
+ * + * @param uniqueColumnPair + */ + protected void addUniqueConstraint(String... uniqueColumnPair) { + uniqueColumnPairs.add(uniqueColumnPair); + } + + public List getColumnNames() { + return TableSchemaGrammar.getColumunNames(columnDefinitions); + } + + public String getName() { + return name; + } + + /** + * Gets a table schema. + * + * @return + */ + + public String getTableSchema() { + return TableSchemaGrammar.getTableSchema(getName(), columnDefinitions, primaryKeys, + uniqueColumnPairs); + } + + public String getIndexSchema(String... columns) { + final String indexName = "index_" + name + "_" + String.join("_", columns); + return IndexSchemaGrammar.createIndexOn(indexName, name, columns); + } + + /** + * Sets attributes as primary key attributes. + * + *

+ * For example, + * + *

+   * setPrimaryKey("id","name")  converted to "PRIMARY KEY (id, name)"
+   * 
+ * + * @param attributes + */ + protected void setPrimaryKey(String... attributes) { + this.primaryKeys = attributes; + } + + protected static interface GrammarUtils { + public static String joinCommaAndSpace(String... elements) { + return String.join(", ", elements); + } + + public static String joinSpace(String... elements) { + return String.join(" ", elements); + } + + public static String joinCommaAndSpace(List elements) { + return String.join(", ", elements); + } + + public static String wrapParentheses(String str) { + return "(" + str + ")"; + } + + } + protected static class IndexSchemaGrammar { + private static String createIndexOn(String indexName, String tableName, String... columns) { + return "create index if not exists " + indexName + " on " + tableName + + wrapParentheses(joinCommaAndSpace(columns)); + } + } + protected static interface TableSchemaGrammar { + + + private static String createPrimaryKeyConstraint(String[] primaryKeys) { + if (primaryKeys == null || primaryKeys.length == 0) { + return ""; + } + return ", primary key" + wrapParentheses(joinCommaAndSpace(primaryKeys)); + } + + private static String createUniqueConstraint(List uniqueColumnPairs) { + if (uniqueColumnPairs == null || uniqueColumnPairs.size() == 0) { + return ""; + } + return ", " + joinCommaAndSpace(uniqueColumnPairs.stream() + .map(u -> "unique" + wrapParentheses(joinCommaAndSpace(u))).toArray(String[]::new)); + } + + + private static List getColumunNames(Map columnDefinitions) { + return columnDefinitions.entrySet().stream().map(e -> e.getKey()) + .collect(Collectors.toList()); + } + + + private static String getTableSchema(String tableName, Map columns, + String[] primaryKeys, List uniqueColumnPairs) { + String schema = tableName + wrapParentheses(joinCommaAndSpace(getColumuns(columns)) + + createPrimaryKeyConstraint(primaryKeys) + createUniqueConstraint(uniqueColumnPairs)); + return schema; + } + + + + private static List getColumuns(Map columnDefinisions) { + return columnDefinisions.keySet().stream() + .map(columnName -> columnName + " " + joinSpace(columnDefinisions.get(columnName))) + .collect(Collectors.toList()); + } + + + + } + protected static interface TableSchemaKeyword { + + /** Data type **/ + public static final String VARCHAR = "VARCHAR"; + public static final String CHAR = "CHAR"; + public static final String DATE = "DATE"; + public static final String TIME = "TIME"; + public static final String TIMESTAMP = "TIMESTAMP"; + public static final String TIMESTAMP_AS_CURRENT_TIMESTAMP = "TIMESTAMP AS CURRENT_TIMESTAMP"; + public static final String REAL = "REAL"; + public static final String DOUBLE = "DOUBLE"; + public static final String BIGINT = "BIGINT"; + public static final String INT = "INT"; + public static final String BOOLEAN = "BOOLEAN"; + public static final String DECIMAL = "DECIMAL"; + public static final String TINYINT = "TINYINT"; + public static final String SMALLINT = "SMALLINT"; + public static final String IDENTITY = "IDENTITY"; + + /** Constraint and misc **/ + public static final String UNIQUE = "UNIQUE"; + public static final String NOT_NULL = "NOT NULL"; + public static final String PRIMARY_KEY = "PRIMARY KEY"; + public static final String AUTO_INCREMENT = "AUTO_INCREMENT"; + + } + +} diff --git a/src/main/java/org/nkjmlab/sorm4j/TypedOrmConnection.java b/src/main/java/org/nkjmlab/sorm4j/typed/TypedOrmConnection.java similarity index 85% rename from src/main/java/org/nkjmlab/sorm4j/TypedOrmConnection.java rename to src/main/java/org/nkjmlab/sorm4j/typed/TypedOrmConnection.java index e6b9195a..1c80615b 100644 --- a/src/main/java/org/nkjmlab/sorm4j/TypedOrmConnection.java +++ b/src/main/java/org/nkjmlab/sorm4j/typed/TypedOrmConnection.java @@ -1,5 +1,10 @@ -package org.nkjmlab.sorm4j; +package org.nkjmlab.sorm4j.typed; +import org.nkjmlab.sorm4j.OrmConnection; +import org.nkjmlab.sorm4j.OrmMapReader; +import org.nkjmlab.sorm4j.ResultSetMapMapper; +import org.nkjmlab.sorm4j.SqlExecutor; +import org.nkjmlab.sorm4j.TransactionFunction; import org.nkjmlab.sorm4j.annotation.Experimental; import org.nkjmlab.sorm4j.sql.NamedParameterQuery; import org.nkjmlab.sorm4j.sql.NamedParameterRequest; diff --git a/src/main/java/org/nkjmlab/sorm4j/TypedOrmReader.java b/src/main/java/org/nkjmlab/sorm4j/typed/TypedOrmReader.java similarity index 95% rename from src/main/java/org/nkjmlab/sorm4j/TypedOrmReader.java rename to src/main/java/org/nkjmlab/sorm4j/typed/TypedOrmReader.java index 8a624709..08805d1a 100644 --- a/src/main/java/org/nkjmlab/sorm4j/TypedOrmReader.java +++ b/src/main/java/org/nkjmlab/sorm4j/typed/TypedOrmReader.java @@ -1,4 +1,4 @@ -package org.nkjmlab.sorm4j; +package org.nkjmlab.sorm4j.typed; import java.sql.PreparedStatement; import java.util.List; diff --git a/src/main/java/org/nkjmlab/sorm4j/TypedOrmTransaction.java b/src/main/java/org/nkjmlab/sorm4j/typed/TypedOrmTransaction.java similarity index 78% rename from src/main/java/org/nkjmlab/sorm4j/TypedOrmTransaction.java rename to src/main/java/org/nkjmlab/sorm4j/typed/TypedOrmTransaction.java index fa471721..72f01b94 100644 --- a/src/main/java/org/nkjmlab/sorm4j/TypedOrmTransaction.java +++ b/src/main/java/org/nkjmlab/sorm4j/typed/TypedOrmTransaction.java @@ -1,4 +1,6 @@ -package org.nkjmlab.sorm4j; +package org.nkjmlab.sorm4j.typed; + +import org.nkjmlab.sorm4j.OrmTransaction; /** * An transaction with typed object relation mapping. diff --git a/src/main/java/org/nkjmlab/sorm4j/TypedOrmUpdater.java b/src/main/java/org/nkjmlab/sorm4j/typed/TypedOrmUpdater.java similarity index 94% rename from src/main/java/org/nkjmlab/sorm4j/TypedOrmUpdater.java rename to src/main/java/org/nkjmlab/sorm4j/typed/TypedOrmUpdater.java index d5dec485..ae71121b 100644 --- a/src/main/java/org/nkjmlab/sorm4j/TypedOrmUpdater.java +++ b/src/main/java/org/nkjmlab/sorm4j/typed/TypedOrmUpdater.java @@ -1,4 +1,4 @@ -package org.nkjmlab.sorm4j; +package org.nkjmlab.sorm4j.typed; import java.util.List; import org.nkjmlab.sorm4j.sql.InsertResult; diff --git a/src/main/java/org/nkjmlab/sorm4j/TypedResultSetMapper.java b/src/main/java/org/nkjmlab/sorm4j/typed/TypedResultSetMapper.java similarity index 88% rename from src/main/java/org/nkjmlab/sorm4j/TypedResultSetMapper.java rename to src/main/java/org/nkjmlab/sorm4j/typed/TypedResultSetMapper.java index 9ac6010c..3a028b52 100644 --- a/src/main/java/org/nkjmlab/sorm4j/TypedResultSetMapper.java +++ b/src/main/java/org/nkjmlab/sorm4j/typed/TypedResultSetMapper.java @@ -1,4 +1,4 @@ -package org.nkjmlab.sorm4j; +package org.nkjmlab.sorm4j.typed; import java.sql.ResultSet; import java.util.List; diff --git a/src/main/java/org/nkjmlab/sorm4j/typed/package.html b/src/main/java/org/nkjmlab/sorm4j/typed/package.html new file mode 100644 index 00000000..a00c7698 --- /dev/null +++ b/src/main/java/org/nkjmlab/sorm4j/typed/package.html @@ -0,0 +1,7 @@ + + +

+ (Non-public API) Package for core of typed connection. +

+ + diff --git a/src/test/java/org/nkjmlab/sorm4j/OrmConnectionTest.java b/src/test/java/org/nkjmlab/sorm4j/OrmConnectionTest.java index 15369336..9636273e 100644 --- a/src/test/java/org/nkjmlab/sorm4j/OrmConnectionTest.java +++ b/src/test/java/org/nkjmlab/sorm4j/OrmConnectionTest.java @@ -24,6 +24,7 @@ import org.nkjmlab.sorm4j.sql.ParameterizedSql; import org.nkjmlab.sorm4j.sql.tuple.Tuple2; import org.nkjmlab.sorm4j.sql.tuple.Tuple3; +import org.nkjmlab.sorm4j.typed.TypedOrmTransaction; class OrmConnectionTest { @@ -34,6 +35,17 @@ void setUp() { sorm = SormTestUtils.createSormAndDropAndCreateTableAll(); } + @Test + void testApplyPreparedStatementHandler() { + sorm.accept(conn -> { + conn.acceptPreparedStatementHandler( + ParameterizedSql.parse("select * from guests where id=?", 1), pstmt -> pstmt.execute()); + conn.applyPreparedStatementHandler( + ParameterizedSql.parse("select * from guests where id=?", 1), pstmt -> pstmt.execute()); + }); + + } + @Test void testJoin() { SormLogger.on(); @@ -510,7 +522,8 @@ void testReadAllLazy() { .isEqualTo(a.getName()); }); sorm.accept(m -> { - Map map = m.readMapList(ParameterizedSql.from("select * from players")).get(0); + Map map = + m.readMapList(ParameterizedSql.from("select * from players")).get(0); assertThat(map.get("NAME") != null ? map.get("NAME") : map.get("name")) .isEqualTo(a.getName()); }); @@ -557,10 +570,11 @@ void testReadList() { Player b = SormTestUtils.PLAYER_BOB; m.insert(a, b); assertThat(m.readList(Player.class, "select * from players")).contains(a, b); - assertThat(m.readList(Player.class, ParameterizedSql.from("select * from players"))).contains(a, - b); - assertThat(m.readOne(Player.class, - OrderedParameterSql.parse("select * from players where id=?", 1))).isEqualTo(a); + assertThat(m.readList(Player.class, ParameterizedSql.from("select * from players"))) + .contains(a, b); + assertThat( + m.readOne(Player.class, OrderedParameterSql.parse("select * from players where id=?", 1))) + .isEqualTo(a); assertThat(m.readOne(Player.class, "select * from players where id=?", 1)).isEqualTo(a); @@ -575,8 +589,8 @@ void testReadOne() { Guest b = SormTestUtils.GUEST_BOB; m.insert(a); m.insert(b); - Guest g = m.readOne(Guest.class, - OrderedParameterSql.parse("select * from guests where id=?", 1)); + Guest g = + m.readOne(Guest.class, OrderedParameterSql.parse("select * from guests where id=?", 1)); assertThat(g.getAddress()).isEqualTo(a.getAddress()); assertThat(g.getName()).isEqualTo(a.getName()); g = m.readOne(Guest.class, ParameterizedSql.from("select * from guests")); @@ -616,17 +630,17 @@ void testTransactionLevel() { b -> b.setTransactionIsolationLevel(Connection.TRANSACTION_SERIALIZABLE)); try { - sorm.createWith("isole").acceptTransactionHandler(Guest.class, m -> { + sorm.createWith("isole").acceptTransactionHandler(m -> { }); failBecauseExceptionWasNotThrown(Exception.class); } catch (Exception e) { assertThat(e.getMessage()).contains("is not registered"); } - sorm.createWith("isolev").acceptTransactionHandler(Guest.class, m -> { + sorm.createWith("isolev").acceptTransactionHandler(m -> { assertThat(m.getJdbcConnection().getTransactionIsolation()) .isEqualTo(Connection.TRANSACTION_SERIALIZABLE); }); - sorm.acceptTransactionHandler(Guest.class, m -> { + sorm.acceptTransactionHandler(m -> { assertThat(m.getJdbcConnection().getTransactionIsolation()) .isEqualTo(Connection.TRANSACTION_READ_COMMITTED); }); diff --git a/src/test/java/org/nkjmlab/sorm4j/SormFactoryTest.java b/src/test/java/org/nkjmlab/sorm4j/SormFactoryTest.java index 9dba833f..f3bbc533 100644 --- a/src/test/java/org/nkjmlab/sorm4j/SormFactoryTest.java +++ b/src/test/java/org/nkjmlab/sorm4j/SormFactoryTest.java @@ -6,6 +6,7 @@ import org.nkjmlab.sorm4j.common.Guest; import org.nkjmlab.sorm4j.common.Player; import org.nkjmlab.sorm4j.common.SormTestUtils; +import org.nkjmlab.sorm4j.typed.TypedOrmConnection; class SormFactoryTest { @@ -22,8 +23,10 @@ void testToOrmConnectionConnectionClassOfTString() { Sorm sorm = SormTestUtils.createSormAndDropAndCreateTableAll(); TypedOrmConnection orm = SormFactory.toOrmConnection(sorm.getJdbcConnection(), Guest.class, SormFactory.DEFAULT_CONFIG_NAME); - orm.type(Guest.class).insert(GUEST_ALICE); + orm.insert(GUEST_ALICE); assertThat(orm.untype().readOne(Integer.class, "select count(*) from guests")).isEqualTo(1); + + } @Test diff --git a/src/test/java/org/nkjmlab/sorm4j/SormTest.java b/src/test/java/org/nkjmlab/sorm4j/SormTest.java index b593bfde..fa7ee848 100644 --- a/src/test/java/org/nkjmlab/sorm4j/SormTest.java +++ b/src/test/java/org/nkjmlab/sorm4j/SormTest.java @@ -9,6 +9,7 @@ import org.mockito.Mockito; import org.nkjmlab.sorm4j.common.Guest; import org.nkjmlab.sorm4j.common.SormTestUtils; +import org.nkjmlab.sorm4j.typed.TypedOrmTransaction; class SormTest { @@ -72,7 +73,7 @@ void testException1() throws SQLException { } catch (Exception e) { } try { - sormImpl.apply(Guest.class, con -> { + sormImpl.apply(con -> { return 1; }); failBecauseExceptionWasNotThrown(Exception.class); @@ -86,7 +87,7 @@ void testException1() throws SQLException { } catch (Exception e) { } try { - sormImpl.applyTransactionHandler(Guest.class, con -> { + sormImpl.applyTransactionHandler(con -> { return 1; }); failBecauseExceptionWasNotThrown(Exception.class); @@ -105,7 +106,7 @@ void testException1() throws SQLException { } catch (Exception e) { } try { - sormImpl.accept(Guest.class, con -> { + sormImpl.accept(con -> { }); failBecauseExceptionWasNotThrown(Exception.class); } catch (Exception e) { @@ -117,7 +118,7 @@ void testException1() throws SQLException { } catch (Exception e) { } try { - sormImpl.acceptTransactionHandler(Guest.class, con -> { + sormImpl.acceptTransactionHandler(con -> { }); failBecauseExceptionWasNotThrown(Exception.class); } catch (Exception e) { @@ -157,7 +158,7 @@ void testRunTransactionConsumerOfOrmTransaction() { @Test void testRunTransactionClassOfTConsumerOfTypedOrmTransactionOfT() { - try (TypedOrmTransaction tr = sorm.openTransaction(Guest.class)) { + try (TypedOrmTransaction tr = sorm.openTransaction().type(Guest.class)) { tr.insert(a); tr.rollback(); tr.commit(); diff --git a/src/test/java/org/nkjmlab/sorm4j/extension/DefaultTableNameMapperTest.java b/src/test/java/org/nkjmlab/sorm4j/extension/DefaultTableNameMapperTest.java index 7516d92f..6a8ccfcb 100644 --- a/src/test/java/org/nkjmlab/sorm4j/extension/DefaultTableNameMapperTest.java +++ b/src/test/java/org/nkjmlab/sorm4j/extension/DefaultTableNameMapperTest.java @@ -19,13 +19,14 @@ static void setUp() { @Test void testToValidTableName() { - sorm.accept(Guest.class, m -> { - assertThat(new DefaultTableNameMapper().getTableName("guests", - m.getJdbcConnection().getMetaData())).isEqualTo(new TableName("GUESTS")); + sorm.accept(m -> { + assertThat( + new DefaultTableNameMapper().getTableName("guests", m.getJdbcConnection().getMetaData())) + .isEqualTo(new TableName("GUESTS")); }); try { - sorm.accept(Guest.class, m -> { + sorm.accept(m -> { new DefaultTableNameMapper().getTableName("aaa", m.getJdbcConnection().getMetaData()); failBecauseExceptionWasNotThrown(Exception.class); }); @@ -36,7 +37,7 @@ void testToValidTableName() { @Test void testGetTableName() { - sorm.accept(Guest.class, m -> { + sorm.accept(m -> { TableName name = new DefaultTableNameMapper().getTableName(Guest.class, m.getJdbcConnection().getMetaData()); assertThat(name).isEqualTo(new TableName("GUESTS")); diff --git a/src/test/java/org/nkjmlab/sorm4j/internal/mapping/OrmOptionsImplTest.java b/src/test/java/org/nkjmlab/sorm4j/internal/mapping/OrmOptionsImplTest.java new file mode 100644 index 00000000..da1d7d53 --- /dev/null +++ b/src/test/java/org/nkjmlab/sorm4j/internal/mapping/OrmOptionsImplTest.java @@ -0,0 +1,22 @@ +package org.nkjmlab.sorm4j.internal.mapping; + +import static org.assertj.core.api.Assertions.*; +import java.util.Map; +import org.junit.jupiter.api.Test; +import org.nkjmlab.sorm4j.extension.SormOptions; + +class OrmOptionsImplTest { + + SormOptions opts = new SormOptionsImpl(Map.of("db", "h2")); + + @Test + void testGet() { + assertThat(opts.get("db")).isEqualTo("h2"); + } + + @Test + void testGetOrDefault() { + assertThat(opts.getOrDefault("dbname", 1)).isEqualTo(1); + } + +} diff --git a/src/test/java/org/nkjmlab/sorm4j/internal/mapping/TableMappingTest.java b/src/test/java/org/nkjmlab/sorm4j/internal/mapping/TableMappingTest.java index 9870d528..549aa249 100644 --- a/src/test/java/org/nkjmlab/sorm4j/internal/mapping/TableMappingTest.java +++ b/src/test/java/org/nkjmlab/sorm4j/internal/mapping/TableMappingTest.java @@ -7,8 +7,8 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.mockito.Mockito; +import org.nkjmlab.sorm4j.OrmConnection; import org.nkjmlab.sorm4j.Sorm; -import org.nkjmlab.sorm4j.TypedOrmConnection; import org.nkjmlab.sorm4j.common.Guest; import org.nkjmlab.sorm4j.common.Player; import org.nkjmlab.sorm4j.common.SormTestUtils; @@ -24,7 +24,7 @@ void setUp() { @Test void testGetValue() { try { - sorm.accept(Guest.class, m -> { + sorm.accept(m -> { TableMapping tm = getTableMapping(m, Guest.class); Guest g = new Guest(); tm.getValue(g, tm.getAccessor(g, "hoge")); @@ -34,7 +34,7 @@ void testGetValue() { } try { - sorm.accept(Guest.class, m -> { + sorm.accept(m -> { TableMapping tm = getTableMapping(m, Guest.class); String s = new String(); tm.getValue(s, tm.getAccessor(s, "id")); @@ -51,7 +51,7 @@ void testInsertAndGetEx() throws SQLException { Mockito.doThrow(new SQLException("Mock exception")).when(conMock) .prepareStatement(Mockito.anyString(), Mockito.any(String[].class)); try { - sorm.accept(Guest.class, m -> { + sorm.accept(m -> { Guest a = SormTestUtils.GUEST_ALICE; TableMapping tm = getTableMapping(m, Guest.class); tm.insertAndGet(conMock, a); @@ -64,7 +64,7 @@ void testInsertAndGetEx() throws SQLException { @Test void testSetValue() { try { - sorm.accept(Guest.class, m -> { + sorm.accept(m -> { TableMapping tm = getTableMapping(m, Guest.class); tm.setValue(new Guest(), "hoge", 0); }); @@ -72,7 +72,7 @@ void testSetValue() { assertThat(e.getMessage()).contains("does not have a corresponding"); } try { - sorm.accept(Guest.class, m -> { + sorm.accept(m -> { TableMapping tm = getTableMapping(m, Guest.class); tm.setValue(new Guest(), "id", "String"); }); @@ -80,7 +80,7 @@ void testSetValue() { assertThat(e.getMessage()).contains("Could not set a value"); } try { - sorm.accept(Player.class, m -> { + sorm.accept(m -> { TableMapping tm = getTableMapping(m, Player.class); tm.setValue(new Player(), "name", 1); }); @@ -91,22 +91,21 @@ void testSetValue() { @Test void testCol() { - sorm.accept(Guest.class, m -> { + sorm.accept(m -> { assertThat(getTableMapping(m, Guest.class).getSql().getColumns()) .containsAll(List.of("ID", "NAME", "ADDRESS")); }); - sorm.accept(Guest.class, m -> { + sorm.accept(m -> { assertThat(getTableMapping(m, Guest.class).getSql().getPrimaryKeys()) .containsAll(List.of("ID")); }); - sorm.accept(Guest.class, m -> { + sorm.accept(m -> { assertThat(getTableMapping(m, Guest.class).toString()).contains("Mapping"); }); } - public static TableMapping getTableMapping(TypedOrmConnection conn, - Class objectClass) { - return ((OrmConnectionImpl) conn.untype()).getTableMapping(objectClass); + public static TableMapping getTableMapping(OrmConnection conn, Class objectClass) { + return ((OrmConnectionImpl) conn).getTableMapping(objectClass); } } diff --git a/src/test/java/org/nkjmlab/sorm4j/internal/mapping/multirow/BatchOfMultiRowInOneStatementProcessorTest.java b/src/test/java/org/nkjmlab/sorm4j/internal/mapping/multirow/BatchOfMultiRowInOneStatementProcessorTest.java index 9bcadf0a..f18c5106 100644 --- a/src/test/java/org/nkjmlab/sorm4j/internal/mapping/multirow/BatchOfMultiRowInOneStatementProcessorTest.java +++ b/src/test/java/org/nkjmlab/sorm4j/internal/mapping/multirow/BatchOfMultiRowInOneStatementProcessorTest.java @@ -9,7 +9,6 @@ import org.junit.jupiter.api.Test; import org.nkjmlab.sorm4j.Sorm; import org.nkjmlab.sorm4j.SormFactory; -import org.nkjmlab.sorm4j.common.Guest; import org.nkjmlab.sorm4j.common.Player; import org.nkjmlab.sorm4j.common.SormTestUtils; import org.nkjmlab.sorm4j.extension.Configurator; @@ -50,19 +49,19 @@ void setUpEach() { @Test void testMultiRowInsert() { - sorm.accept(Player.class, conn -> conn.insert(a, b)); + sorm.accept(conn -> conn.insert(a, b)); } @Test void testMultiRowInsertNull() { try { - sorm.accept(Player.class, conn -> conn.insert(a, b, c, a)); + sorm.accept(conn -> conn.insert(a, b, c, a)); failBecauseExceptionWasNotThrown(Exception.class); } catch (Exception e) { assertThat(e.getMessage()).contains("Unique index or primary key violation"); } try { - sorm.accept(Player.class, conn -> conn.insert(a, b, null)); + sorm.accept(conn -> conn.insert(a, b, null)); failBecauseExceptionWasNotThrown(Exception.class); } catch (Exception e) { assertThat(e.getMessage()).contains("Fail to get value from"); @@ -71,13 +70,13 @@ void testMultiRowInsertNull() { @Test void testMultiRowInsertMany() { - sorm.accept(Guest.class, conn -> conn + sorm.accept(conn -> conn .insert(Stream.generate(() -> GUEST_ALICE).limit(3000).collect(Collectors.toList()))); } @Test void testMultiRowMerge() { - sorm.accept(Player.class, conn -> conn + sorm.accept(conn -> conn .merge(Stream.generate(() -> PLAYER_ALICE).limit(3000).collect(Collectors.toList()))); } diff --git a/src/test/java/org/nkjmlab/sorm4j/internal/mapping/multirow/MultiRowInOneStatementProcessorTest.java b/src/test/java/org/nkjmlab/sorm4j/internal/mapping/multirow/MultiRowInOneStatementProcessorTest.java index c79aba07..24a7cc1c 100644 --- a/src/test/java/org/nkjmlab/sorm4j/internal/mapping/multirow/MultiRowInOneStatementProcessorTest.java +++ b/src/test/java/org/nkjmlab/sorm4j/internal/mapping/multirow/MultiRowInOneStatementProcessorTest.java @@ -36,19 +36,19 @@ void setUpEach() { @Test void testMultiRowInsert() { - sorm.accept(Player.class, conn -> conn.insert(a, b)); + sorm.accept(conn -> conn.insert(a, b)); } @Test void testMultiRowInsertNull() { try { - sorm.accept(Player.class, conn -> conn.insert(a, b, c, a)); + sorm.accept(conn -> conn.insert(a, b, c, a)); failBecauseExceptionWasNotThrown(Exception.class); } catch (Exception e) { assertThat(e.getMessage()).contains("Unique index or primary key violation"); } try { - sorm.accept(Player.class, conn -> conn.insert(a, b, null)); + sorm.accept(conn -> conn.insert(a, b, null)); failBecauseExceptionWasNotThrown(Exception.class); } catch (Exception e) { assertThat(e.getMessage()).contains("Fail to get value from"); @@ -57,13 +57,13 @@ void testMultiRowInsertNull() { @Test void testMultiRowInsertMany() { - sorm.accept(Guest.class, conn -> conn + sorm.accept(conn -> conn .insert(Stream.generate(() -> GUEST_ALICE).limit(3000).collect(Collectors.toList()))); } @Test void testMultiRowMerge() { - sorm.accept(Player.class, conn -> conn + sorm.accept(conn -> conn .merge(Stream.generate(() -> PLAYER_ALICE).limit(3000).collect(Collectors.toList()))); } diff --git a/src/test/java/org/nkjmlab/sorm4j/internal/mapping/multirow/OrmConfigStoreTest.java b/src/test/java/org/nkjmlab/sorm4j/internal/mapping/multirow/OrmConfigStoreTest.java index f34b36a6..00edf191 100644 --- a/src/test/java/org/nkjmlab/sorm4j/internal/mapping/multirow/OrmConfigStoreTest.java +++ b/src/test/java/org/nkjmlab/sorm4j/internal/mapping/multirow/OrmConfigStoreTest.java @@ -82,7 +82,7 @@ void testConfig() { Sorm sormImpl = SormTestUtils.createSorm(); SormTestUtils.dropAndCreateTableAll(sormImpl); - sormImpl.accept(Guest.class, con -> con.insert(new Guest[0])); + sormImpl.accept(con -> con.insert(new Guest[0])); sormImpl = SormFactory.create(jdbcUrl, user, password); diff --git a/src/test/java/org/nkjmlab/sorm4j/internal/mapping/multirow/SimpleBatchProcessorTest.java b/src/test/java/org/nkjmlab/sorm4j/internal/mapping/multirow/SimpleBatchProcessorTest.java index 158d0f42..d51dad46 100644 --- a/src/test/java/org/nkjmlab/sorm4j/internal/mapping/multirow/SimpleBatchProcessorTest.java +++ b/src/test/java/org/nkjmlab/sorm4j/internal/mapping/multirow/SimpleBatchProcessorTest.java @@ -39,7 +39,7 @@ void testSetUp() { @Test void testMultiRowInsert() { - sorm.accept(Player.class, conn -> conn.insert(PLAYER_ALICE, PLAYER_BOB)); + sorm.accept(conn -> conn.insert(PLAYER_ALICE, PLAYER_BOB)); sorm.acceptTransactionHandler(tr -> { try { tr.insert(PLAYER_ALICE, null); @@ -54,13 +54,13 @@ void testMultiRowInsert() { @Test void testMultiRowInsertMany() { - sorm.accept(Guest.class, conn -> conn + sorm.accept(conn -> conn .insert(Stream.generate(() -> GUEST_ALICE).limit(1000).collect(Collectors.toList()))); } @Test void testMultiRowMerge() { - sorm.accept(Player.class, conn -> conn + sorm.accept(conn -> conn .merge(Stream.generate(() -> PLAYER_ALICE).limit(3000).collect(Collectors.toList()))); } diff --git a/src/test/java/org/nkjmlab/sorm4j/internal/util/MethodInvokerTest.java b/src/test/java/org/nkjmlab/sorm4j/internal/util/MethodInvokerTest.java index ab2a0d5c..fd952e75 100644 --- a/src/test/java/org/nkjmlab/sorm4j/internal/util/MethodInvokerTest.java +++ b/src/test/java/org/nkjmlab/sorm4j/internal/util/MethodInvokerTest.java @@ -7,6 +7,7 @@ class MethodInvokerTest { @Test void testGetSummary() { + assertThat(MethodInvoker.getSummary(0, "DEBUG")).contains("MethodInvoker"); assertThat(MethodInvoker.getSummary(2, "DEBUG")).contains("testGetSummary"); } diff --git a/src/test/java/org/nkjmlab/sorm4j/internal/util/StringUtilsTest.java b/src/test/java/org/nkjmlab/sorm4j/internal/util/StringUtilsTest.java index 9bc3df41..9307217e 100644 --- a/src/test/java/org/nkjmlab/sorm4j/internal/util/StringUtilsTest.java +++ b/src/test/java/org/nkjmlab/sorm4j/internal/util/StringUtilsTest.java @@ -5,7 +5,8 @@ import org.junit.jupiter.api.Test; class StringUtilsTest { - private static final org.slf4j.Logger log = org.nkjmlab.sorm4j.internal.util.LoggerFactory.getLogger(); + private static final org.slf4j.Logger log = + org.nkjmlab.sorm4j.internal.util.LoggerFactory.getLogger(); @Test void testContainsIgnoreCase() { @@ -17,4 +18,10 @@ void testInvoker() { assertThat(log.getName()).contains(StringUtils.class.getSimpleName()); } + @Test + void testFormat() { + assertThat(StringUtils.format("{}")).isEqualTo("{}"); + assertThat(StringUtils.format("{}", null)).isEqualTo("{}"); + } + } diff --git a/src/test/java/org/nkjmlab/sorm4j/internal/util/TryTest.java b/src/test/java/org/nkjmlab/sorm4j/internal/util/TryTest.java index e2bc66db..5aff9d46 100644 --- a/src/test/java/org/nkjmlab/sorm4j/internal/util/TryTest.java +++ b/src/test/java/org/nkjmlab/sorm4j/internal/util/TryTest.java @@ -5,6 +5,14 @@ class TryTest { + @Test + void testGetOrDefault() { + String s = Try.getOrDefault(() -> { + throw new RuntimeException("error"); + }, "test"); + assertThat(s).isEqualTo("test"); + } + @Test void testCreateRunnable() { try { diff --git a/src/test/java/org/nkjmlab/sorm4j/sql/NamedParametersQueryImplTest.java b/src/test/java/org/nkjmlab/sorm4j/sql/NamedParametersQueryImplTest.java index 04aae793..ddec1223 100644 --- a/src/test/java/org/nkjmlab/sorm4j/sql/NamedParametersQueryImplTest.java +++ b/src/test/java/org/nkjmlab/sorm4j/sql/NamedParametersQueryImplTest.java @@ -20,11 +20,10 @@ void testBeforeEach() { @Test void testToSqlStatement() { - sorm.accept(Player.class, con -> { + sorm.accept(con -> { con.insert(PLAYER_ALICE); - ParameterizedSql ret = - con.createNamedParameterQuery("select * from players where id=:id and name=:name") - .parse(); + ParameterizedSql ret = con.type(Player.class) + .createNamedParameterQuery("select * from players where id=:id and name=:name").parse(); assertThat(ret.getSql()).isEqualTo( ParameterizedSql.from("select * from players where id=:id and name=:name").getSql()); }); @@ -38,11 +37,11 @@ void testToSqlStatement() { @Test void testBindAll() { - sorm.accept(Player.class, con -> { + sorm.accept(con -> { con.insert(PLAYER_ALICE); - Player ret = - con.createNamedParameterQuery("select * from players where id=:id and name=:name") - .bindAll(Map.of("id", 1, "name", "Alice")).readOne(); + Player ret = con.type(Player.class) + .createNamedParameterQuery("select * from players where id=:id and name=:name") + .bindAll(Map.of("id", 1, "name", "Alice")).readOne(); assertThat(ret).isEqualTo(PLAYER_ALICE); }); sorm.accept(con -> { @@ -56,10 +55,11 @@ void testBindAll() { @Test void testBind() { - sorm.accept(Player.class, con -> { + sorm.accept(con -> { con.insert(PLAYER_ALICE); - Player ret = con.createNamedParameterQuery("select * from players where id=:id").bind("id", 1) - .readFirst(); + Player ret = + con.type(Player.class).createNamedParameterQuery("select * from players where id=:id") + .bind("id", 1).readFirst(); assertThat(ret).isEqualTo(PLAYER_ALICE); }); sorm.accept(con -> { diff --git a/src/test/java/org/nkjmlab/sorm4j/sql/OrderedParametersQueryTest.java b/src/test/java/org/nkjmlab/sorm4j/sql/OrderedParametersQueryTest.java index e54b78b6..cb15bc6c 100644 --- a/src/test/java/org/nkjmlab/sorm4j/sql/OrderedParametersQueryTest.java +++ b/src/test/java/org/nkjmlab/sorm4j/sql/OrderedParametersQueryTest.java @@ -19,16 +19,17 @@ void testBeforeEach() { @Test void testAddObjectArray() { - sorm.accept(Player.class, conn -> { + sorm.accept(conn -> { conn.insert(PLAYER_ALICE); - Player ret = conn.createOrderedParameterQuery("select * from PLAYERS where ID=?").addParameter(1) - .readList().get(0); + Player ret = + conn.type(Player.class).createOrderedParameterQuery("select * from PLAYERS where ID=?") + .addParameter(1).readList().get(0); assertThat(ret).isEqualTo(PLAYER_ALICE); }); sorm.accept(conn -> { Player ret = - conn.createOrderedParameterQuery(Player.class, "select * from PLAYERS where ID=?").addParameter(1) - .readList().get(0); + conn.createOrderedParameterQuery(Player.class, "select * from PLAYERS where ID=?") + .addParameter(1).readList().get(0); assertThat(ret).isEqualTo(PLAYER_ALICE); }); } diff --git a/src/test/java/org/nkjmlab/sorm4j/sql/ParameterizedSqlTest.java b/src/test/java/org/nkjmlab/sorm4j/sql/ParameterizedSqlTest.java new file mode 100644 index 00000000..ceb62795 --- /dev/null +++ b/src/test/java/org/nkjmlab/sorm4j/sql/ParameterizedSqlTest.java @@ -0,0 +1,46 @@ +package org.nkjmlab.sorm4j.sql; + +import static org.assertj.core.api.Assertions.*; +import java.util.List; +import java.util.Map; +import org.junit.jupiter.api.Test; +import org.nkjmlab.sorm4j.internal.util.SqlUtils; + +class ParameterizedSqlTest { + + @Test + void testLietral() { + assertThat(SqlUtils.literal(List.of("a", "b"))).isEqualTo("'a', 'b'"); + assertThat(SqlUtils.literal(null)).isEqualTo("null"); + assertThat(SqlUtils.literal("?")).isEqualTo("?"); + assertThat(SqlUtils.literal("test")).isEqualTo("'test'"); + } + + @Test + void testParseAsOrdered() { + assertThat(ParameterizedSql.literal("hi, my name's tim.")).isEqualTo("'hi, my name''s tim.'"); + + String sql = "select * from guest where id=?"; + Object[] params = {1}; + ParameterizedSql ps = ParameterizedSql.parse(sql, params); + assertThat(ps.getSql()).isEqualTo(sql); + assertThat(ps.getParameters()).isEqualTo(params); + } + + @Test + void testParseAsNamed() { + String sql = "select * from guest where id=:id"; + Map map = Map.of("id", 1); + ParameterizedSql ps = ParameterizedSql.parse(sql, map); + + String sql1 = "select * from guest where id=?"; + Object[] params = {1}; + assertThat(ps.getSql()).isEqualTo(sql1); + assertThat(ps.getParameters()).isEqualTo(params); + + assertThat(ps.getBindedSql()).contains("select * from guest where id=1"); + assertThat(ps.toString()).contains("sql=[select * from guest where id=?], parameters=[1]"); + + } + +} diff --git a/src/test/java/org/nkjmlab/sorm4j/sql/SelectBuilderTest.java b/src/test/java/org/nkjmlab/sorm4j/sql/SelectBuilderTest.java index 2cd4b3f0..e0ac4352 100644 --- a/src/test/java/org/nkjmlab/sorm4j/sql/SelectBuilderTest.java +++ b/src/test/java/org/nkjmlab/sorm4j/sql/SelectBuilderTest.java @@ -1,32 +1,23 @@ package org.nkjmlab.sorm4j.sql; import static org.assertj.core.api.Assertions.*; +import static org.nkjmlab.sorm4j.sql.ParameterizedSql.*; import static org.nkjmlab.sorm4j.sql.SelectBuilder.*; import static org.nkjmlab.sorm4j.sql.SelectBuilder.as; -import static org.nkjmlab.sorm4j.sql.ParameterizedSql.*; import org.junit.jupiter.api.Test; import org.nkjmlab.sorm4j.Sorm; import org.nkjmlab.sorm4j.common.Guest; import org.nkjmlab.sorm4j.common.SormTestUtils; -import org.nkjmlab.sorm4j.internal.util.SqlUtils; class SelectBuilderTest { - @Test - void testSqlStatement() { - assertThat(ParameterizedSql.literal("hi, my name's tim.")).isEqualTo("'hi, my name''s tim.'"); - assertThat(SqlUtils.literal(null)).isEqualTo("null"); - assertThat(SqlUtils.literal("?")).isEqualTo("?"); - assertThat(SqlUtils.literal("test")).isEqualTo("'test'"); - - } @Test void testBuildSorm() { Sorm sormImpl = SormTestUtils.createSorm(); SormTestUtils.dropAndCreateTableAll(sormImpl); - sormImpl.accept(Guest.class, con -> { - String sql = SelectBuilder.create().from(con.getTableName()).buildSql(); + sormImpl.accept(con -> { + String sql = SelectBuilder.create().from(con.type(Guest.class).getTableName()).buildSql(); assertThat(sql).contains("select * from GUESTS"); }); diff --git a/src/test/java/org/nkjmlab/sorm4j/sql/SelectQueryTest.java b/src/test/java/org/nkjmlab/sorm4j/sql/SelectQueryTest.java index 63ce4ed6..f6b1a5c6 100644 --- a/src/test/java/org/nkjmlab/sorm4j/sql/SelectQueryTest.java +++ b/src/test/java/org/nkjmlab/sorm4j/sql/SelectQueryTest.java @@ -19,13 +19,13 @@ class SelectQueryTest { @BeforeEach void testBeforeEach() { this.sorm = SormTestUtils.createSormAndDropAndCreateTableAll(); - sorm.accept(Player.class, con -> con.insert(SormTestUtils.PLAYER_ALICE)); + sorm.accept(con -> con.insert(SormTestUtils.PLAYER_ALICE)); } @Test void testExecBindQuery() { - sorm.accept(Player.class, - con -> assertThat(con.createSelectQuery().where("id=:id").bind("id", 1).readLazy().one()) + sorm.accept(con -> assertThat( + con.type(Player.class).createSelectQuery().where("id=:id").bind("id", 1).readLazy().one()) .isEqualTo(PLAYER_ALICE)); sorm.accept(con -> assertThat( con.createSelectQuery(Player.class).where("id=:id").bind("id", 1).readLazy().one()) @@ -36,38 +36,36 @@ void testExecBindQuery() { .bind("id", 1).readLazy().one()).isEqualTo(PLAYER_ALICE)); sorm.accept(con -> assertThat( - con.createOrderedParameterQuery(Player.class, "select * from players where id=?").addParameter(1) - .readLazy().one()).isEqualTo(PLAYER_ALICE)); + con.createOrderedParameterQuery(Player.class, "select * from players where id=?") + .addParameter(1).readLazy().one()).isEqualTo(PLAYER_ALICE)); } @Test void testExecBindAllQuery() { - sorm.accept(Player.class, - con -> assertThat( - con.createSelectQuery().where("id=:id").bindAll(Map.of("id", 1)).readLazy().one()) - .isEqualTo(PLAYER_ALICE)); + sorm.accept(con -> assertThat(con.type(Player.class).createSelectQuery().where("id=:id") + .bindAll(Map.of("id", 1)).readLazy().one()).isEqualTo(PLAYER_ALICE)); } @Test void testExecAddQuery() { - sorm.accept(Player.class, - con -> assertThat(con.createSelectQuery().where("id=?").addParameter(1).readLazy().one()) + sorm.accept(con -> assertThat( + con.type(Player.class).createSelectQuery().where("id=?").addParameter(1).readLazy().one()) .isEqualTo(PLAYER_ALICE)); } @Test void testExecAddAllQuery() { - sorm.accept(Player.class, - con -> assertThat(con.createSelectQuery().where(and("id=?", "name=?")) + sorm.accept( + con -> assertThat(con.type(Player.class).createSelectQuery().where(and("id=?", "name=?")) .addParameter(PLAYER_ALICE.getId(), PLAYER_ALICE.getName()).readLazy().one()) .isEqualTo(PLAYER_ALICE)); } @Test void testSelectQueryCond() { - sorm.accept(Guest.class, con -> { - SelectQuery builder = con.createSelectQuery(); + sorm.accept(con -> { + SelectQuery builder = con.type(Guest.class).createSelectQuery(); builder.orderBy(order("id", "asc")); builder.having("avg(age)>100"); assertThat(builder.toString()) @@ -87,8 +85,8 @@ void testSelectQueryCond() { @Test void testCompareSelectBuilderAndSelectQuery() { - sorm.accept(Guest.class, con -> { - SelectQuery builder = con.createSelectQuery(); + sorm.accept(con -> { + SelectQuery builder = con.type(Guest.class).createSelectQuery(); builder.select(as("avg(AGE)", "AVERAGE_AGE"), "TEAM"); builder.where(or(and("ID>100", "COUNTRY IN (?)"), "YEAR>2001")); builder.groupBy("TEAM"); diff --git a/src/test/java/org/nkjmlab/sorm4j/sql/SqlKeywordTest.java b/src/test/java/org/nkjmlab/sorm4j/sql/SqlKeywordTest.java new file mode 100644 index 00000000..84fea375 --- /dev/null +++ b/src/test/java/org/nkjmlab/sorm4j/sql/SqlKeywordTest.java @@ -0,0 +1,22 @@ +package org.nkjmlab.sorm4j.sql; + +import static org.assertj.core.api.Assertions.*; +import static org.nkjmlab.sorm4j.sql.SqlKeyword.*; +import java.util.List; +import org.junit.jupiter.api.Test; + + +class SqlKeywordTest { + + @Test + void test() { + List l = List.of(ALL, AND, ANY, AS, AUTHORIZATION, CASE, CHECK, COLLATE, COLUMN, + CONSTRAINT, CREATE, CROSS, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, + DEFAULT, DISTINCT, ELSE, END, EXCEPT, FETCH, FOR, FOREIGN, FROM, FULL, GRANT, GROUP, HAVING, + IN, INNER, INTERSECT, INTO, IS, JOIN, LEFT, LIKE, NOT, NULL, ON, OR, ORDER, OUTER, PRIMARY, + REFERENCES, RIGHT, SELECT, SESSION_USER, SOME, TABLE, TABLESAMPLE, THEN, TO, UNION, UNIQUE, + USER, WHEN, WHERE, WITH); + assertThat(l); + } + +} diff --git a/src/test/java/org/nkjmlab/sorm4j/sql/schema/TableSchemaTest.java b/src/test/java/org/nkjmlab/sorm4j/sql/schema/TableSchemaTest.java new file mode 100644 index 00000000..30a56ad5 --- /dev/null +++ b/src/test/java/org/nkjmlab/sorm4j/sql/schema/TableSchemaTest.java @@ -0,0 +1,53 @@ +package org.nkjmlab.sorm4j.sql.schema; + +import static org.assertj.core.api.Assertions.*; +import static org.nkjmlab.sorm4j.sql.schema.TableSchema.TableSchemaKeyword.*; +import org.junit.jupiter.api.Test; + +class TableSchemaTest { + + private static GuestTable guestTable = new GuestTable(); + + private static class GuestTable extends TableSchema { + + private static String ID = "id"; + private static String NAME = "name"; + private static String TEL = "tel"; + + public GuestTable() { + super("guests"); + addColumnDefinition(ID, INT); + addColumnDefinition(NAME, VARCHAR); + addColumnDefinition(TEL, VARCHAR); + addUniqueConstraint(TEL); + setPrimaryKey(ID); + } + + } + + + @Test + void testGetColumnNames() { + assertThat(guestTable.getColumnNames()).contains(GuestTable.ID, GuestTable.NAME, + GuestTable.TEL); + } + + @Test + void testGetName() { + assertThat(guestTable.getName()).isEqualToIgnoringCase("guests"); + } + + @Test + void testGetTableSchema() { + assertThat(guestTable.getTableSchema()).isEqualToIgnoringCase( + "guests(id int, name varchar, tel varchar, primary key(id), unique(tel))"); + } + + @Test + void testGetIndexSchema() { + assertThat(guestTable.getIndexSchema(GuestTable.TEL)) + .isEqualToIgnoringCase("CREATE INDEX IF NOT EXISTS index_guests_tel ON guests(tel)"); + } + + +} diff --git a/src/test/java/org/nkjmlab/sorm4j/TypedOrmConnectionTest.java b/src/test/java/org/nkjmlab/sorm4j/typed/TypedOrmConnectionTest.java similarity index 77% rename from src/test/java/org/nkjmlab/sorm4j/TypedOrmConnectionTest.java rename to src/test/java/org/nkjmlab/sorm4j/typed/TypedOrmConnectionTest.java index d346d572..e1f1a577 100644 --- a/src/test/java/org/nkjmlab/sorm4j/TypedOrmConnectionTest.java +++ b/src/test/java/org/nkjmlab/sorm4j/typed/TypedOrmConnectionTest.java @@ -1,4 +1,4 @@ -package org.nkjmlab.sorm4j; +package org.nkjmlab.sorm4j.typed; import static org.assertj.core.api.Assertions.*; import static org.junit.jupiter.api.Assertions.fail; @@ -13,6 +13,10 @@ import javax.sql.DataSource; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.nkjmlab.sorm4j.OrmConnection; +import org.nkjmlab.sorm4j.Sorm; +import org.nkjmlab.sorm4j.SormException; +import org.nkjmlab.sorm4j.SormFactory; import org.nkjmlab.sorm4j.common.Guest; import org.nkjmlab.sorm4j.common.Location; import org.nkjmlab.sorm4j.common.Player; @@ -36,36 +40,35 @@ void setUp() { void testOrderedRequest() { AtomicInteger id = new AtomicInteger(10); - int row = sorm.apply(Player.class, + int row = sorm.apply( conn -> conn.createNamedParameterRequest("insert into players values(:id, :name, :address)") .bindAll(Map.of("id", id.incrementAndGet(), "name", "Frank", "address", "Tokyo")) .executeUpdate()); assertThat(row).isEqualTo(1); - row = sorm.apply(Player.class, - conn -> conn.createOrderedParameterRequest("insert into players values(?,?,?)") - .addParameter(id.incrementAndGet()).addParameter("Frank").addParameter("Tokyo") - .executeUpdate()); + row = sorm.apply(conn -> conn.createOrderedParameterRequest("insert into players values(?,?,?)") + .addParameter(id.incrementAndGet()).addParameter("Frank").addParameter("Tokyo") + .executeUpdate()); assertThat(row).isEqualTo(1); - List ret1 = sorm.apply(Player.class, conn -> conn - .executeQuery(ParameterizedSql.from("select * from players"), (rs, rn) -> conn.mapRow(rs))); + List ret1 = sorm.apply(conn -> conn.type(Player.class).executeQuery( + ParameterizedSql.from("select * from players"), (rs, rn) -> conn.mapRow(Player.class, rs))); assertThat(ret1.size()).isEqualTo(2); - ret1 = sorm.apply(Player.class, conn -> conn - .executeQuery(ParameterizedSql.from("select * from players"), rs -> conn.mapRowList(rs))); + ret1 = sorm.apply(conn -> conn.type(Player.class).executeQuery( + ParameterizedSql.from("select * from players"), rs -> conn.mapRowList(Player.class, rs))); assertThat(ret1.size()).isEqualTo(2); - List> ret2 = sorm.apply(Player.class, conn -> conn - .executeQuery(ParameterizedSql.from("select * from players"), rs -> conn.mapRowsToMapList(rs))); + List> ret2 = + sorm.apply(conn -> conn.executeQuery(ParameterizedSql.from("select * from players"), + rs -> conn.mapRowsToMapList(rs))); assertThat(ret2.size()).isEqualTo(2); - ret2 = sorm.apply(Player.class, - conn -> conn.executeQuery(ParameterizedSql.from("select * from players"), - (rs, rowNum) -> conn.mapRowToMap(rs))); + ret2 = sorm.apply(conn -> conn.executeQuery(ParameterizedSql.from("select * from players"), + (rs, rowNum) -> conn.mapRowToMap(rs))); assertThat(ret2.size()).isEqualTo(2); @@ -86,26 +89,27 @@ void testException() { @Test void testMerge() { - sorm.accept(Guest.class, m -> { + sorm.accept(m -> { // nodate int[] g = m.merge(new Guest[] {}); assertThat(g.length).isEqualTo(0); }); // merge one objects - sorm.accept(Player.class, m -> { + sorm.accept(m -> { int g = m.merge(PLAYER_ALICE); assertThat(g).isEqualTo(1); }); // merge two objects - sorm.accept(Player.class, m -> { + sorm.accept(m -> { int[] g = m.merge(PLAYER_ALICE, PLAYER_BOB); assertThat(g[0]).isEqualTo(2); }); // merge with list and check result - sorm.accept(Player.class, m -> { + sorm.accept(conn -> { + TypedOrmConnection m = conn.type(Player.class); Player c = new Player(PLAYER_ALICE.getId(), "UPDATED", "UPDATED"); m.merge(List.of(c)); assertThat(m.readAll().size()).isEqualTo(2); @@ -113,7 +117,7 @@ void testMerge() { }); try { // merge will be fail because of having auto generated keys. - sorm.accept(Guest.class, m -> { + sorm.accept(m -> { m.merge(GUEST_ALICE, GUEST_BOB); failBecauseExceptionWasNotThrown(SormException.class); }); @@ -127,7 +131,8 @@ void testMerge() { @Test void testMergeOn() { // only exec test. - sorm.accept(Player.class, m -> { + sorm.accept(conn -> { + TypedOrmConnection m = conn.type(Player.class); m.mergeOn("players1", PLAYER_ALICE); m.mergeOn("players1", PLAYER_ALICE, PLAYER_BOB); m.mergeOn("players1", List.of(PLAYER_ALICE, PLAYER_BOB)); @@ -140,21 +145,22 @@ void testMergeOn() { @Test void testTableName() { // table name - sorm.accept(Guest.class, m -> { + sorm.accept(conn -> { + TypedOrmConnection m = conn.type(Guest.class); assertThat(m.getTableName()).contains("GUESTS"); }); - sorm.accept(Guest.class, m -> { + sorm.accept(m -> { InsertResult g = m.insertAndGet(new Guest[] {}); assertThat(g.getRowsModified()[0]).isEqualTo(0); }); - sorm.accept(Guest.class, m -> { + sorm.accept(m -> { InsertResult g = m.insertAndGetOn("players1", new Guest[] {}); assertThat(g.getRowsModified()[0]).isEqualTo(0); }); - sorm.accept(Guest.class, conn -> { + sorm.accept(conn -> { @@ -166,7 +172,7 @@ void testTableName() { void testClose() { SormFactory.create(SormTestUtils.createDataSourceH2()).getDataSource(); - sorm.accept(Guest.class, m -> { + sorm.accept(m -> { m.close(); try { assertThat(m.getJdbcConnection().isClosed()).isTrue(); @@ -180,20 +186,22 @@ void testClose() { @Test void testCommint() { Guest a = SormTestUtils.GUEST_ALICE; - sorm.accept(Guest.class, m -> { + sorm.accept(conn -> { + TypedOrmConnection m = conn.type(Guest.class); m.begin(); m.insert(a); Guest g = m.readFirst("SELECT * FROM GUESTS"); assertThat(g.getAddress()).isEqualTo(a.getAddress()); // auto roll-back; }); - sorm.accept(Guest.class, m -> { + sorm.accept(m -> { m.begin(); m.insert(a); m.commit(); m.close(); }); - sorm.accept(Guest.class, m -> { + sorm.accept(conn -> { + TypedOrmConnection m = conn.type(Guest.class); Guest g = m.readFirst("SELECT * FROM GUESTS"); assertThat(g.getAddress()).isEqualTo(a.getAddress()); }); @@ -201,7 +209,8 @@ void testCommint() { @Test void testDeleteOnStringT() { - sorm.accept(Player.class, m -> { + sorm.accept(conn -> { + TypedOrmConnection m = conn.type(Player.class); Player a = SormTestUtils.PLAYER_ALICE; Player b = SormTestUtils.PLAYER_BOB; m.insertOn("players1", a); @@ -214,7 +223,8 @@ void testDeleteOnStringT() { @Test void testDeleteT() { - sorm.accept(Player.class, m -> { + sorm.accept(conn -> { + TypedOrmConnection m = conn.type(Player.class); Player a = SormTestUtils.PLAYER_ALICE; Player b = SormTestUtils.PLAYER_BOB; m.insert(a, b); @@ -241,13 +251,13 @@ void testInsertAndGetOnStringT() { Guest a = SormTestUtils.GUEST_ALICE; - sorm.accept(Guest.class, m -> { + sorm.accept(m -> { InsertResult g = m.insertAndGet(a); assertThat(g.getObject().getId()).isEqualTo(1); m.insertAndGet(new Guest[0]); }); - sorm.accept(Guest.class, m -> { + sorm.accept(m -> { InsertResult g = m.insertAndGetOn("players1", a); assertThat(g.getObject().getId()).isEqualTo(1); }); @@ -259,11 +269,11 @@ void testInsertAndGetOnList() { Guest a = SormTestUtils.GUEST_ALICE; - sorm.accept(Guest.class, m -> { + sorm.accept(m -> { InsertResult g = m.insertAndGet(List.of(a)); assertThat(g.getObject().getId()).isEqualTo(1); }); - sorm.accept(Guest.class, m -> { + sorm.accept(m -> { InsertResult g = m.insertAndGetOn("players1", List.of(a)); assertThat(g.getObject().getId()).isEqualTo(1); }); @@ -273,7 +283,7 @@ void testInsertAndGetOnList() { void testInsertAndGetOnStringT0() { Guest a = SormTestUtils.GUEST_ALICE; Guest b = SormTestUtils.GUEST_BOB; - sorm.accept(Guest.class, m -> { + sorm.accept(m -> { InsertResult g = m.insertAndGet(a, b); assertThat(g.getObject().getId()).isEqualTo(2); }); @@ -283,7 +293,7 @@ void testInsertAndGetOnStringT0() { void testInsertAndGetOnStringT1() { Guest a = SormTestUtils.GUEST_ALICE; Guest b = SormTestUtils.GUEST_BOB; - sorm.accept(Guest.class, m -> { + sorm.accept(m -> { InsertResult g = m.insertAndGetOn("players1", a, b); assertThat(g.getObject().getId()).isEqualTo(2); }); @@ -293,7 +303,8 @@ void testInsertAndGetOnStringT1() { @Test void testInsertAndRead() { - sorm.accept(Guest.class, m -> { + sorm.accept(conn -> { + TypedOrmConnection m = conn.type(Guest.class); Guest a = SormTestUtils.GUEST_ALICE; m.insert(a); Guest g = m.readFirst("SELECT * FROM GUESTS"); @@ -306,7 +317,8 @@ void testInsertAndRead() { @Test void testInsertOnStringT() { - sorm.accept(Player.class, m -> { + sorm.accept(conn -> { + TypedOrmConnection m = conn.type(Player.class); Player a = SormTestUtils.PLAYER_ALICE; Player b = SormTestUtils.PLAYER_BOB; m.insertOn("players1", a, b); @@ -314,7 +326,8 @@ void testInsertOnStringT() { m.deleteAllOn("players1"); assertThat(m.readList("select * from players1").size()).isEqualTo(0); }); - sorm.accept(Player.class, m -> { + sorm.accept(conn -> { + TypedOrmConnection m = conn.type(Player.class); Player a = SormTestUtils.PLAYER_ALICE; Player b = SormTestUtils.PLAYER_BOB; m.insertOn("players1", List.of(a, b)); @@ -328,7 +341,7 @@ void testInsertOnStringT() { @Test void testExec() { Player a = SormTestUtils.PLAYER_ALICE; - sorm.accept(Player.class, m -> { + sorm.accept(m -> { m.insert(a); m.executeUpdate("DROP TABLE IF EXISTS PLAYERS1"); m.executeUpdate(ParameterizedSql.from("DROP TABLE IF EXISTS PLAYERS1")); @@ -342,7 +355,9 @@ void testExec() { void testReadLazy() { Player a = SormTestUtils.PLAYER_ALICE; Player b = SormTestUtils.PLAYER_BOB; - sorm.accept(Player.class, m -> { + sorm.accept(conn -> { + TypedOrmConnection m = conn.type(Player.class); + m.insert(List.of(a, b)); Player p1 = m.readLazy(ParameterizedSql.from("select * from players")) @@ -369,8 +384,7 @@ void testReadLazy() { .isEqualTo(a.getName()); - map = m.readMapFirst( - OrderedParameterSql.parse("select * from players WHERE id=?", 100)); + map = m.readMapFirst(OrderedParameterSql.parse("select * from players WHERE id=?", 100)); assertThat(map).isNull(); @@ -383,7 +397,8 @@ void testReadLazy() { } catch (Exception e) { } }); - sorm.accept(Player.class, m -> { + sorm.accept(conn -> { + TypedOrmConnection m = conn.type(Player.class); try { m.readLazy("select * from playersass"); failBecauseExceptionWasNotThrown(Exception.class); @@ -395,24 +410,25 @@ void testReadLazy() { @Test void testReadAllLazy() { Player a = SormTestUtils.PLAYER_ALICE; - sorm.accept(Player.class, m -> { + sorm.accept(m -> { m.insert(a); }); - sorm.accept(Player.class, m -> { + sorm.accept(m -> { Map map = m.readMapLazy("select * from players").toList().get(0); assertThat(map.get("NAME") != null ? map.get("NAME") : map.get("name")) .isEqualTo(a.getName()); }); - sorm.accept(Player.class, m -> { + sorm.accept(m -> { Map map = m.readMapLazy("select * from players").stream().collect(Collectors.toList()).get(0); assertThat(map.get("NAME") != null ? map.get("NAME") : map.get("name")) .isEqualTo(a.getName()); }); - sorm.accept(Player.class, m -> { + sorm.accept(conn -> { + TypedOrmConnection m = conn.type(Player.class); LazyResultSet r = m.readLazy("select * from players"); Iterator it = r.iterator(); r.close(); @@ -425,30 +441,31 @@ void testReadAllLazy() { }); - sorm.accept(Player.class, m -> { - Map map = m.readMapList(ParameterizedSql.from("select * from players")).get(0); + sorm.accept(m -> { + Map map = + m.readMapList(ParameterizedSql.from("select * from players")).get(0); assertThat(map.get("NAME") != null ? map.get("NAME") : map.get("name")) .isEqualTo(a.getName()); }); - sorm.accept(Player.class, m -> { + sorm.accept(m -> { Map map = m.readMapList("select * from players").get(0); assertThat(map.get("NAME") != null ? map.get("NAME") : map.get("name")) .isEqualTo(a.getName()); }); - sorm.accept(Player.class, m -> { + sorm.accept(m -> { Map map = m.readMapOne(OrderedParameterSql.parse("select * from players where id=?", 1)); assertThat(map.get("NAME") != null ? map.get("NAME") : map.get("name")) .isEqualTo(a.getName()); }); - sorm.accept(Player.class, m -> { + sorm.accept(m -> { Map map = m.readMapOne("select * from players where id=?", 1); assertThat(map.get("NAME") != null ? map.get("NAME") : map.get("name")) .isEqualTo(a.getName()); }); - sorm.accept(Player.class, m -> { + sorm.accept(m -> { Map map = m.readMapLazy(ParameterizedSql.from("select * from players")).toList().get(0); assertThat(map.get("NAME") != null ? map.get("NAME") : map.get("name")) @@ -458,7 +475,8 @@ void testReadAllLazy() { @Test void testReadByPrimaryKey() { - sorm.accept(Guest.class, m -> { + sorm.accept(conn -> { + TypedOrmConnection m = conn.type(Guest.class); Guest a = SormTestUtils.GUEST_ALICE; m.insert(a); Guest g = m.readByPrimaryKey(1); @@ -469,20 +487,20 @@ void testReadByPrimaryKey() { @Test void testReadList() { - sorm.accept(Player.class, m -> { + sorm.accept(conn -> { + TypedOrmConnection m = conn.type(Player.class); Player a = SormTestUtils.PLAYER_ALICE; Player b = SormTestUtils.PLAYER_BOB; m.insert(a, b); assertThat(m.readList("select * from players")).contains(a, b); assertThat(m.readList(ParameterizedSql.from("select * from players"))).contains(a, b); - assertThat( - m.readOne(OrderedParameterSql.parse("select * from players where id=?", 1))) - .isEqualTo(a); + assertThat(m.readOne(OrderedParameterSql.parse("select * from players where id=?", 1))) + .isEqualTo(a); assertThat(m.readOne("select * from players where id=?", 1)).isEqualTo(a); }); Player a = SormTestUtils.PLAYER_ALICE; Player b = SormTestUtils.PLAYER_BOB; - List result = sorm.apply(Player.class, m -> m.readList("select * from players")); + List result = sorm.apply(m -> m.readList(Player.class, "select * from players")); assertThat(result).contains(a, b); List result1 = sorm.apply(m -> m.readList(Player.class, "select * from players")); assertThat(result1).contains(a, b); @@ -491,13 +509,13 @@ void testReadList() { @Test void testReadOne() { try { - sorm.accept(Guest.class, m -> { + sorm.accept(conn -> { + TypedOrmConnection m = conn.type(Guest.class); Guest a = SormTestUtils.GUEST_ALICE; Guest b = SormTestUtils.GUEST_BOB; m.insert(a); m.insert(b); - Guest g = - m.readOne(OrderedParameterSql.parse("select * from guests where id=?", 1)); + Guest g = m.readOne(OrderedParameterSql.parse("select * from guests where id=?", 1)); assertThat(g.getAddress()).isEqualTo(a.getAddress()); assertThat(g.getName()).isEqualTo(a.getName()); g = m.readOne(ParameterizedSql.from("select * from guests")); @@ -548,7 +566,9 @@ void testTransaction() { sorm.applyTransactionHandler(m -> m.insert(a)); - sorm.acceptTransactionHandler(Guest.class, m -> { + sorm.acceptTransactionHandler(conn -> { + TypedOrmConnection m = conn.type(Guest.class); + m.insert(a); m = m.type(Player.class).type(Guest.class); m = m.untype().type(Guest.class); @@ -559,7 +579,7 @@ void testTransaction() { m.commit(); }); - Guest g = sorm.applyTransactionHandler(Guest.class, m -> m.readFirst("SELECT * FROM GUESTS")); + Guest g = sorm.applyTransactionHandler(m -> m.readFirst(Guest.class, "SELECT * FROM GUESTS")); assertThat(g.getAddress()).isEqualTo(a.getAddress()); @@ -568,9 +588,10 @@ void testTransaction() { @Test void testEnum() { - sorm.accept(Location.class, m -> { + sorm.accept(m -> { m.insert(SormTestUtils.LOCATION_KYOTO); - assertThat(m.readFirst("SELECT * FROM locations").getName()).isEqualTo(Location.Place.KYOTO); + assertThat(m.readFirst(Location.class, "SELECT * FROM locations").getName()) + .isEqualTo(Location.Place.KYOTO); }); } @@ -601,7 +622,8 @@ void testUpdateOnT() { sorm.accept(conn -> conn.deleteAll(Player.class)); - sorm.accept(Player.class, m -> { + sorm.accept(conn -> { + TypedOrmConnection m = conn.type(Player.class); m.insert(a, b); m.updateOn("players", new Player(a.getId(), "UPDATED", "UPDATED")); m.updateOn("players", new Player(a.getId(), "UPDATED", "UPDATED"), @@ -619,7 +641,8 @@ void testUpdateOnT() { void testUpdateT() { Player a = SormTestUtils.PLAYER_ALICE; Player b = SormTestUtils.PLAYER_ALICE; - sorm.accept(Player.class, m -> { + sorm.accept(conn -> { + TypedOrmConnection m = conn.type(Player.class); m = m.untype().type(Player.class); m.insert(a); m.update(new Player(a.getId(), "UPDATED", "UPDATED")); diff --git a/src/test/java/repackage/net/sf/persist/tests/common/TestSimple.java b/src/test/java/repackage/net/sf/persist/tests/common/TestSimple.java index a23614fe..1b9f0de6 100644 --- a/src/test/java/repackage/net/sf/persist/tests/common/TestSimple.java +++ b/src/test/java/repackage/net/sf/persist/tests/common/TestSimple.java @@ -23,9 +23,9 @@ import org.junit.jupiter.api.Test; import org.nkjmlab.sorm4j.OrmConnection; import org.nkjmlab.sorm4j.SormFactory; -import org.nkjmlab.sorm4j.TypedOrmConnection; import org.nkjmlab.sorm4j.internal.util.StringUtils; import org.nkjmlab.sorm4j.sql.InsertResult; +import org.nkjmlab.sorm4j.typed.TypedOrmConnection; public class TestSimple { From deba35a1b4551fac93b562bab3ddf36235870193 Mon Sep 17 00:00:00 2001 From: Yuu Nakajima Date: Wed, 28 Apr 2021 16:59:31 +0900 Subject: [PATCH 13/20] Modify test --- .../sorm4j/typed/TypedOrmConnectionTest.java | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/src/test/java/org/nkjmlab/sorm4j/typed/TypedOrmConnectionTest.java b/src/test/java/org/nkjmlab/sorm4j/typed/TypedOrmConnectionTest.java index e1f1a577..eee3f347 100644 --- a/src/test/java/org/nkjmlab/sorm4j/typed/TypedOrmConnectionTest.java +++ b/src/test/java/org/nkjmlab/sorm4j/typed/TypedOrmConnectionTest.java @@ -36,6 +36,19 @@ void setUp() { sorm = SormTestUtils.createSormAndDropAndCreateTableAll(); } + @Test + void testApplyPreparedStatementHandler() { + sorm.accept(conn -> { + TypedOrmConnection m = conn.type(Player.class); + + m.acceptPreparedStatementHandler(ParameterizedSql.parse("select * from guests where id=?", 1), + pstmt -> pstmt.execute()); + m.applyPreparedStatementHandler(ParameterizedSql.parse("select * from guests where id=?", 1), + pstmt -> pstmt.execute()); + }); + + } + @Test void testOrderedRequest() { AtomicInteger id = new AtomicInteger(10); @@ -568,7 +581,6 @@ void testTransaction() { sorm.acceptTransactionHandler(conn -> { TypedOrmConnection m = conn.type(Guest.class); - m.insert(a); m = m.type(Player.class).type(Guest.class); m = m.untype().type(Guest.class); @@ -582,6 +594,11 @@ void testTransaction() { Guest g = sorm.applyTransactionHandler(m -> m.readFirst(Guest.class, "SELECT * FROM GUESTS")); assertThat(g.getAddress()).isEqualTo(a.getAddress()); + sorm.acceptTransactionHandler(conn -> { + TypedOrmConnection m = conn.type(Guest.class); + m.begin(java.sql.Connection.TRANSACTION_READ_COMMITTED); + }); + } From 791af3e2ed676dae7520f16e7b05842c4aff15b1 Mon Sep 17 00:00:00 2001 From: Yuu Nakajima Date: Wed, 28 Apr 2021 17:15:58 +0900 Subject: [PATCH 14/20] Create helper package --- .../org/nkjmlab/sorm4j/OrmConnection.java | 10 ++-- .../internal/mapping/OrmConnectionImpl.java | 10 ++-- .../mapping/TypedOrmConnectionImpl.java | 10 ++-- .../sorm4j/internal/sql/AbstractQuery.java | 2 +- .../internal/sql/NamedParameterQueryImpl.java | 2 +- .../sql/NamedParameterRequestImpl.java | 2 +- .../sql/OrderedParameterQueryImpl.java | 2 +- .../sql/OrderedParameterRequestImpl.java | 2 +- .../internal/sql/SelectBuilderImpl.java | 38 +++++------- .../sorm4j/internal/sql/SelectQueryImpl.java | 58 +++++++++--------- .../sorm4j/sql/ParameterizedSqlParser.java | 2 +- .../sql/{ => helper}/NamedParameterQuery.java | 3 +- .../{ => helper}/NamedParameterRequest.java | 3 +- .../{ => helper}/OrderedParameterQuery.java | 4 +- .../{ => helper}/OrderedParameterRequest.java | 3 +- .../sorm4j/sql/{ => helper}/Query.java | 6 +- .../sorm4j/sql/{ => helper}/Request.java | 4 +- .../sorm4j/sql/{ => helper}/SelectQuery.java | 18 +++--- .../SelectStringBuilder.java} | 60 +++++++++---------- .../nkjmlab/sorm4j/sql/helper/package.html | 7 +++ .../sorm4j/typed/TypedOrmConnection.java | 10 ++-- .../sorm4j/sql/NamedParameterSqlTest.java | 10 ++-- .../nkjmlab/sorm4j/sql/SelectBuilderTest.java | 20 +++---- .../nkjmlab/sorm4j/sql/SelectQueryTest.java | 11 ++-- 24 files changed, 155 insertions(+), 142 deletions(-) rename src/main/java/org/nkjmlab/sorm4j/sql/{ => helper}/NamedParameterQuery.java (80%) rename src/main/java/org/nkjmlab/sorm4j/sql/{ => helper}/NamedParameterRequest.java (86%) rename src/main/java/org/nkjmlab/sorm4j/sql/{ => helper}/OrderedParameterQuery.java (73%) rename src/main/java/org/nkjmlab/sorm4j/sql/{ => helper}/OrderedParameterRequest.java (84%) rename src/main/java/org/nkjmlab/sorm4j/sql/{ => helper}/Query.java (83%) rename src/main/java/org/nkjmlab/sorm4j/sql/{ => helper}/Request.java (83%) rename src/main/java/org/nkjmlab/sorm4j/sql/{ => helper}/SelectQuery.java (66%) rename src/main/java/org/nkjmlab/sorm4j/sql/{SelectBuilder.java => helper/SelectStringBuilder.java} (65%) create mode 100644 src/main/java/org/nkjmlab/sorm4j/sql/helper/package.html diff --git a/src/main/java/org/nkjmlab/sorm4j/OrmConnection.java b/src/main/java/org/nkjmlab/sorm4j/OrmConnection.java index 8c127ce3..18049cca 100644 --- a/src/main/java/org/nkjmlab/sorm4j/OrmConnection.java +++ b/src/main/java/org/nkjmlab/sorm4j/OrmConnection.java @@ -1,11 +1,11 @@ package org.nkjmlab.sorm4j; import org.nkjmlab.sorm4j.annotation.Experimental; -import org.nkjmlab.sorm4j.sql.NamedParameterQuery; -import org.nkjmlab.sorm4j.sql.NamedParameterRequest; -import org.nkjmlab.sorm4j.sql.OrderedParameterQuery; -import org.nkjmlab.sorm4j.sql.OrderedParameterRequest; -import org.nkjmlab.sorm4j.sql.SelectQuery; +import org.nkjmlab.sorm4j.sql.helper.NamedParameterQuery; +import org.nkjmlab.sorm4j.sql.helper.NamedParameterRequest; +import org.nkjmlab.sorm4j.sql.helper.OrderedParameterQuery; +import org.nkjmlab.sorm4j.sql.helper.OrderedParameterRequest; +import org.nkjmlab.sorm4j.sql.helper.SelectQuery; import org.nkjmlab.sorm4j.typed.TypedOrmConnection; /** diff --git a/src/main/java/org/nkjmlab/sorm4j/internal/mapping/OrmConnectionImpl.java b/src/main/java/org/nkjmlab/sorm4j/internal/mapping/OrmConnectionImpl.java index a2ee8a8b..f5a73c60 100644 --- a/src/main/java/org/nkjmlab/sorm4j/internal/mapping/OrmConnectionImpl.java +++ b/src/main/java/org/nkjmlab/sorm4j/internal/mapping/OrmConnectionImpl.java @@ -30,12 +30,12 @@ import org.nkjmlab.sorm4j.internal.util.Try; import org.nkjmlab.sorm4j.sql.InsertResult; import org.nkjmlab.sorm4j.sql.LazyResultSet; -import org.nkjmlab.sorm4j.sql.NamedParameterQuery; -import org.nkjmlab.sorm4j.sql.NamedParameterRequest; -import org.nkjmlab.sorm4j.sql.OrderedParameterQuery; -import org.nkjmlab.sorm4j.sql.OrderedParameterRequest; import org.nkjmlab.sorm4j.sql.ParameterizedSql; -import org.nkjmlab.sorm4j.sql.SelectQuery; +import org.nkjmlab.sorm4j.sql.helper.NamedParameterQuery; +import org.nkjmlab.sorm4j.sql.helper.NamedParameterRequest; +import org.nkjmlab.sorm4j.sql.helper.OrderedParameterQuery; +import org.nkjmlab.sorm4j.sql.helper.OrderedParameterRequest; +import org.nkjmlab.sorm4j.sql.helper.SelectQuery; import org.nkjmlab.sorm4j.sql.tuple.Tuple2; import org.nkjmlab.sorm4j.sql.tuple.Tuple3; import org.nkjmlab.sorm4j.sql.tuple.Tuples; diff --git a/src/main/java/org/nkjmlab/sorm4j/internal/mapping/TypedOrmConnectionImpl.java b/src/main/java/org/nkjmlab/sorm4j/internal/mapping/TypedOrmConnectionImpl.java index 6d0f1888..415f32eb 100644 --- a/src/main/java/org/nkjmlab/sorm4j/internal/mapping/TypedOrmConnectionImpl.java +++ b/src/main/java/org/nkjmlab/sorm4j/internal/mapping/TypedOrmConnectionImpl.java @@ -15,12 +15,12 @@ import org.nkjmlab.sorm4j.internal.sql.SelectQueryImpl; import org.nkjmlab.sorm4j.sql.InsertResult; import org.nkjmlab.sorm4j.sql.LazyResultSet; -import org.nkjmlab.sorm4j.sql.NamedParameterQuery; -import org.nkjmlab.sorm4j.sql.NamedParameterRequest; -import org.nkjmlab.sorm4j.sql.OrderedParameterQuery; -import org.nkjmlab.sorm4j.sql.OrderedParameterRequest; import org.nkjmlab.sorm4j.sql.ParameterizedSql; -import org.nkjmlab.sorm4j.sql.SelectQuery; +import org.nkjmlab.sorm4j.sql.helper.NamedParameterQuery; +import org.nkjmlab.sorm4j.sql.helper.NamedParameterRequest; +import org.nkjmlab.sorm4j.sql.helper.OrderedParameterQuery; +import org.nkjmlab.sorm4j.sql.helper.OrderedParameterRequest; +import org.nkjmlab.sorm4j.sql.helper.SelectQuery; import org.nkjmlab.sorm4j.typed.TypedOrmConnection; /** diff --git a/src/main/java/org/nkjmlab/sorm4j/internal/sql/AbstractQuery.java b/src/main/java/org/nkjmlab/sorm4j/internal/sql/AbstractQuery.java index a180628d..be0ccb5d 100644 --- a/src/main/java/org/nkjmlab/sorm4j/internal/sql/AbstractQuery.java +++ b/src/main/java/org/nkjmlab/sorm4j/internal/sql/AbstractQuery.java @@ -2,8 +2,8 @@ import java.util.List; import org.nkjmlab.sorm4j.sql.LazyResultSet; -import org.nkjmlab.sorm4j.sql.Query; import org.nkjmlab.sorm4j.sql.ParameterizedSqlParser; +import org.nkjmlab.sorm4j.sql.helper.Query; public abstract class AbstractQuery implements Query, ParameterizedSqlParser { protected final QueryExecutor executor; diff --git a/src/main/java/org/nkjmlab/sorm4j/internal/sql/NamedParameterQueryImpl.java b/src/main/java/org/nkjmlab/sorm4j/internal/sql/NamedParameterQueryImpl.java index a5498c54..2119e746 100644 --- a/src/main/java/org/nkjmlab/sorm4j/internal/sql/NamedParameterQueryImpl.java +++ b/src/main/java/org/nkjmlab/sorm4j/internal/sql/NamedParameterQueryImpl.java @@ -1,9 +1,9 @@ package org.nkjmlab.sorm4j.internal.sql; import java.util.Map; -import org.nkjmlab.sorm4j.sql.NamedParameterQuery; import org.nkjmlab.sorm4j.sql.NamedParameterSql; import org.nkjmlab.sorm4j.sql.ParameterizedSql; +import org.nkjmlab.sorm4j.sql.helper.NamedParameterQuery; /** * An implementation of {@link NamedParameterQuery} diff --git a/src/main/java/org/nkjmlab/sorm4j/internal/sql/NamedParameterRequestImpl.java b/src/main/java/org/nkjmlab/sorm4j/internal/sql/NamedParameterRequestImpl.java index 3583520b..b8e856d4 100644 --- a/src/main/java/org/nkjmlab/sorm4j/internal/sql/NamedParameterRequestImpl.java +++ b/src/main/java/org/nkjmlab/sorm4j/internal/sql/NamedParameterRequestImpl.java @@ -6,9 +6,9 @@ import org.nkjmlab.sorm4j.FunctionHandler; import org.nkjmlab.sorm4j.RowMapper; import org.nkjmlab.sorm4j.SqlExecutor; -import org.nkjmlab.sorm4j.sql.NamedParameterRequest; import org.nkjmlab.sorm4j.sql.NamedParameterSql; import org.nkjmlab.sorm4j.sql.ParameterizedSql; +import org.nkjmlab.sorm4j.sql.helper.NamedParameterRequest; public class NamedParameterRequestImpl implements NamedParameterRequest { diff --git a/src/main/java/org/nkjmlab/sorm4j/internal/sql/OrderedParameterQueryImpl.java b/src/main/java/org/nkjmlab/sorm4j/internal/sql/OrderedParameterQueryImpl.java index 82d60c84..d26ab52d 100644 --- a/src/main/java/org/nkjmlab/sorm4j/internal/sql/OrderedParameterQueryImpl.java +++ b/src/main/java/org/nkjmlab/sorm4j/internal/sql/OrderedParameterQueryImpl.java @@ -1,8 +1,8 @@ package org.nkjmlab.sorm4j.internal.sql; -import org.nkjmlab.sorm4j.sql.OrderedParameterQuery; import org.nkjmlab.sorm4j.sql.OrderedParameterSql; import org.nkjmlab.sorm4j.sql.ParameterizedSql; +import org.nkjmlab.sorm4j.sql.helper.OrderedParameterQuery; /** * An implementation of {@link OrderedParameterQuery} diff --git a/src/main/java/org/nkjmlab/sorm4j/internal/sql/OrderedParameterRequestImpl.java b/src/main/java/org/nkjmlab/sorm4j/internal/sql/OrderedParameterRequestImpl.java index 5162e9ca..146c6233 100644 --- a/src/main/java/org/nkjmlab/sorm4j/internal/sql/OrderedParameterRequestImpl.java +++ b/src/main/java/org/nkjmlab/sorm4j/internal/sql/OrderedParameterRequestImpl.java @@ -5,9 +5,9 @@ import org.nkjmlab.sorm4j.FunctionHandler; import org.nkjmlab.sorm4j.RowMapper; import org.nkjmlab.sorm4j.SqlExecutor; -import org.nkjmlab.sorm4j.sql.OrderedParameterRequest; import org.nkjmlab.sorm4j.sql.OrderedParameterSql; import org.nkjmlab.sorm4j.sql.ParameterizedSql; +import org.nkjmlab.sorm4j.sql.helper.OrderedParameterRequest; public class OrderedParameterRequestImpl implements OrderedParameterRequest { diff --git a/src/main/java/org/nkjmlab/sorm4j/internal/sql/SelectBuilderImpl.java b/src/main/java/org/nkjmlab/sorm4j/internal/sql/SelectBuilderImpl.java index 798616b3..ccb2dbb6 100644 --- a/src/main/java/org/nkjmlab/sorm4j/internal/sql/SelectBuilderImpl.java +++ b/src/main/java/org/nkjmlab/sorm4j/internal/sql/SelectBuilderImpl.java @@ -2,8 +2,7 @@ import java.util.Arrays; import java.util.stream.Collectors; -import org.nkjmlab.sorm4j.sql.SelectBuilder; -import org.nkjmlab.sorm4j.sql.ParameterizedSql; +import org.nkjmlab.sorm4j.sql.helper.SelectStringBuilder; /** * An builder of select SQL. @@ -11,7 +10,7 @@ * @author nkjm * */ -public class SelectBuilderImpl implements SelectBuilder { +public class SelectBuilderImpl implements SelectStringBuilder { public SelectBuilderImpl() {} @@ -32,67 +31,67 @@ public SelectBuilderImpl() {} private String limit; @Override - public SelectBuilder select(String... columns) { + public SelectStringBuilder select(String... columns) { this.columns = String.join(", ", Arrays.stream(columns).collect(Collectors.toList())); return this; } @Override - public SelectBuilder distinct() { + public SelectStringBuilder distinct() { this.distinct = true; return this; } @Override - public SelectBuilder from(String table) { + public SelectStringBuilder from(String table) { this.table = table; return this; } @Override - public SelectBuilder groupBy(String... columns) { + public SelectStringBuilder groupBy(String... columns) { groupBy = String.join(",", Arrays.stream(columns).collect(Collectors.toList())); return this; } @Override - public SelectBuilder having(SelectBuilder.Condition condition) { + public SelectStringBuilder having(SelectStringBuilder.Condition condition) { having(condition.toString()); return this; } @Override - public SelectBuilder having(String expr) { + public SelectStringBuilder having(String expr) { having = expr; return this; } @Override - public SelectBuilder limit(int limit) { + public SelectStringBuilder limit(int limit) { return limit(limit, 0); } @Override - public SelectBuilder limit(int limit, int offset) { + public SelectStringBuilder limit(int limit, int offset) { this.limit = limit + (offset > 0 ? " offset " + offset : ""); return this; } @Override - public SelectBuilder orderBy(String column, String ascOrDesc) { - orderBy(new SelectBuilder.OrderBy(column, ascOrDesc)); + public SelectStringBuilder orderBy(String column, String ascOrDesc) { + orderBy(new SelectStringBuilder.OrderBy(column, ascOrDesc)); return this; } @Override - public SelectBuilder orderBy(SelectBuilder.OrderBy... orderBys) { + public SelectStringBuilder orderBy(SelectStringBuilder.OrderBy... orderBys) { this.orderBy = String.join(", ", Arrays.stream(orderBys).map(ob -> ob.toString()).collect(Collectors.toList())); return this; } @Override - public String buildSql() { + public String build() { return toPrettyString(false); } @@ -141,20 +140,15 @@ public String toString() { } @Override - public SelectBuilder where(SelectBuilder.Condition condition) { + public SelectStringBuilder where(SelectStringBuilder.Condition condition) { where(condition.toString()); return this; } @Override - public SelectBuilder where(String expr) { + public SelectStringBuilder where(String expr) { where = expr; return this; } - @Override - public ParameterizedSql parse() { - return ParameterizedSql.from(buildSql()); - } - } diff --git a/src/main/java/org/nkjmlab/sorm4j/internal/sql/SelectQueryImpl.java b/src/main/java/org/nkjmlab/sorm4j/internal/sql/SelectQueryImpl.java index b0e36b14..e3ad5636 100644 --- a/src/main/java/org/nkjmlab/sorm4j/internal/sql/SelectQueryImpl.java +++ b/src/main/java/org/nkjmlab/sorm4j/internal/sql/SelectQueryImpl.java @@ -1,10 +1,10 @@ package org.nkjmlab.sorm4j.internal.sql; import java.util.Map; -import org.nkjmlab.sorm4j.sql.NamedParameterQuery; -import org.nkjmlab.sorm4j.sql.OrderedParameterQuery; -import org.nkjmlab.sorm4j.sql.SelectBuilder; -import org.nkjmlab.sorm4j.sql.SelectQuery; +import org.nkjmlab.sorm4j.sql.helper.NamedParameterQuery; +import org.nkjmlab.sorm4j.sql.helper.OrderedParameterQuery; +import org.nkjmlab.sorm4j.sql.helper.SelectStringBuilder; +import org.nkjmlab.sorm4j.sql.helper.SelectQuery; import org.nkjmlab.sorm4j.sql.ParameterizedSql; /** @@ -16,20 +16,20 @@ */ public class SelectQueryImpl extends AbstractQuery implements SelectQuery { - private final SelectBuilder selectBuilder; + private final SelectStringBuilder selectStringBuilder; public SelectQueryImpl(QueryExecutor executor) { super(executor); - this.selectBuilder = SelectBuilder.create(); + this.selectStringBuilder = SelectStringBuilder.create(); } private NamedParameterQuery withNamedParameter() { - return NamedParameterQueryImpl.createFrom(executor, buildSql()); + return NamedParameterQueryImpl.createFrom(executor, build()); } private OrderedParameterQuery withOrderedParameter() { - return OrderedParameterQueryImpl.createFrom(executor, buildSql()); + return OrderedParameterQueryImpl.createFrom(executor, build()); } @Override @@ -69,98 +69,98 @@ public NamedParameterQuery bindBean(Object bean) { @Override public ParameterizedSql parse() { - return ParameterizedSql.from(buildSql()); + return ParameterizedSql.from(build()); } @Override public SelectQuery select(String... columns) { - selectBuilder.select(columns); + selectStringBuilder.select(columns); return this; } @Override public SelectQuery distinct() { - selectBuilder.distinct(); + selectStringBuilder.distinct(); return this; } @Override public SelectQuery from(String table) { - selectBuilder.from(table); + selectStringBuilder.from(table); return this; } @Override public SelectQuery groupBy(String... columns) { - selectBuilder.groupBy(columns); + selectStringBuilder.groupBy(columns); return this; } @Override - public SelectQuery having(SelectBuilder.Condition condition) { - selectBuilder.having(condition); + public SelectQuery having(SelectStringBuilder.Condition condition) { + selectStringBuilder.having(condition); return this; } @Override public SelectQuery having(String expr) { - selectBuilder.having(expr); + selectStringBuilder.having(expr); return this; } @Override public SelectQuery limit(int limit) { - selectBuilder.limit(limit); + selectStringBuilder.limit(limit); return this; } @Override public SelectQuery limit(int limit, int offset) { - selectBuilder.limit(limit, offset); + selectStringBuilder.limit(limit, offset); return this; } @Override public SelectQuery orderBy(String column, String ascOrDesc) { - selectBuilder.orderBy(column, ascOrDesc); + selectStringBuilder.orderBy(column, ascOrDesc); return this; } @Override - public SelectQuery orderBy(SelectBuilder.OrderBy... orderBys) { - selectBuilder.orderBy(orderBys); + public SelectQuery orderBy(SelectStringBuilder.OrderBy... orderBys) { + selectStringBuilder.orderBy(orderBys); return this; } @Override - public String buildSql() { - return selectBuilder.buildSql(); + public String build() { + return selectStringBuilder.build(); } @Override public String toString() { - return selectBuilder.buildSql(); + return selectStringBuilder.build(); } @Override public String toPrettyString() { - return selectBuilder.toPrettyString(); + return selectStringBuilder.toPrettyString(); } @Override public String toPrettyString(boolean prettyPrint) { - return selectBuilder.toPrettyString(prettyPrint); + return selectStringBuilder.toPrettyString(prettyPrint); } @Override - public SelectQuery where(SelectBuilder.Condition condition) { - selectBuilder.where(condition); + public SelectQuery where(SelectStringBuilder.Condition condition) { + selectStringBuilder.where(condition); return this; } @Override public SelectQuery where(String expr) { - selectBuilder.where(expr); + selectStringBuilder.where(expr); return this; } diff --git a/src/main/java/org/nkjmlab/sorm4j/sql/ParameterizedSqlParser.java b/src/main/java/org/nkjmlab/sorm4j/sql/ParameterizedSqlParser.java index 05011fe8..cdf743d7 100644 --- a/src/main/java/org/nkjmlab/sorm4j/sql/ParameterizedSqlParser.java +++ b/src/main/java/org/nkjmlab/sorm4j/sql/ParameterizedSqlParser.java @@ -2,7 +2,7 @@ public interface ParameterizedSqlParser { /** - * Convert {@link ParameterizedSql} objects. + * Parse to {@link ParameterizedSql} objects. * * @return */ diff --git a/src/main/java/org/nkjmlab/sorm4j/sql/NamedParameterQuery.java b/src/main/java/org/nkjmlab/sorm4j/sql/helper/NamedParameterQuery.java similarity index 80% rename from src/main/java/org/nkjmlab/sorm4j/sql/NamedParameterQuery.java rename to src/main/java/org/nkjmlab/sorm4j/sql/helper/NamedParameterQuery.java index 0e76ec5a..49d38cae 100644 --- a/src/main/java/org/nkjmlab/sorm4j/sql/NamedParameterQuery.java +++ b/src/main/java/org/nkjmlab/sorm4j/sql/helper/NamedParameterQuery.java @@ -1,7 +1,8 @@ -package org.nkjmlab.sorm4j.sql; +package org.nkjmlab.sorm4j.sql.helper; import java.util.Map; import org.nkjmlab.sorm4j.annotation.Experimental; +import org.nkjmlab.sorm4j.sql.NamedParameterSql; /** diff --git a/src/main/java/org/nkjmlab/sorm4j/sql/NamedParameterRequest.java b/src/main/java/org/nkjmlab/sorm4j/sql/helper/NamedParameterRequest.java similarity index 86% rename from src/main/java/org/nkjmlab/sorm4j/sql/NamedParameterRequest.java rename to src/main/java/org/nkjmlab/sorm4j/sql/helper/NamedParameterRequest.java index 01bc33c5..b13048c9 100644 --- a/src/main/java/org/nkjmlab/sorm4j/sql/NamedParameterRequest.java +++ b/src/main/java/org/nkjmlab/sorm4j/sql/helper/NamedParameterRequest.java @@ -1,9 +1,10 @@ -package org.nkjmlab.sorm4j.sql; +package org.nkjmlab.sorm4j.sql.helper; import java.util.Map; import org.nkjmlab.sorm4j.SqlExecutor; import org.nkjmlab.sorm4j.annotation.Experimental; import org.nkjmlab.sorm4j.internal.sql.NamedParameterRequestImpl; +import org.nkjmlab.sorm4j.sql.NamedParameterSql; /** diff --git a/src/main/java/org/nkjmlab/sorm4j/sql/OrderedParameterQuery.java b/src/main/java/org/nkjmlab/sorm4j/sql/helper/OrderedParameterQuery.java similarity index 73% rename from src/main/java/org/nkjmlab/sorm4j/sql/OrderedParameterQuery.java rename to src/main/java/org/nkjmlab/sorm4j/sql/helper/OrderedParameterQuery.java index dc78e0c9..2cbc37c7 100644 --- a/src/main/java/org/nkjmlab/sorm4j/sql/OrderedParameterQuery.java +++ b/src/main/java/org/nkjmlab/sorm4j/sql/helper/OrderedParameterQuery.java @@ -1,4 +1,6 @@ -package org.nkjmlab.sorm4j.sql; +package org.nkjmlab.sorm4j.sql.helper; + +import org.nkjmlab.sorm4j.sql.OrderedParameterSql; /** * Query with ordered parameters. diff --git a/src/main/java/org/nkjmlab/sorm4j/sql/OrderedParameterRequest.java b/src/main/java/org/nkjmlab/sorm4j/sql/helper/OrderedParameterRequest.java similarity index 84% rename from src/main/java/org/nkjmlab/sorm4j/sql/OrderedParameterRequest.java rename to src/main/java/org/nkjmlab/sorm4j/sql/helper/OrderedParameterRequest.java index b5d5af00..e8d2b9f2 100644 --- a/src/main/java/org/nkjmlab/sorm4j/sql/OrderedParameterRequest.java +++ b/src/main/java/org/nkjmlab/sorm4j/sql/helper/OrderedParameterRequest.java @@ -1,7 +1,8 @@ -package org.nkjmlab.sorm4j.sql; +package org.nkjmlab.sorm4j.sql.helper; import org.nkjmlab.sorm4j.SqlExecutor; import org.nkjmlab.sorm4j.internal.sql.OrderedParameterRequestImpl; +import org.nkjmlab.sorm4j.sql.OrderedParameterSql; /** * An executable request with ordered parameters. diff --git a/src/main/java/org/nkjmlab/sorm4j/sql/Query.java b/src/main/java/org/nkjmlab/sorm4j/sql/helper/Query.java similarity index 83% rename from src/main/java/org/nkjmlab/sorm4j/sql/Query.java rename to src/main/java/org/nkjmlab/sorm4j/sql/helper/Query.java index 2504acc1..e9fbc67d 100644 --- a/src/main/java/org/nkjmlab/sorm4j/sql/Query.java +++ b/src/main/java/org/nkjmlab/sorm4j/sql/helper/Query.java @@ -1,6 +1,8 @@ -package org.nkjmlab.sorm4j.sql; +package org.nkjmlab.sorm4j.sql.helper; import java.util.List; +import org.nkjmlab.sorm4j.annotation.Experimental; +import org.nkjmlab.sorm4j.sql.LazyResultSet; /** * A query for reading and mapping a relation to object. @@ -9,7 +11,7 @@ * * @param */ - +@Experimental public interface Query { /** diff --git a/src/main/java/org/nkjmlab/sorm4j/sql/Request.java b/src/main/java/org/nkjmlab/sorm4j/sql/helper/Request.java similarity index 83% rename from src/main/java/org/nkjmlab/sorm4j/sql/Request.java rename to src/main/java/org/nkjmlab/sorm4j/sql/helper/Request.java index 083da8b5..269aa5ab 100644 --- a/src/main/java/org/nkjmlab/sorm4j/sql/Request.java +++ b/src/main/java/org/nkjmlab/sorm4j/sql/helper/Request.java @@ -1,9 +1,10 @@ -package org.nkjmlab.sorm4j.sql; +package org.nkjmlab.sorm4j.sql.helper; import java.sql.ResultSet; import java.util.List; import org.nkjmlab.sorm4j.FunctionHandler; import org.nkjmlab.sorm4j.RowMapper; +import org.nkjmlab.sorm4j.annotation.Experimental; /** @@ -12,6 +13,7 @@ * @author nkjm * */ +@Experimental public interface Request { /** diff --git a/src/main/java/org/nkjmlab/sorm4j/sql/SelectQuery.java b/src/main/java/org/nkjmlab/sorm4j/sql/helper/SelectQuery.java similarity index 66% rename from src/main/java/org/nkjmlab/sorm4j/sql/SelectQuery.java rename to src/main/java/org/nkjmlab/sorm4j/sql/helper/SelectQuery.java index c3b1ed36..261302e9 100644 --- a/src/main/java/org/nkjmlab/sorm4j/sql/SelectQuery.java +++ b/src/main/java/org/nkjmlab/sorm4j/sql/helper/SelectQuery.java @@ -1,7 +1,10 @@ -package org.nkjmlab.sorm4j.sql; +package org.nkjmlab.sorm4j.sql.helper; import java.util.Map; import org.nkjmlab.sorm4j.annotation.Experimental; +import org.nkjmlab.sorm4j.sql.NamedParameterSql; +import org.nkjmlab.sorm4j.sql.OrderedParameterSql; +import org.nkjmlab.sorm4j.sql.ParameterizedSqlParser; /** @@ -11,8 +14,9 @@ * * @param */ -public interface SelectQuery - extends SelectBuilder, NamedParameterSql, OrderedParameterSql, ParameterizedSqlParser, Query { +@Experimental +public interface SelectQuery extends SelectStringBuilder, NamedParameterSql, OrderedParameterSql, + ParameterizedSqlParser, Query { @Override OrderedParameterQuery addParameter(Object... parameters); @@ -47,7 +51,7 @@ public interface SelectQuery SelectQuery groupBy(String... columns); @Override - SelectQuery having(SelectBuilder.Condition condition); + SelectQuery having(SelectStringBuilder.Condition condition); @Override SelectQuery having(String expr); @@ -62,10 +66,10 @@ public interface SelectQuery SelectQuery orderBy(String column, String ascOrDesc); @Override - SelectQuery orderBy(SelectBuilder.OrderBy... orderBys); + SelectQuery orderBy(SelectStringBuilder.OrderBy... orderBys); @Override - String buildSql(); + String build(); @Override String toPrettyString(); @@ -74,7 +78,7 @@ public interface SelectQuery String toPrettyString(boolean prettyPrint); @Override - SelectQuery where(SelectBuilder.Condition condition); + SelectQuery where(SelectStringBuilder.Condition condition); @Override SelectQuery where(String expr); diff --git a/src/main/java/org/nkjmlab/sorm4j/sql/SelectBuilder.java b/src/main/java/org/nkjmlab/sorm4j/sql/helper/SelectStringBuilder.java similarity index 65% rename from src/main/java/org/nkjmlab/sorm4j/sql/SelectBuilder.java rename to src/main/java/org/nkjmlab/sorm4j/sql/helper/SelectStringBuilder.java index 8ac74f7f..2ae5b845 100644 --- a/src/main/java/org/nkjmlab/sorm4j/sql/SelectBuilder.java +++ b/src/main/java/org/nkjmlab/sorm4j/sql/helper/SelectStringBuilder.java @@ -1,4 +1,4 @@ -package org.nkjmlab.sorm4j.sql; +package org.nkjmlab.sorm4j.sql.helper; import java.util.Arrays; import java.util.stream.Collectors; @@ -13,7 +13,7 @@ * */ @Experimental -public interface SelectBuilder extends ParameterizedSqlParser { +public interface SelectStringBuilder { /** * Value object represents conditions of where clause or having clause. This object could include @@ -74,8 +74,8 @@ public String toString() { * @param conds condition in String or Condition * @return */ - public static SelectBuilder.Condition and(Object... conds) { - return new SelectBuilder.Condition("and", conds); + public static SelectStringBuilder.Condition and(Object... conds) { + return new SelectStringBuilder.Condition("and", conds); } /** @@ -95,7 +95,7 @@ public static String as(String col, String alias) { /** *

- * Creates {@link SelectBuilder.Condition} instance. + * Creates {@link SelectStringBuilder.Condition} instance. * *

* For example, @@ -104,20 +104,20 @@ public static String as(String col, String alias) { * and(cond("id=?"), "name=?") returns "id=? and name=?" * */ - public static SelectBuilder.Condition cond(String cond) { - return new SelectBuilder.Condition(cond); + public static SelectStringBuilder.Condition cond(String cond) { + return new SelectStringBuilder.Condition(cond); } - public static SelectBuilder.Condition cond(String left, String op, String right) { - return new SelectBuilder.Condition(left, op, right); + public static SelectStringBuilder.Condition cond(String left, String op, String right) { + return new SelectStringBuilder.Condition(left, op, right); } /** - * Create {@link SelectBuilder} object. + * Create {@link SelectStringBuilder} object. * * @return */ - public static SelectBuilder create() { + public static SelectStringBuilder create() { return new SelectBuilderImpl(); } @@ -131,19 +131,19 @@ public static SelectBuilder create() { * or("id=?", "name=?") returns "id=? or name=?" * */ - public static SelectBuilder.Condition or(Object... conds) { - return new SelectBuilder.Condition("or", conds); + public static SelectStringBuilder.Condition or(Object... conds) { + return new SelectStringBuilder.Condition("or", conds); } /** - * Create {@link SelectBuilder.OrderBy} objects. + * Create {@link SelectStringBuilder.OrderBy} objects. * * @param column * @param ascOrDesc * @return */ - public static SelectBuilder.OrderBy order(String column, String ascOrDesc) { - return new SelectBuilder.OrderBy(column, ascOrDesc); + public static SelectStringBuilder.OrderBy order(String column, String ascOrDesc) { + return new SelectStringBuilder.OrderBy(column, ascOrDesc); } @@ -152,12 +152,12 @@ public static SelectBuilder.OrderBy order(String column, String ascOrDesc) { * * @return */ - String buildSql(); + String build(); /** * Add distinct keyword to SQL. */ - SelectBuilder distinct(); + SelectStringBuilder distinct(); /** * Create from clause. @@ -170,7 +170,7 @@ public static SelectBuilder.OrderBy order(String column, String ascOrDesc) { * @param table * @return */ - SelectBuilder from(String table); + SelectStringBuilder from(String table); /** * Create group by clause. @@ -178,15 +178,15 @@ public static SelectBuilder.OrderBy order(String column, String ascOrDesc) { * @param columns * @return */ - SelectBuilder groupBy(String... columns); + SelectStringBuilder groupBy(String... columns); /** - * Create having clause with the given {@link SelectBuilder.Condition}. + * Create having clause with the given {@link SelectStringBuilder.Condition}. * * @param condition * @return */ - SelectBuilder having(SelectBuilder.Condition condition); + SelectStringBuilder having(SelectStringBuilder.Condition condition); /** @@ -195,7 +195,7 @@ public static SelectBuilder.OrderBy order(String column, String ascOrDesc) { * @param expr * @return */ - SelectBuilder having(String expr); + SelectStringBuilder having(String expr); /** * Create limit clause. @@ -203,7 +203,7 @@ public static SelectBuilder.OrderBy order(String column, String ascOrDesc) { * @param limit * @return */ - SelectBuilder limit(int limit); + SelectStringBuilder limit(int limit); /** @@ -212,7 +212,7 @@ public static SelectBuilder.OrderBy order(String column, String ascOrDesc) { * @param limit * @return */ - SelectBuilder limit(int limit, int offset); + SelectStringBuilder limit(int limit, int offset); /** * Create order by clause. @@ -220,7 +220,7 @@ public static SelectBuilder.OrderBy order(String column, String ascOrDesc) { * @param orderBys * @return */ - SelectBuilder orderBy(SelectBuilder.OrderBy... orderBys); + SelectStringBuilder orderBy(SelectStringBuilder.OrderBy... orderBys); /** * Create order by clause. @@ -229,7 +229,7 @@ public static SelectBuilder.OrderBy order(String column, String ascOrDesc) { * @param ascOrDesc * @return */ - SelectBuilder orderBy(String column, String ascOrDesc); + SelectStringBuilder orderBy(String column, String ascOrDesc); /** * Create select clause. The default value is "*". @@ -243,7 +243,7 @@ public static SelectBuilder.OrderBy order(String column, String ascOrDesc) { * @param columns * @return */ - SelectBuilder select(String... columns); + SelectStringBuilder select(String... columns); /** * Create prettified string. @@ -268,7 +268,7 @@ public static SelectBuilder.OrderBy order(String column, String ascOrDesc) { * @param condition * @return */ - SelectBuilder where(SelectBuilder.Condition condition); + SelectStringBuilder where(SelectStringBuilder.Condition condition); /** * Create where clause. @@ -276,5 +276,5 @@ public static SelectBuilder.OrderBy order(String column, String ascOrDesc) { * @param expr * @return */ - SelectBuilder where(String expr); + SelectStringBuilder where(String expr); } diff --git a/src/main/java/org/nkjmlab/sorm4j/sql/helper/package.html b/src/main/java/org/nkjmlab/sorm4j/sql/helper/package.html new file mode 100644 index 00000000..a00c7698 --- /dev/null +++ b/src/main/java/org/nkjmlab/sorm4j/sql/helper/package.html @@ -0,0 +1,7 @@ + + +

+ (Non-public API) Package for core of typed connection. +

+ + diff --git a/src/main/java/org/nkjmlab/sorm4j/typed/TypedOrmConnection.java b/src/main/java/org/nkjmlab/sorm4j/typed/TypedOrmConnection.java index 1c80615b..c81af35d 100644 --- a/src/main/java/org/nkjmlab/sorm4j/typed/TypedOrmConnection.java +++ b/src/main/java/org/nkjmlab/sorm4j/typed/TypedOrmConnection.java @@ -6,11 +6,11 @@ import org.nkjmlab.sorm4j.SqlExecutor; import org.nkjmlab.sorm4j.TransactionFunction; import org.nkjmlab.sorm4j.annotation.Experimental; -import org.nkjmlab.sorm4j.sql.NamedParameterQuery; -import org.nkjmlab.sorm4j.sql.NamedParameterRequest; -import org.nkjmlab.sorm4j.sql.OrderedParameterQuery; -import org.nkjmlab.sorm4j.sql.OrderedParameterRequest; -import org.nkjmlab.sorm4j.sql.SelectQuery; +import org.nkjmlab.sorm4j.sql.helper.NamedParameterQuery; +import org.nkjmlab.sorm4j.sql.helper.NamedParameterRequest; +import org.nkjmlab.sorm4j.sql.helper.OrderedParameterQuery; +import org.nkjmlab.sorm4j.sql.helper.OrderedParameterRequest; +import org.nkjmlab.sorm4j.sql.helper.SelectQuery; /** * Main API for typed object relation mapping. The api consists of {@link TypedOrmReader}, diff --git a/src/test/java/org/nkjmlab/sorm4j/sql/NamedParameterSqlTest.java b/src/test/java/org/nkjmlab/sorm4j/sql/NamedParameterSqlTest.java index 4cb3065c..aae88222 100644 --- a/src/test/java/org/nkjmlab/sorm4j/sql/NamedParameterSqlTest.java +++ b/src/test/java/org/nkjmlab/sorm4j/sql/NamedParameterSqlTest.java @@ -23,7 +23,6 @@ void testCustomer() { ParameterizedSql statement = OrderedParameterSql.parse( "select * from customer where name like {?} and address in() and id=?", "A%", List.of("Tokyo", "Kyoto"), 1); - System.out.println(statement); List ret = sorm.apply(conn -> conn.readList(Customer.class, statement)); System.out.println(ret); } @@ -32,7 +31,6 @@ void testCustomer() { String sql = "select * from customer where id=:id and address=:address"; ParameterizedSql statement = NamedParameterSql.from(sql).bind("id", 1).bind("address", "Kyoto").parse(); - System.out.println(statement); List ret = sorm.apply(conn -> conn.readList(Customer.class, statement)); System.out.println(ret); } @@ -40,7 +38,6 @@ void testCustomer() { ParameterizedSql statement = NamedParameterSql.parse( "select * from customer where name like {:name} and address in(<:address>) and id=:id", Map.of("id", 1, "address", List.of("Tokyo", "Kyoto"), "name", "A%")); - System.out.println(statement); List ret = sorm.apply(conn -> conn.readList(Customer.class, statement)); System.out.println(ret); } @@ -57,7 +54,8 @@ void testCreate() { assertThat(sp.toString()) .isEqualTo("sql=[select * from simple where id=? and name=?], parameters=[2, foo]"); - assertThat(ParameterizedSql.from("select * from test").toString()).contains("[select * from test]"); + assertThat(ParameterizedSql.from("select * from test").toString()) + .contains("[select * from test]"); } @Test @@ -71,8 +69,8 @@ void testBindAll() { @Test void testBind() { - ParameterizedSql sp = NamedParameterSql.from(sql).bind("name", "foo").bind("id", 1).bind("idid", 2) - .parse(); + ParameterizedSql sp = + NamedParameterSql.from(sql).bind("name", "foo").bind("id", 1).bind("idid", 2).parse(); assertThat(sp.getSql()).isEqualTo("select * from simple where id=? and name=?"); assertThat(sp.getParameters()).isEqualTo(new Object[] {2, "foo"}); diff --git a/src/test/java/org/nkjmlab/sorm4j/sql/SelectBuilderTest.java b/src/test/java/org/nkjmlab/sorm4j/sql/SelectBuilderTest.java index e0ac4352..bca4ed90 100644 --- a/src/test/java/org/nkjmlab/sorm4j/sql/SelectBuilderTest.java +++ b/src/test/java/org/nkjmlab/sorm4j/sql/SelectBuilderTest.java @@ -2,12 +2,12 @@ import static org.assertj.core.api.Assertions.*; import static org.nkjmlab.sorm4j.sql.ParameterizedSql.*; -import static org.nkjmlab.sorm4j.sql.SelectBuilder.*; -import static org.nkjmlab.sorm4j.sql.SelectBuilder.as; +import static org.nkjmlab.sorm4j.sql.helper.SelectStringBuilder.*; import org.junit.jupiter.api.Test; import org.nkjmlab.sorm4j.Sorm; import org.nkjmlab.sorm4j.common.Guest; import org.nkjmlab.sorm4j.common.SormTestUtils; +import org.nkjmlab.sorm4j.sql.helper.SelectStringBuilder; class SelectBuilderTest { @@ -17,7 +17,7 @@ void testBuildSorm() { SormTestUtils.dropAndCreateTableAll(sormImpl); sormImpl.accept(con -> { - String sql = SelectBuilder.create().from(con.type(Guest.class).getTableName()).buildSql(); + String sql = SelectStringBuilder.create().from(con.type(Guest.class).getTableName()).build(); assertThat(sql).contains("select * from GUESTS"); }); @@ -25,13 +25,13 @@ void testBuildSorm() { @Test void testBuild1() { - SelectBuilder builder = SelectBuilder.create(); + SelectStringBuilder builder = SelectStringBuilder.create(); builder.distinct(); builder.select(as("avg(AGE)", "AVERAGE_AGE"), "TEAM"); builder.groupBy("TEAM"); builder.where(or(and("ID>100", "COUNTRY IN (?)"), "YEAR>2001")); - String sql = builder.from("GUESTS").orderBy("age", "desc").limit(10).parse().getSql(); + String sql = builder.from("GUESTS").orderBy("age", "desc").limit(10).build(); assertThat(sql).contains( "select distinct avg(AGE) as AVERAGE_AGE, TEAM from GUESTS where ((ID>100 and COUNTRY IN (?)) or YEAR>2001) group by TEAM order by age desc limit 10"); @@ -40,13 +40,13 @@ void testBuild1() { @Test void testBuild2() { - SelectBuilder.Condition where = or(and("ID=A", "NAME=B"), and("YEAR=C", "DATE=D"), + SelectStringBuilder.Condition where = or(and("ID=A", "NAME=B"), and("YEAR=C", "DATE=D"), or(cond("ID", "=", quote("test")), cond("NAME='Hello'"))); - SelectBuilder.Condition having = and("aveage_age>0", "a>0"); - SelectBuilder.OrderBy orderBy = order("age", "desc"); + SelectStringBuilder.Condition having = and("aveage_age>0", "a>0"); + SelectStringBuilder.OrderBy orderBy = order("age", "desc"); - String sql = SelectBuilder.create().select(as("AVG(age)", "aveage_age"), "ID").from("GUESTS") - .where(where).having(having).orderBy(orderBy).limit(10, 30).buildSql(); + String sql = SelectStringBuilder.create().select(as("AVG(age)", "aveage_age"), "ID").from("GUESTS") + .where(where).having(having).orderBy(orderBy).limit(10, 30).build(); assertThat(sql).contains( "select AVG(age) as aveage_age, ID from GUESTS where ((ID=A and NAME=B) or (YEAR=C and DATE=D) or (ID='test' or NAME='Hello')) having (aveage_age>0 and a>0) order by age desc limit 10 offset 30"); } diff --git a/src/test/java/org/nkjmlab/sorm4j/sql/SelectQueryTest.java b/src/test/java/org/nkjmlab/sorm4j/sql/SelectQueryTest.java index f6b1a5c6..21d21b41 100644 --- a/src/test/java/org/nkjmlab/sorm4j/sql/SelectQueryTest.java +++ b/src/test/java/org/nkjmlab/sorm4j/sql/SelectQueryTest.java @@ -2,8 +2,7 @@ import static org.assertj.core.api.Assertions.*; import static org.nkjmlab.sorm4j.common.SormTestUtils.*; -import static org.nkjmlab.sorm4j.sql.SelectBuilder.*; -import static org.nkjmlab.sorm4j.sql.SelectBuilder.as; +import static org.nkjmlab.sorm4j.sql.helper.SelectStringBuilder.*; import java.util.Map; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -11,6 +10,8 @@ import org.nkjmlab.sorm4j.common.Guest; import org.nkjmlab.sorm4j.common.Player; import org.nkjmlab.sorm4j.common.SormTestUtils; +import org.nkjmlab.sorm4j.sql.helper.SelectStringBuilder; +import org.nkjmlab.sorm4j.sql.helper.SelectQuery; class SelectQueryTest { @@ -92,19 +93,19 @@ void testCompareSelectBuilderAndSelectQuery() { builder.groupBy("TEAM"); builder.having("avg(age)>0"); builder.distinct(); - String sql = builder.from("GUESTS").orderBy("age", "desc").limit(10).buildSql(); + String sql = builder.from("GUESTS").orderBy("age", "desc").limit(10).build(); System.out.println(sql); assertThat(sql).contains( "select distinct avg(AGE) as AVERAGE_AGE, TEAM from GUESTS where ((ID>100 and COUNTRY IN (?)) or YEAR>2001) group by TEAM having avg(age)>0 order by age desc limit 10"); - SelectBuilder bs = SelectBuilder.create(); + SelectStringBuilder bs = SelectStringBuilder.create(); bs.select(as("avg(AGE)", "AVERAGE_AGE"), "TEAM"); bs.where(or(and("ID>100", "COUNTRY IN (?)"), "YEAR>2001")); bs.groupBy("TEAM"); bs.having("avg(age)>0"); bs.distinct(); bs.toString(); - String sql2 = bs.from("GUESTS").orderBy("age", "desc").limit(10).buildSql(); + String sql2 = bs.from("GUESTS").orderBy("age", "desc").limit(10).build(); assertThat(sql).isEqualTo(sql2); assertThat(builder.parse().getSql()).isEqualTo(sql2); From fda76087783b6a772656c5afde80f75f19e9c336 Mon Sep 17 00:00:00 2001 From: Yuu Nakajima Date: Wed, 28 Apr 2021 22:42:39 +0900 Subject: [PATCH 15/20] Add embededParameter parser --- .../internal/sql/ParameterizedSqlImpl.java | 4 +- .../nkjmlab/sorm4j/sql/ParameterizedSql.java | 42 +++++++++++++++++-- .../sorm4j/sql/ParameterizedSqlTest.java | 18 +++++++- 3 files changed, 56 insertions(+), 8 deletions(-) diff --git a/src/main/java/org/nkjmlab/sorm4j/internal/sql/ParameterizedSqlImpl.java b/src/main/java/org/nkjmlab/sorm4j/internal/sql/ParameterizedSqlImpl.java index f594037f..516410b5 100644 --- a/src/main/java/org/nkjmlab/sorm4j/internal/sql/ParameterizedSqlImpl.java +++ b/src/main/java/org/nkjmlab/sorm4j/internal/sql/ParameterizedSqlImpl.java @@ -45,18 +45,18 @@ public final Object[] getParameters() { return parameters; } - private static final String LIST_PLACEHOLDER = ""; private static final String EMBEDDED_PLACEHOLDER = "{?}"; + private static final String LIST_PLACEHOLDER = ""; public static ParameterizedSql parse(String sql, Object... parameters) { ParameterizedSql st = new ParameterizedSqlImpl(sql, parameters); if (parameters.length == 0) { return st; } - st = sql.contains(LIST_PLACEHOLDER) ? parseListPlaceholder(sql, parameters) : st; st = sql.contains(EMBEDDED_PLACEHOLDER) ? parseEmbeddedPlaceholder(st.getSql(), st.getParameters()) : st; + st = sql.contains(LIST_PLACEHOLDER) ? parseListPlaceholder(sql, parameters) : st; return st; } diff --git a/src/main/java/org/nkjmlab/sorm4j/sql/ParameterizedSql.java b/src/main/java/org/nkjmlab/sorm4j/sql/ParameterizedSql.java index e49530af..f5f64ee5 100644 --- a/src/main/java/org/nkjmlab/sorm4j/sql/ParameterizedSql.java +++ b/src/main/java/org/nkjmlab/sorm4j/sql/ParameterizedSql.java @@ -1,9 +1,11 @@ package org.nkjmlab.sorm4j.sql; import java.util.Map; +import java.util.TreeMap; import org.nkjmlab.sorm4j.annotation.Experimental; import org.nkjmlab.sorm4j.internal.sql.ParameterizedSqlImpl; import org.nkjmlab.sorm4j.internal.util.SqlUtils; +import org.nkjmlab.sorm4j.internal.util.StringUtils; /** @@ -34,15 +36,47 @@ public interface ParameterizedSql { @Experimental - static ParameterizedSql parse(String sql, Object... orderedParameters) { - return OrderedParameterSql.parse(sql, orderedParameters); + static ParameterizedSql parse(String sql, Object... parameters) { + return OrderedParameterSql.parse(sql, parameters); } @Experimental - static ParameterizedSql parse(String sql, Map namedParameters) { - return NamedParameterSql.parse(sql, namedParameters); + static ParameterizedSql parse(String sql, Map parameters) { + return NamedParameterSql.parse(sql, parameters); } + @Experimental + public static String embededParameter(String sql, Object... parameters) { + if (parameters == null || parameters.length == 0) { + return sql; + } + return StringUtils.replacePlaceholder(sql, "{?}", parameters.length, + index -> SqlUtils.literal(parameters[index])); + } + + @Experimental + public static String embededParameter(String sql, Map parameters) { + if (parameters == null || parameters.size() == 0) { + return sql; + } + TreeMap orderdParams = new TreeMap<>(); + + parameters.keySet().stream().forEach(key -> { + int pos = sql.indexOf("{:" + key + "}"); + if (pos == -1) { + return; + } + orderdParams.put(pos, parameters.get(key)); + }); + String _sql = sql.replaceAll("\\{:.*?\\}", "{?}"); + Object[] _params = orderdParams.values().toArray(); + + return StringUtils.replacePlaceholder(_sql, "{?}", _params.length, + index -> SqlUtils.literal(_params[index])); + } + + + /** * Creates {@link ParameterizedSql} object from the given SQL string. When you use a SQL statement * with parameter, use {@link NamedParameterSql}, {@link OrderedParameterSql}. diff --git a/src/test/java/org/nkjmlab/sorm4j/sql/ParameterizedSqlTest.java b/src/test/java/org/nkjmlab/sorm4j/sql/ParameterizedSqlTest.java index ceb62795..e746c310 100644 --- a/src/test/java/org/nkjmlab/sorm4j/sql/ParameterizedSqlTest.java +++ b/src/test/java/org/nkjmlab/sorm4j/sql/ParameterizedSqlTest.java @@ -14,12 +14,11 @@ void testLietral() { assertThat(SqlUtils.literal(null)).isEqualTo("null"); assertThat(SqlUtils.literal("?")).isEqualTo("?"); assertThat(SqlUtils.literal("test")).isEqualTo("'test'"); + assertThat(ParameterizedSql.literal("hi, my name's tim.")).isEqualTo("'hi, my name''s tim.'"); } @Test void testParseAsOrdered() { - assertThat(ParameterizedSql.literal("hi, my name's tim.")).isEqualTo("'hi, my name''s tim.'"); - String sql = "select * from guest where id=?"; Object[] params = {1}; ParameterizedSql ps = ParameterizedSql.parse(sql, params); @@ -40,7 +39,22 @@ void testParseAsNamed() { assertThat(ps.getBindedSql()).contains("select * from guest where id=1"); assertThat(ps.toString()).contains("sql=[select * from guest where id=?], parameters=[1]"); + } + @Test + void testEmbeddedOrdered() { + String sql = "select * from guest where id={?}"; + Object[] params = {1}; + assertThat(ParameterizedSql.embededParameter(sql, params)) + .contains("select * from guest where id=1"); + } + + @Test + void testEmbeddedMap() { + String sql = "select * from guest where id={:id}"; + Map params = Map.of("id", 1); + assertThat(ParameterizedSql.embededParameter(sql, params)) + .contains("select * from guest where id=1"); } } From d4815e8e2dd1052d315c21ff11c229ddbf9f229c Mon Sep 17 00:00:00 2001 From: Yuu Nakajima Date: Wed, 28 Apr 2021 22:43:38 +0900 Subject: [PATCH 16/20] Remove type orm functions --- .../java/org/nkjmlab/sorm4j/SormFactory.java | 34 ------------------- .../org/nkjmlab/sorm4j/SormFactoryTest.java | 12 ------- .../java/org/nkjmlab/sorm4j/SormTest.java | 6 ++-- .../sf/persist/tests/common/TestSimple.java | 3 +- 4 files changed, 5 insertions(+), 50 deletions(-) diff --git a/src/main/java/org/nkjmlab/sorm4j/SormFactory.java b/src/main/java/org/nkjmlab/sorm4j/SormFactory.java index f1b58b57..50b1984a 100644 --- a/src/main/java/org/nkjmlab/sorm4j/SormFactory.java +++ b/src/main/java/org/nkjmlab/sorm4j/SormFactory.java @@ -10,8 +10,6 @@ import org.nkjmlab.sorm4j.internal.mapping.DriverManagerDataSource; import org.nkjmlab.sorm4j.internal.mapping.OrmConnectionImpl; import org.nkjmlab.sorm4j.internal.mapping.SormImpl; -import org.nkjmlab.sorm4j.internal.mapping.TypedOrmConnectionImpl; -import org.nkjmlab.sorm4j.typed.TypedOrmConnection; /** * Main entry point of this library. It creates {@link Sorm} object. @@ -136,38 +134,6 @@ public static OrmConnection toOrmConnection(Connection connection) { return toOrmConnection(connection, ConfigStore.getDefaultConfigStore()); } - /** - * Create a {@link TypedOrmConnection} wrapping the given JDBC Connection. - * - * @param - * @param conn - * @param objectClass - * @return - */ - public static TypedOrmConnection toOrmConnection(Connection conn, Class objectClass) { - return toOrmConnection(conn, objectClass, ConfigStore.getDefaultConfigStore()); - } - - private static TypedOrmConnection toOrmConnection(Connection connection, - Class objectClass, ConfigStore configStore) { - return new TypedOrmConnectionImpl(objectClass, - new OrmConnectionImpl(connection, configStore)); - } - - /** - * Create a {@link TypedOrmConnection} wrapping the given JDBC Connection with the specified - * configurations - * - * @param - * @param conn - * @param objectClass - * @param configName - * @return - */ - public static TypedOrmConnection toOrmConnection(Connection conn, Class objectClass, - String configName) { - return toOrmConnection(conn, objectClass, ConfigStore.get(configName)); - } private static OrmConnection toOrmConnection(Connection connection, ConfigStore configStore) { return new OrmConnectionImpl(connection, configStore); diff --git a/src/test/java/org/nkjmlab/sorm4j/SormFactoryTest.java b/src/test/java/org/nkjmlab/sorm4j/SormFactoryTest.java index f3bbc533..b4be2032 100644 --- a/src/test/java/org/nkjmlab/sorm4j/SormFactoryTest.java +++ b/src/test/java/org/nkjmlab/sorm4j/SormFactoryTest.java @@ -3,10 +3,8 @@ import static org.assertj.core.api.Assertions.*; import static org.nkjmlab.sorm4j.common.SormTestUtils.*; import org.junit.jupiter.api.Test; -import org.nkjmlab.sorm4j.common.Guest; import org.nkjmlab.sorm4j.common.Player; import org.nkjmlab.sorm4j.common.SormTestUtils; -import org.nkjmlab.sorm4j.typed.TypedOrmConnection; class SormFactoryTest { @@ -18,16 +16,6 @@ void testGetConfigString() { } - @Test - void testToOrmConnectionConnectionClassOfTString() { - Sorm sorm = SormTestUtils.createSormAndDropAndCreateTableAll(); - TypedOrmConnection orm = SormFactory.toOrmConnection(sorm.getJdbcConnection(), - Guest.class, SormFactory.DEFAULT_CONFIG_NAME); - orm.insert(GUEST_ALICE); - assertThat(orm.untype().readOne(Integer.class, "select count(*) from guests")).isEqualTo(1); - - - } @Test void testToOrmConnectionConnectionString() { diff --git a/src/test/java/org/nkjmlab/sorm4j/SormTest.java b/src/test/java/org/nkjmlab/sorm4j/SormTest.java index fa7ee848..39f07dac 100644 --- a/src/test/java/org/nkjmlab/sorm4j/SormTest.java +++ b/src/test/java/org/nkjmlab/sorm4j/SormTest.java @@ -164,7 +164,7 @@ void testRunTransactionClassOfTConsumerOfTypedOrmTransactionOfT() { tr.commit(); } sorm.acceptJdbcConnectionHandler(con -> { - assertThat(SormFactory.toOrmConnection(con, Guest.class).readAll().size()).isEqualTo(0); + assertThat(SormFactory.toOrmConnection(con).type(Guest.class).readAll().size()).isEqualTo(0); }); } @@ -176,14 +176,14 @@ void testBeginTransaction() { // auto-rollback } sorm.acceptJdbcConnectionHandler(con -> { - assertThat(SormFactory.toOrmConnection(con, Guest.class).readAll().size()).isEqualTo(0); + assertThat(SormFactory.toOrmConnection(con).type(Guest.class).readAll().size()).isEqualTo(0); }); try (OrmConnection tr = sorm.openTransaction()) { tr.insert(a); tr.commit(); } sorm.acceptJdbcConnectionHandler(con -> { - assertThat(SormFactory.toOrmConnection(con, Guest.class).readAll().size()).isEqualTo(1); + assertThat(SormFactory.toOrmConnection(con).type(Guest.class).readAll().size()).isEqualTo(1); }); } diff --git a/src/test/java/repackage/net/sf/persist/tests/common/TestSimple.java b/src/test/java/repackage/net/sf/persist/tests/common/TestSimple.java index 1b9f0de6..af4a73c4 100644 --- a/src/test/java/repackage/net/sf/persist/tests/common/TestSimple.java +++ b/src/test/java/repackage/net/sf/persist/tests/common/TestSimple.java @@ -115,7 +115,8 @@ public void testExecuteUpdate() throws SQLException { @Test public void testExecuteUpdateAutoGeneratedKeys() throws SQLException { try (Connection conn = connectionPool.getConnection()) { - TypedOrmConnection simpleOrMapper = SormFactory.toOrmConnection(conn, Simple.class); + TypedOrmConnection simpleOrMapper = + SormFactory.toOrmConnection(conn).type(Simple.class); simpleOrMapper.insert(buildSimple()); From 79442885dcaec91f729b1b46b95557c3b7be1f15 Mon Sep 17 00:00:00 2001 From: Yuu Nakajima Date: Wed, 28 Apr 2021 23:59:47 +0900 Subject: [PATCH 17/20] Merge Query and Request into Command. --- .../java/org/nkjmlab/sorm4j/BasicCommand.java | 25 +++ .../org/nkjmlab/sorm4j/BasicCommandImpl.java | 49 +++++ .../org/nkjmlab/sorm4j/OrmConnection.java | 44 +---- .../internal/mapping/OrmConnectionImpl.java | 45 +---- .../mapping/TypedOrmConnectionImpl.java | 47 +---- .../sorm4j/internal/sql/AbstractCommand.java | 103 +++++++++++ .../sorm4j/internal/sql/AbstractQuery.java | 36 ---- .../sql/NamedParameterCommandImpl.java | 41 +++++ .../internal/sql/NamedParameterQueryImpl.java | 54 ------ .../sql/NamedParameterRequestImpl.java | 61 ------ .../sql/OrderedParameterCommandImpl.java | 35 ++++ .../sql/OrderedParameterQueryImpl.java | 48 ----- .../sql/OrderedParameterRequestImpl.java | 54 ------ .../internal/sql/ParameterizedSqlImpl.java | 2 +- .../sorm4j/internal/sql/SelectQueryImpl.java | 169 ----------------- ...Impl.java => SelectStringBuilderImpl.java} | 4 +- .../nkjmlab/sorm4j/sql/helper/Command.java | 174 ++++++++++++++++++ .../sql/helper/NamedParameterCommand.java | 40 ++++ .../sql/helper/NamedParameterQuery.java | 27 --- .../sql/helper/NamedParameterRequest.java | 40 ---- .../sql/helper/OrderedParameterCommand.java | 32 ++++ .../sql/helper/OrderedParameterQuery.java | 20 -- .../sql/helper/OrderedParameterRequest.java | 32 ---- .../org/nkjmlab/sorm4j/sql/helper/Query.java | 49 ----- .../nkjmlab/sorm4j/sql/helper/Request.java | 44 ----- .../sorm4j/sql/helper/SelectQuery.java | 86 --------- .../sql/helper/SelectStringBuilder.java | 4 +- .../sorm4j/typed/TypedOrmConnection.java | 40 +--- .../org/nkjmlab/sorm4j/OrmConnectionTest.java | 22 +-- .../sql/NamedParametersQueryImplTest.java | 72 -------- .../sql/OrderedParametersQueryTest.java | 37 ---- .../nkjmlab/sorm4j/sql/SelectQueryTest.java | 120 ------------ .../sorm4j/typed/TypedOrmConnectionTest.java | 6 +- 33 files changed, 536 insertions(+), 1126 deletions(-) create mode 100644 src/main/java/org/nkjmlab/sorm4j/BasicCommand.java create mode 100644 src/main/java/org/nkjmlab/sorm4j/BasicCommandImpl.java create mode 100644 src/main/java/org/nkjmlab/sorm4j/internal/sql/AbstractCommand.java delete mode 100644 src/main/java/org/nkjmlab/sorm4j/internal/sql/AbstractQuery.java create mode 100644 src/main/java/org/nkjmlab/sorm4j/internal/sql/NamedParameterCommandImpl.java delete mode 100644 src/main/java/org/nkjmlab/sorm4j/internal/sql/NamedParameterQueryImpl.java delete mode 100644 src/main/java/org/nkjmlab/sorm4j/internal/sql/NamedParameterRequestImpl.java create mode 100644 src/main/java/org/nkjmlab/sorm4j/internal/sql/OrderedParameterCommandImpl.java delete mode 100644 src/main/java/org/nkjmlab/sorm4j/internal/sql/OrderedParameterQueryImpl.java delete mode 100644 src/main/java/org/nkjmlab/sorm4j/internal/sql/OrderedParameterRequestImpl.java delete mode 100644 src/main/java/org/nkjmlab/sorm4j/internal/sql/SelectQueryImpl.java rename src/main/java/org/nkjmlab/sorm4j/internal/sql/{SelectBuilderImpl.java => SelectStringBuilderImpl.java} (92%) create mode 100644 src/main/java/org/nkjmlab/sorm4j/sql/helper/Command.java create mode 100644 src/main/java/org/nkjmlab/sorm4j/sql/helper/NamedParameterCommand.java delete mode 100644 src/main/java/org/nkjmlab/sorm4j/sql/helper/NamedParameterQuery.java delete mode 100644 src/main/java/org/nkjmlab/sorm4j/sql/helper/NamedParameterRequest.java create mode 100644 src/main/java/org/nkjmlab/sorm4j/sql/helper/OrderedParameterCommand.java delete mode 100644 src/main/java/org/nkjmlab/sorm4j/sql/helper/OrderedParameterQuery.java delete mode 100644 src/main/java/org/nkjmlab/sorm4j/sql/helper/OrderedParameterRequest.java delete mode 100644 src/main/java/org/nkjmlab/sorm4j/sql/helper/Query.java delete mode 100644 src/main/java/org/nkjmlab/sorm4j/sql/helper/Request.java delete mode 100644 src/main/java/org/nkjmlab/sorm4j/sql/helper/SelectQuery.java delete mode 100644 src/test/java/org/nkjmlab/sorm4j/sql/NamedParametersQueryImplTest.java delete mode 100644 src/test/java/org/nkjmlab/sorm4j/sql/OrderedParametersQueryTest.java delete mode 100644 src/test/java/org/nkjmlab/sorm4j/sql/SelectQueryTest.java diff --git a/src/main/java/org/nkjmlab/sorm4j/BasicCommand.java b/src/main/java/org/nkjmlab/sorm4j/BasicCommand.java new file mode 100644 index 00000000..151fa750 --- /dev/null +++ b/src/main/java/org/nkjmlab/sorm4j/BasicCommand.java @@ -0,0 +1,25 @@ +package org.nkjmlab.sorm4j; + +import java.util.Map; +import org.nkjmlab.sorm4j.sql.helper.Command; +import org.nkjmlab.sorm4j.sql.helper.NamedParameterCommand; +import org.nkjmlab.sorm4j.sql.helper.OrderedParameterCommand; + +public interface BasicCommand extends Command { + + OrderedParameterCommand addParameter(Object parameter); + + OrderedParameterCommand addParameter(Object... parameters); + + NamedParameterCommand bindAll(Map keyValuePairOfNamedParameters); + + NamedParameterCommand bind(String key, Object value); + + NamedParameterCommand bindBean(Object bean); + + static BasicCommand from(OrmConnection conn, String sql) { + return new BasicCommandImpl(conn, sql); + } + + +} diff --git a/src/main/java/org/nkjmlab/sorm4j/BasicCommandImpl.java b/src/main/java/org/nkjmlab/sorm4j/BasicCommandImpl.java new file mode 100644 index 00000000..14b6d634 --- /dev/null +++ b/src/main/java/org/nkjmlab/sorm4j/BasicCommandImpl.java @@ -0,0 +1,49 @@ +package org.nkjmlab.sorm4j; + +import java.util.Map; +import org.nkjmlab.sorm4j.internal.sql.AbstractCommand; +import org.nkjmlab.sorm4j.sql.ParameterizedSql; +import org.nkjmlab.sorm4j.sql.helper.NamedParameterCommand; +import org.nkjmlab.sorm4j.sql.helper.OrderedParameterCommand; + +public class BasicCommandImpl extends AbstractCommand implements BasicCommand { + + private final String sql; + + public BasicCommandImpl(OrmConnection conn, String sql) { + super(conn); + this.sql = sql; + } + + @Override + public OrderedParameterCommand addParameter(Object parameter) { + return OrderedParameterCommand.from(conn, sql).addParameter(parameter); + } + + @Override + public OrderedParameterCommand addParameter(Object... parameters) { + return OrderedParameterCommand.from(conn, sql).addParameter(parameters); + } + + @Override + public NamedParameterCommand bindAll(Map keyValuePairOfNamedParameters) { + return NamedParameterCommand.from(conn, sql).bindAll(keyValuePairOfNamedParameters); + } + + @Override + public NamedParameterCommand bind(String key, Object value) { + return NamedParameterCommand.from(conn, sql).bind(key, value); + } + + @Override + public NamedParameterCommand bindBean(Object bean) { + return NamedParameterCommand.from(conn, sql).bindBean(bean); + } + + @Override + protected ParameterizedSql parse() { + return ParameterizedSql.from(sql); + } + + +} diff --git a/src/main/java/org/nkjmlab/sorm4j/OrmConnection.java b/src/main/java/org/nkjmlab/sorm4j/OrmConnection.java index 18049cca..fe8d143a 100644 --- a/src/main/java/org/nkjmlab/sorm4j/OrmConnection.java +++ b/src/main/java/org/nkjmlab/sorm4j/OrmConnection.java @@ -1,11 +1,6 @@ package org.nkjmlab.sorm4j; import org.nkjmlab.sorm4j.annotation.Experimental; -import org.nkjmlab.sorm4j.sql.helper.NamedParameterQuery; -import org.nkjmlab.sorm4j.sql.helper.NamedParameterRequest; -import org.nkjmlab.sorm4j.sql.helper.OrderedParameterQuery; -import org.nkjmlab.sorm4j.sql.helper.OrderedParameterRequest; -import org.nkjmlab.sorm4j.sql.helper.SelectQuery; import org.nkjmlab.sorm4j.typed.TypedOrmConnection; /** @@ -20,47 +15,12 @@ public interface OrmConnection extends OrmReader, OrmUpdater, OrmMapReader, SqlE /** - * Creates a {@link NamedParameterQuery} from SQL string. - * - * @param - * @param objectClass - * @param sql - * @return - */ - NamedParameterQuery createNamedParameterQuery(Class objectClass, String sql); - - /** - * Creates a {@link NamedParameterRequest} from SQL string. + * Creates a {@link BasicCommand} from SQL string. * * @param sql * @return */ - NamedParameterRequest createNamedParameterRequest(String sql); - - /** - * Creates a {@link OrderedParameterQuery} from SQL string. - * - * @param - * @param objectClass - * @param sql - */ - OrderedParameterQuery createOrderedParameterQuery(Class objectClass, String sql); - - /** - * Creates a {@link OrderedParameterRequest} from SQL string. - * - * @param sql - * @return - */ - OrderedParameterRequest createOrderedParameterRequest(String sql); - - - /** - * Creates a {@link SelectQuery}. - * - * @return - */ - SelectQuery createSelectQuery(Class objectClass); + BasicCommand createCommand(String sql); /** diff --git a/src/main/java/org/nkjmlab/sorm4j/internal/mapping/OrmConnectionImpl.java b/src/main/java/org/nkjmlab/sorm4j/internal/mapping/OrmConnectionImpl.java index f5a73c60..52fa65c3 100644 --- a/src/main/java/org/nkjmlab/sorm4j/internal/mapping/OrmConnectionImpl.java +++ b/src/main/java/org/nkjmlab/sorm4j/internal/mapping/OrmConnectionImpl.java @@ -12,6 +12,7 @@ import java.util.Optional; import java.util.function.Function; import java.util.function.Supplier; +import org.nkjmlab.sorm4j.BasicCommand; import org.nkjmlab.sorm4j.ConsumerHandler; import org.nkjmlab.sorm4j.FunctionHandler; import org.nkjmlab.sorm4j.OrmConnection; @@ -21,21 +22,12 @@ import org.nkjmlab.sorm4j.extension.SormLogger; import org.nkjmlab.sorm4j.extension.SormOptions; import org.nkjmlab.sorm4j.extension.SqlParametersSetter; -import org.nkjmlab.sorm4j.internal.sql.NamedParameterQueryImpl; -import org.nkjmlab.sorm4j.internal.sql.OrderedParameterQueryImpl; -import org.nkjmlab.sorm4j.internal.sql.QueryOrmExecutor; -import org.nkjmlab.sorm4j.internal.sql.SelectQueryImpl; import org.nkjmlab.sorm4j.internal.util.LogPoint; import org.nkjmlab.sorm4j.internal.util.LogPointFactory; import org.nkjmlab.sorm4j.internal.util.Try; import org.nkjmlab.sorm4j.sql.InsertResult; import org.nkjmlab.sorm4j.sql.LazyResultSet; import org.nkjmlab.sorm4j.sql.ParameterizedSql; -import org.nkjmlab.sorm4j.sql.helper.NamedParameterQuery; -import org.nkjmlab.sorm4j.sql.helper.NamedParameterRequest; -import org.nkjmlab.sorm4j.sql.helper.OrderedParameterQuery; -import org.nkjmlab.sorm4j.sql.helper.OrderedParameterRequest; -import org.nkjmlab.sorm4j.sql.helper.SelectQuery; import org.nkjmlab.sorm4j.sql.tuple.Tuple2; import org.nkjmlab.sorm4j.sql.tuple.Tuple3; import org.nkjmlab.sorm4j.sql.tuple.Tuples; @@ -160,37 +152,10 @@ public void commit() { } @Override - public NamedParameterQuery createNamedParameterQuery(Class objectClass, String sql) { - return NamedParameterQueryImpl.createFrom(new QueryOrmExecutor<>(this, objectClass), sql); + public BasicCommand createCommand(String sql) { + return BasicCommand.from(this, sql); } - - @Override - public NamedParameterRequest createNamedParameterRequest(String sql) { - return NamedParameterRequest.from(this, sql); - } - - - @Override - public OrderedParameterQuery createOrderedParameterQuery(Class objectClass, - String sql) { - return OrderedParameterQueryImpl.createFrom(new QueryOrmExecutor<>(this, objectClass), sql); - } - - @Override - public OrderedParameterRequest createOrderedParameterRequest(String sql) { - return OrderedParameterRequest.from(this, sql); - } - - - @Override - public SelectQuery createSelectQuery(Class objectClass) { - SelectQueryImpl ret = new SelectQueryImpl(new QueryOrmExecutor<>(this, objectClass)); - ret.from(getTableName(objectClass)); - return ret; - } - - @Override public int[] delete(List objects) { return applytoArray(objects, array -> delete(array)); @@ -812,7 +777,8 @@ public List> readTupleList(Class t1, Class List> readTupleList(Class t1, Class t2, ParameterizedSql sql) { + public List> readTupleList(Class t1, Class t2, + ParameterizedSql sql) { return readTupleList(t1, t2, sql.getSql(), sql.getParameters()); } @@ -885,4 +851,5 @@ public int[] updateOn(String tableName, @SuppressWarnings("unchecked") T... mapping -> mapping.update(getJdbcConnection(), objects), () -> new int[0]); } + } diff --git a/src/main/java/org/nkjmlab/sorm4j/internal/mapping/TypedOrmConnectionImpl.java b/src/main/java/org/nkjmlab/sorm4j/internal/mapping/TypedOrmConnectionImpl.java index 415f32eb..7a0d24b9 100644 --- a/src/main/java/org/nkjmlab/sorm4j/internal/mapping/TypedOrmConnectionImpl.java +++ b/src/main/java/org/nkjmlab/sorm4j/internal/mapping/TypedOrmConnectionImpl.java @@ -5,22 +5,14 @@ import java.sql.ResultSet; import java.util.List; import java.util.Map; +import org.nkjmlab.sorm4j.BasicCommand; import org.nkjmlab.sorm4j.ConsumerHandler; import org.nkjmlab.sorm4j.FunctionHandler; import org.nkjmlab.sorm4j.OrmConnection; import org.nkjmlab.sorm4j.RowMapper; -import org.nkjmlab.sorm4j.internal.sql.NamedParameterQueryImpl; -import org.nkjmlab.sorm4j.internal.sql.OrderedParameterQueryImpl; -import org.nkjmlab.sorm4j.internal.sql.QueryTypedOrmExecutor; -import org.nkjmlab.sorm4j.internal.sql.SelectQueryImpl; import org.nkjmlab.sorm4j.sql.InsertResult; import org.nkjmlab.sorm4j.sql.LazyResultSet; import org.nkjmlab.sorm4j.sql.ParameterizedSql; -import org.nkjmlab.sorm4j.sql.helper.NamedParameterQuery; -import org.nkjmlab.sorm4j.sql.helper.NamedParameterRequest; -import org.nkjmlab.sorm4j.sql.helper.OrderedParameterQuery; -import org.nkjmlab.sorm4j.sql.helper.OrderedParameterRequest; -import org.nkjmlab.sorm4j.sql.helper.SelectQuery; import org.nkjmlab.sorm4j.typed.TypedOrmConnection; /** @@ -65,37 +57,6 @@ public void commit() { } - @Override - public NamedParameterQuery createNamedParameterQuery(String sql) { - return NamedParameterQueryImpl.createFrom(new QueryTypedOrmExecutor<>(this), sql); - } - - @Override - public NamedParameterRequest createNamedParameterRequest(String sql) { - return NamedParameterRequest.from(this, sql); - } - - - @Override - public OrderedParameterQuery createOrderedParameterQuery(String sql) { - return OrderedParameterQueryImpl.createFrom(new QueryTypedOrmExecutor<>(this), sql); - } - - - @Override - public OrderedParameterRequest createOrderedParameterRequest(String sql) { - return OrderedParameterRequest.from(this, sql); - } - - - - @Override - public SelectQuery createSelectQuery() { - SelectQueryImpl ret = new SelectQueryImpl(new QueryTypedOrmExecutor<>(this)); - ret.from(getTableName()); - return ret; - } - @Override public int[] delete(List objects) { @@ -469,5 +430,11 @@ public void acceptPreparedStatementHandler(ParameterizedSql sql, conn.acceptPreparedStatementHandler(sql, handler); } + @Override + public BasicCommand createCommand(String sql) { + return BasicCommand.from(conn, sql); + } + + } diff --git a/src/main/java/org/nkjmlab/sorm4j/internal/sql/AbstractCommand.java b/src/main/java/org/nkjmlab/sorm4j/internal/sql/AbstractCommand.java new file mode 100644 index 00000000..78f5b05f --- /dev/null +++ b/src/main/java/org/nkjmlab/sorm4j/internal/sql/AbstractCommand.java @@ -0,0 +1,103 @@ +package org.nkjmlab.sorm4j.internal.sql; + +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.util.List; +import java.util.Map; +import org.nkjmlab.sorm4j.ConsumerHandler; +import org.nkjmlab.sorm4j.FunctionHandler; +import org.nkjmlab.sorm4j.OrmConnection; +import org.nkjmlab.sorm4j.RowMapper; +import org.nkjmlab.sorm4j.sql.LazyResultSet; +import org.nkjmlab.sorm4j.sql.ParameterizedSql; +import org.nkjmlab.sorm4j.sql.helper.Command; +import org.nkjmlab.sorm4j.sql.tuple.Tuple2; +import org.nkjmlab.sorm4j.sql.tuple.Tuple3; + +public abstract class AbstractCommand implements Command { + + protected final OrmConnection conn; + + public AbstractCommand(OrmConnection conn) { + this.conn = conn; + } + + protected abstract ParameterizedSql parse(); + + @Override + public void acceptPreparedStatementHandler(ConsumerHandler handler) { + conn.acceptPreparedStatementHandler(parse(), handler); + } + + @Override + public T applyPreparedStatementHandler(FunctionHandler handler) { + return conn.applyPreparedStatementHandler(parse(), handler); + } + + @Override + public T executeQuery(FunctionHandler resultSetHandler) { + return conn.executeQuery(parse(), resultSetHandler); + } + + @Override + public List executeQuery(RowMapper rowMapper) { + return conn.executeQuery(parse(), rowMapper); + } + + @Override + public int executeUpdate() { + return conn.executeUpdate(parse()); + } + + @Override + public T readOne(Class objectClass) { + return conn.readOne(objectClass, parse()); + } + + @Override + public T readFirst(Class objectClass) { + return conn.readFirst(objectClass, parse()); + } + + @Override + public LazyResultSet readLazy(Class objectClass) { + return conn.readLazy(objectClass, parse()); + } + + @Override + public List readList(Class objectClass) { + return conn.readList(objectClass, parse()); + } + + @Override + public Map readMapOne() { + return conn.readMapOne(parse()); + } + + @Override + public List> readMapList() { + return conn.readMapList(parse()); + } + + @Override + public LazyResultSet> readMapLazy() { + return conn.readMapLazy(parse()); + } + + @Override + public Map readMapFirst() { + return conn.readMapFirst(parse()); + } + + @Override + public List> readTupleList(Class t1, Class t2) { + return conn.readTupleList(t1, t2, parse()); + } + + @Override + public List> readTupleList(Class t1, Class t2, + Class t3) { + return conn.readTupleList(t1, t2, t3, parse()); + } + +} diff --git a/src/main/java/org/nkjmlab/sorm4j/internal/sql/AbstractQuery.java b/src/main/java/org/nkjmlab/sorm4j/internal/sql/AbstractQuery.java deleted file mode 100644 index be0ccb5d..00000000 --- a/src/main/java/org/nkjmlab/sorm4j/internal/sql/AbstractQuery.java +++ /dev/null @@ -1,36 +0,0 @@ -package org.nkjmlab.sorm4j.internal.sql; - -import java.util.List; -import org.nkjmlab.sorm4j.sql.LazyResultSet; -import org.nkjmlab.sorm4j.sql.ParameterizedSqlParser; -import org.nkjmlab.sorm4j.sql.helper.Query; - -public abstract class AbstractQuery implements Query, ParameterizedSqlParser { - protected final QueryExecutor executor; - - - public AbstractQuery(QueryExecutor executor) { - this.executor = executor; - } - - @Override - public T readOne() { - return executor.readOne(parse()); - } - - @Override - public T readFirst() { - return executor.readFirst(parse()); - } - - @Override - public LazyResultSet readLazy() { - return executor.readLazy(parse()); - } - - @Override - public List readList() { - return executor.readList(parse()); - } - -} diff --git a/src/main/java/org/nkjmlab/sorm4j/internal/sql/NamedParameterCommandImpl.java b/src/main/java/org/nkjmlab/sorm4j/internal/sql/NamedParameterCommandImpl.java new file mode 100644 index 00000000..8f81aca7 --- /dev/null +++ b/src/main/java/org/nkjmlab/sorm4j/internal/sql/NamedParameterCommandImpl.java @@ -0,0 +1,41 @@ +package org.nkjmlab.sorm4j.internal.sql; + +import java.util.Map; +import org.nkjmlab.sorm4j.OrmConnection; +import org.nkjmlab.sorm4j.sql.NamedParameterSql; +import org.nkjmlab.sorm4j.sql.ParameterizedSql; +import org.nkjmlab.sorm4j.sql.helper.NamedParameterCommand; + +public class NamedParameterCommandImpl extends AbstractCommand implements NamedParameterCommand { + + private final NamedParameterSql sql; + + public NamedParameterCommandImpl(OrmConnection conn, String sql) { + super(conn); + this.sql = NamedParameterSql.from(sql); + } + + @Override + public ParameterizedSql parse() { + return sql.parse(); + } + + @Override + public NamedParameterCommand bindAll(Map keyValuePairOfNamedParameters) { + sql.bindAll(keyValuePairOfNamedParameters); + return this; + } + + @Override + public NamedParameterCommand bind(String key, Object value) { + sql.bind(key, value); + return this; + } + + @Override + public NamedParameterCommand bindBean(Object bean) { + sql.bindBean(bean); + return this; + } + +} diff --git a/src/main/java/org/nkjmlab/sorm4j/internal/sql/NamedParameterQueryImpl.java b/src/main/java/org/nkjmlab/sorm4j/internal/sql/NamedParameterQueryImpl.java deleted file mode 100644 index 2119e746..00000000 --- a/src/main/java/org/nkjmlab/sorm4j/internal/sql/NamedParameterQueryImpl.java +++ /dev/null @@ -1,54 +0,0 @@ -package org.nkjmlab.sorm4j.internal.sql; - -import java.util.Map; -import org.nkjmlab.sorm4j.sql.NamedParameterSql; -import org.nkjmlab.sorm4j.sql.ParameterizedSql; -import org.nkjmlab.sorm4j.sql.helper.NamedParameterQuery; - -/** - * An implementation of {@link NamedParameterQuery} - * - * @author nkjm - * - * @param - */ -public class NamedParameterQueryImpl extends AbstractQuery implements NamedParameterQuery { - - private final NamedParameterSql namedParameterSql; - - NamedParameterQueryImpl(QueryExecutor executor, String sql) { - super(executor); - this.namedParameterSql = NamedParameterSql.from(sql); - } - - - @Override - public NamedParameterQuery bindAll(Map namedParams) { - namedParameterSql.bindAll(namedParams); - return this; - } - - @Override - public NamedParameterQuery bind(String key, Object value) { - namedParameterSql.bind(key, value); - return this; - } - - @Override - public ParameterizedSql parse() { - return namedParameterSql.parse(); - } - - - public static NamedParameterQuery createFrom(QueryExecutor executor, String sql) { - return new NamedParameterQueryImpl<>(executor, sql); - } - - - @Override - public NamedParameterQuery bindBean(Object bean) { - namedParameterSql.bindBean(bean); - return this; - } - -} diff --git a/src/main/java/org/nkjmlab/sorm4j/internal/sql/NamedParameterRequestImpl.java b/src/main/java/org/nkjmlab/sorm4j/internal/sql/NamedParameterRequestImpl.java deleted file mode 100644 index b8e856d4..00000000 --- a/src/main/java/org/nkjmlab/sorm4j/internal/sql/NamedParameterRequestImpl.java +++ /dev/null @@ -1,61 +0,0 @@ -package org.nkjmlab.sorm4j.internal.sql; - -import java.sql.ResultSet; -import java.util.List; -import java.util.Map; -import org.nkjmlab.sorm4j.FunctionHandler; -import org.nkjmlab.sorm4j.RowMapper; -import org.nkjmlab.sorm4j.SqlExecutor; -import org.nkjmlab.sorm4j.sql.NamedParameterSql; -import org.nkjmlab.sorm4j.sql.ParameterizedSql; -import org.nkjmlab.sorm4j.sql.helper.NamedParameterRequest; - -public class NamedParameterRequestImpl implements NamedParameterRequest { - - private final NamedParameterSql sql; - private final SqlExecutor sqlExecutor; - - public NamedParameterRequestImpl(SqlExecutor sqlExecutor, String sql) { - this.sql = NamedParameterSql.from(sql); - this.sqlExecutor = sqlExecutor; - } - - @Override - public T executeQuery(FunctionHandler resultSetHandler) { - return sqlExecutor.executeQuery(parse(), resultSetHandler); - } - - @Override - public List executeQuery(RowMapper rowMapper) { - return sqlExecutor.executeQuery(parse(), rowMapper); - } - - @Override - public int executeUpdate() { - return sqlExecutor.executeUpdate(parse()); - } - - @Override - public ParameterizedSql parse() { - return sql.parse(); - } - - @Override - public NamedParameterRequest bindAll(Map keyValuePairOfNamedParameters) { - sql.bindAll(keyValuePairOfNamedParameters); - return this; - } - - @Override - public NamedParameterRequest bind(String key, Object value) { - sql.bind(key, value); - return this; - } - - @Override - public NamedParameterRequest bindBean(Object bean) { - sql.bindBean(bean); - return this; - } - -} diff --git a/src/main/java/org/nkjmlab/sorm4j/internal/sql/OrderedParameterCommandImpl.java b/src/main/java/org/nkjmlab/sorm4j/internal/sql/OrderedParameterCommandImpl.java new file mode 100644 index 00000000..fe2b91cb --- /dev/null +++ b/src/main/java/org/nkjmlab/sorm4j/internal/sql/OrderedParameterCommandImpl.java @@ -0,0 +1,35 @@ +package org.nkjmlab.sorm4j.internal.sql; + +import org.nkjmlab.sorm4j.OrmConnection; +import org.nkjmlab.sorm4j.sql.OrderedParameterSql; +import org.nkjmlab.sorm4j.sql.ParameterizedSql; +import org.nkjmlab.sorm4j.sql.helper.OrderedParameterCommand; + +public class OrderedParameterCommandImpl extends AbstractCommand + implements OrderedParameterCommand { + + private final OrderedParameterSql sql; + + public OrderedParameterCommandImpl(OrmConnection conn, String sql) { + super(conn); + this.sql = OrderedParameterSql.from(sql); + } + + @Override + public ParameterizedSql parse() { + return sql.parse(); + } + + @Override + public OrderedParameterCommand addParameter(Object parameter) { + sql.addParameter(parameter); + return this; + } + + @Override + public OrderedParameterCommand addParameter(Object... parameters) { + sql.addParameter(parameters); + return this; + } + +} diff --git a/src/main/java/org/nkjmlab/sorm4j/internal/sql/OrderedParameterQueryImpl.java b/src/main/java/org/nkjmlab/sorm4j/internal/sql/OrderedParameterQueryImpl.java deleted file mode 100644 index d26ab52d..00000000 --- a/src/main/java/org/nkjmlab/sorm4j/internal/sql/OrderedParameterQueryImpl.java +++ /dev/null @@ -1,48 +0,0 @@ -package org.nkjmlab.sorm4j.internal.sql; - -import org.nkjmlab.sorm4j.sql.OrderedParameterSql; -import org.nkjmlab.sorm4j.sql.ParameterizedSql; -import org.nkjmlab.sorm4j.sql.helper.OrderedParameterQuery; - -/** - * An implementation of {@link OrderedParameterQuery} - * - * @author nkjm - * - * @param - */ -public class OrderedParameterQueryImpl extends AbstractQuery - implements OrderedParameterQuery { - - private final OrderedParameterSql orderedParameterSql; - - public OrderedParameterQueryImpl(QueryExecutor executor, String sql) { - super(executor); - this.orderedParameterSql = OrderedParameterSql.from(sql); - } - - @Override - public OrderedParameterQuery addParameter(Object parameter) { - orderedParameterSql.addParameter(parameter); - return this; - } - - @Override - public OrderedParameterQuery addParameter(Object... parameters) { - orderedParameterSql.addParameter(parameters); - return this; - } - - @Override - public ParameterizedSql parse() { - return orderedParameterSql.parse(); - } - - - public static OrderedParameterQuery createFrom(QueryExecutor executor, String sql) { - return new OrderedParameterQueryImpl<>(executor, sql); - } - - - -} diff --git a/src/main/java/org/nkjmlab/sorm4j/internal/sql/OrderedParameterRequestImpl.java b/src/main/java/org/nkjmlab/sorm4j/internal/sql/OrderedParameterRequestImpl.java deleted file mode 100644 index 146c6233..00000000 --- a/src/main/java/org/nkjmlab/sorm4j/internal/sql/OrderedParameterRequestImpl.java +++ /dev/null @@ -1,54 +0,0 @@ -package org.nkjmlab.sorm4j.internal.sql; - -import java.sql.ResultSet; -import java.util.List; -import org.nkjmlab.sorm4j.FunctionHandler; -import org.nkjmlab.sorm4j.RowMapper; -import org.nkjmlab.sorm4j.SqlExecutor; -import org.nkjmlab.sorm4j.sql.OrderedParameterSql; -import org.nkjmlab.sorm4j.sql.ParameterizedSql; -import org.nkjmlab.sorm4j.sql.helper.OrderedParameterRequest; - -public class OrderedParameterRequestImpl implements OrderedParameterRequest { - - private final OrderedParameterSql sql; - private final SqlExecutor sqlExecutor; - - public OrderedParameterRequestImpl(SqlExecutor sqlExecutor, String sql) { - this.sql = OrderedParameterSql.from(sql); - this.sqlExecutor = sqlExecutor; - } - - @Override - public T executeQuery(FunctionHandler resultSetHandler) { - return sqlExecutor.executeQuery(parse(), resultSetHandler); - } - - @Override - public List executeQuery(RowMapper rowMapper) { - return sqlExecutor.executeQuery(parse(), rowMapper); - } - - @Override - public int executeUpdate() { - return sqlExecutor.executeUpdate(parse()); - } - - @Override - public ParameterizedSql parse() { - return sql.parse(); - } - - @Override - public OrderedParameterRequest addParameter(Object parameter) { - sql.addParameter(parameter); - return this; - } - - @Override - public OrderedParameterRequest addParameter(Object... parameters) { - sql.addParameter(parameters); - return this; - } - -} diff --git a/src/main/java/org/nkjmlab/sorm4j/internal/sql/ParameterizedSqlImpl.java b/src/main/java/org/nkjmlab/sorm4j/internal/sql/ParameterizedSqlImpl.java index 516410b5..f292d3d9 100644 --- a/src/main/java/org/nkjmlab/sorm4j/internal/sql/ParameterizedSqlImpl.java +++ b/src/main/java/org/nkjmlab/sorm4j/internal/sql/ParameterizedSqlImpl.java @@ -53,10 +53,10 @@ public static ParameterizedSql parse(String sql, Object... parameters) { if (parameters.length == 0) { return st; } + st = sql.contains(LIST_PLACEHOLDER) ? parseListPlaceholder(sql, parameters) : st; st = sql.contains(EMBEDDED_PLACEHOLDER) ? parseEmbeddedPlaceholder(st.getSql(), st.getParameters()) : st; - st = sql.contains(LIST_PLACEHOLDER) ? parseListPlaceholder(sql, parameters) : st; return st; } diff --git a/src/main/java/org/nkjmlab/sorm4j/internal/sql/SelectQueryImpl.java b/src/main/java/org/nkjmlab/sorm4j/internal/sql/SelectQueryImpl.java deleted file mode 100644 index e3ad5636..00000000 --- a/src/main/java/org/nkjmlab/sorm4j/internal/sql/SelectQueryImpl.java +++ /dev/null @@ -1,169 +0,0 @@ -package org.nkjmlab.sorm4j.internal.sql; - -import java.util.Map; -import org.nkjmlab.sorm4j.sql.helper.NamedParameterQuery; -import org.nkjmlab.sorm4j.sql.helper.OrderedParameterQuery; -import org.nkjmlab.sorm4j.sql.helper.SelectStringBuilder; -import org.nkjmlab.sorm4j.sql.helper.SelectQuery; -import org.nkjmlab.sorm4j.sql.ParameterizedSql; - -/** - * This class represents a select query. This class has functions as SQL select builder. - * - * @author nkjm - * - * @param - */ -public class SelectQueryImpl extends AbstractQuery implements SelectQuery { - - private final SelectStringBuilder selectStringBuilder; - - - public SelectQueryImpl(QueryExecutor executor) { - super(executor); - this.selectStringBuilder = SelectStringBuilder.create(); - } - - private NamedParameterQuery withNamedParameter() { - return NamedParameterQueryImpl.createFrom(executor, build()); - } - - private OrderedParameterQuery withOrderedParameter() { - return OrderedParameterQueryImpl.createFrom(executor, build()); - } - - @Override - public OrderedParameterQuery addParameter(Object... parameters) { - OrderedParameterQuery ret = withOrderedParameter(); - ret.addParameter(parameters); - return ret; - } - - @Override - public OrderedParameterQuery addParameter(Object parameter) { - OrderedParameterQuery ret = withOrderedParameter(); - ret.addParameter(parameter); - return ret; - } - - @Override - public NamedParameterQuery bindAll(Map namedParams) { - NamedParameterQuery ret = withNamedParameter(); - ret.bindAll(namedParams); - return ret; - } - - @Override - public NamedParameterQuery bind(String key, Object value) { - NamedParameterQuery ret = withNamedParameter(); - ret.bind(key, value); - return ret; - } - @Override - public NamedParameterQuery bindBean(Object bean) { - NamedParameterQuery ret = withNamedParameter(); - ret.bindBean(bean); - return ret; - } - - - @Override - public ParameterizedSql parse() { - return ParameterizedSql.from(build()); - } - - @Override - public SelectQuery select(String... columns) { - selectStringBuilder.select(columns); - return this; - } - - @Override - public SelectQuery distinct() { - selectStringBuilder.distinct(); - return this; - } - - @Override - public SelectQuery from(String table) { - selectStringBuilder.from(table); - return this; - } - - @Override - public SelectQuery groupBy(String... columns) { - selectStringBuilder.groupBy(columns); - return this; - } - - @Override - public SelectQuery having(SelectStringBuilder.Condition condition) { - selectStringBuilder.having(condition); - return this; - } - - @Override - public SelectQuery having(String expr) { - selectStringBuilder.having(expr); - return this; - } - - @Override - public SelectQuery limit(int limit) { - selectStringBuilder.limit(limit); - return this; - } - - @Override - public SelectQuery limit(int limit, int offset) { - selectStringBuilder.limit(limit, offset); - return this; - } - - @Override - public SelectQuery orderBy(String column, String ascOrDesc) { - selectStringBuilder.orderBy(column, ascOrDesc); - return this; - } - - @Override - public SelectQuery orderBy(SelectStringBuilder.OrderBy... orderBys) { - selectStringBuilder.orderBy(orderBys); - return this; - } - - @Override - public String build() { - return selectStringBuilder.build(); - } - - @Override - public String toString() { - return selectStringBuilder.build(); - } - - @Override - public String toPrettyString() { - return selectStringBuilder.toPrettyString(); - } - - @Override - public String toPrettyString(boolean prettyPrint) { - return selectStringBuilder.toPrettyString(prettyPrint); - } - - @Override - public SelectQuery where(SelectStringBuilder.Condition condition) { - selectStringBuilder.where(condition); - return this; - } - - @Override - public SelectQuery where(String expr) { - selectStringBuilder.where(expr); - return this; - } - - -} - diff --git a/src/main/java/org/nkjmlab/sorm4j/internal/sql/SelectBuilderImpl.java b/src/main/java/org/nkjmlab/sorm4j/internal/sql/SelectStringBuilderImpl.java similarity index 92% rename from src/main/java/org/nkjmlab/sorm4j/internal/sql/SelectBuilderImpl.java rename to src/main/java/org/nkjmlab/sorm4j/internal/sql/SelectStringBuilderImpl.java index ccb2dbb6..307551fd 100644 --- a/src/main/java/org/nkjmlab/sorm4j/internal/sql/SelectBuilderImpl.java +++ b/src/main/java/org/nkjmlab/sorm4j/internal/sql/SelectStringBuilderImpl.java @@ -10,9 +10,9 @@ * @author nkjm * */ -public class SelectBuilderImpl implements SelectStringBuilder { +public class SelectStringBuilderImpl implements SelectStringBuilder { - public SelectBuilderImpl() {} + public SelectStringBuilderImpl() {} private boolean distinct; diff --git a/src/main/java/org/nkjmlab/sorm4j/sql/helper/Command.java b/src/main/java/org/nkjmlab/sorm4j/sql/helper/Command.java new file mode 100644 index 00000000..72b14b18 --- /dev/null +++ b/src/main/java/org/nkjmlab/sorm4j/sql/helper/Command.java @@ -0,0 +1,174 @@ +package org.nkjmlab.sorm4j.sql.helper; + +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.util.List; +import java.util.Map; +import org.nkjmlab.sorm4j.ConsumerHandler; +import org.nkjmlab.sorm4j.FunctionHandler; +import org.nkjmlab.sorm4j.OrmMapReader; +import org.nkjmlab.sorm4j.RowMapper; +import org.nkjmlab.sorm4j.annotation.Experimental; +import org.nkjmlab.sorm4j.annotation.OrmColumnAliasPrefix; +import org.nkjmlab.sorm4j.sql.LazyResultSet; +import org.nkjmlab.sorm4j.sql.tuple.Tuple2; +import org.nkjmlab.sorm4j.sql.tuple.Tuple3; + + +/** + * An executable request + * + * @author nkjm + * + */ +@Experimental +public interface Command { + /** + * Accepts handler for {@link PreparedStatement} which has sets the given parameters. + * + * @param handler + */ + @Experimental + void acceptPreparedStatementHandler(ConsumerHandler handler); + + + /** + * Applies handler for {@link PreparedStatement} which has sets the given parameters. + * + * @param + * @param handler + * @return + */ + @Experimental + T applyPreparedStatementHandler(FunctionHandler handler); + + /** + * Executes a query and apply the given handler to the returned result set. + * + * @param + * @param resultSetHandler + * @return + */ + T executeQuery(FunctionHandler resultSetHandler); + + + /** + * Executes a query and apply the given mapper to the each row in returned result set. + * + * @param + * @param rowMapper + * @return + */ + List executeQuery(RowMapper rowMapper); + + /** + * Executes an update and returns the number of rows modified. + * + * @return + */ + int executeUpdate(); + + + /** + * Reads an object from the database. + * + * @param + * @param objectClass + * @return + */ + T readFirst(Class objectClass); + + /** + * Returns an {@link LazyResultSet}. It is able to convert to Stream, List, and so on. + * + * @param + * @param objectClass + * @return + */ + LazyResultSet readLazy(Class objectClass); + + /** + * Reads a list of objects from the database by mapping the results of the parameterized SQL query + * into instances of the given object class. Only the columns returned from the SQL query will be + * set into the object instance. + * + * @param + * @param objectClass + * @return + */ + List readList(Class objectClass); + + /** + * Reads a list of objects from the database by mapping the results of the parameterized SQL query + * into instances of the given object class. Only the columns returned from the SQL query will be + * set into the object instance. + * + * @param + * @param objectClass + * @return + */ + T readOne(Class objectClass); + + + /** + * See {@link OrmMapReader#readMapFirst(String, Object...)} + * + * @return + */ + Map readMapFirst(); + + /** + * See {@link OrmMapReader#readMapLazy(String, Object...)} + * + * @return + */ + LazyResultSet> readMapLazy(); + + /** + * See {@link OrmMapReader#readMapList(String, Object...)} + * + * @return + */ + List> readMapList(); + + /** + * See {@link OrmMapReader#readMapOne(String, Object...)} + * + * @return + */ + Map readMapOne(); + + + /** + * Reads results as List of {@link Tuple2} for reading JOIN SQL results typically. + * + * @see {@link OrmColumnAliasPrefix} for use column alias prefix. + * + * @param + * @param + * @param t1 + * @param t2 + * @return + */ + @Experimental + List> readTupleList(Class t1, Class t2); + + /** + * Reads results as List of {@link Tuple3} for reading JOIN SQL results typically. + * + * @see {@link OrmColumnAliasPrefix} for use column alias prefix. + * + * @param + * @param + * @param t1 + * @param t2 + * @param parameters + * @return + */ + + @Experimental + List> readTupleList(Class t1, Class t2, Class t3); + + + +} diff --git a/src/main/java/org/nkjmlab/sorm4j/sql/helper/NamedParameterCommand.java b/src/main/java/org/nkjmlab/sorm4j/sql/helper/NamedParameterCommand.java new file mode 100644 index 00000000..5d029eca --- /dev/null +++ b/src/main/java/org/nkjmlab/sorm4j/sql/helper/NamedParameterCommand.java @@ -0,0 +1,40 @@ +package org.nkjmlab.sorm4j.sql.helper; + +import java.util.Map; +import org.nkjmlab.sorm4j.OrmConnection; +import org.nkjmlab.sorm4j.annotation.Experimental; +import org.nkjmlab.sorm4j.internal.sql.NamedParameterCommandImpl; +import org.nkjmlab.sorm4j.sql.NamedParameterSql; + + +/** + * An executable request with named parameters. + * + * @author nkjm + * + */ +public interface NamedParameterCommand extends NamedParameterSql, Command { + + + @Override + NamedParameterCommand bindAll(Map keyValuePairOfNamedParameters); + + @Override + NamedParameterCommand bind(String key, Object value); + + @Override + @Experimental + NamedParameterCommand bindBean(Object bean); + + /** + * Creates a request from SQL string. + * + * @param conn + * @param sql + * @return + */ + static NamedParameterCommand from(OrmConnection conn, String sql) { + return new NamedParameterCommandImpl(conn, sql); + } + +} diff --git a/src/main/java/org/nkjmlab/sorm4j/sql/helper/NamedParameterQuery.java b/src/main/java/org/nkjmlab/sorm4j/sql/helper/NamedParameterQuery.java deleted file mode 100644 index 49d38cae..00000000 --- a/src/main/java/org/nkjmlab/sorm4j/sql/helper/NamedParameterQuery.java +++ /dev/null @@ -1,27 +0,0 @@ -package org.nkjmlab.sorm4j.sql.helper; - -import java.util.Map; -import org.nkjmlab.sorm4j.annotation.Experimental; -import org.nkjmlab.sorm4j.sql.NamedParameterSql; - - -/** - * Query with named parameters. - * - * @author nkjm - * - * @param - */ -public interface NamedParameterQuery extends Query, NamedParameterSql { - - @Override - NamedParameterQuery bindAll(Map namedParams); - - @Override - NamedParameterQuery bind(String key, Object value); - - @Override - @Experimental - NamedParameterQuery bindBean(Object bean); - -} diff --git a/src/main/java/org/nkjmlab/sorm4j/sql/helper/NamedParameterRequest.java b/src/main/java/org/nkjmlab/sorm4j/sql/helper/NamedParameterRequest.java deleted file mode 100644 index b13048c9..00000000 --- a/src/main/java/org/nkjmlab/sorm4j/sql/helper/NamedParameterRequest.java +++ /dev/null @@ -1,40 +0,0 @@ -package org.nkjmlab.sorm4j.sql.helper; - -import java.util.Map; -import org.nkjmlab.sorm4j.SqlExecutor; -import org.nkjmlab.sorm4j.annotation.Experimental; -import org.nkjmlab.sorm4j.internal.sql.NamedParameterRequestImpl; -import org.nkjmlab.sorm4j.sql.NamedParameterSql; - - -/** - * An executable request with named parameters. - * - * @author nkjm - * - */ -public interface NamedParameterRequest extends NamedParameterSql, Request { - - - @Override - NamedParameterRequest bindAll(Map keyValuePairOfNamedParameters); - - @Override - NamedParameterRequest bind(String key, Object value); - - @Override - @Experimental - NamedParameterRequest bindBean(Object bean); - - /** - * Creates a request from SQL string. - * - * @param sqlExecutor - * @param sql - * @return - */ - static NamedParameterRequest from(SqlExecutor sqlExecutor, String sql) { - return new NamedParameterRequestImpl(sqlExecutor, sql); - } - -} diff --git a/src/main/java/org/nkjmlab/sorm4j/sql/helper/OrderedParameterCommand.java b/src/main/java/org/nkjmlab/sorm4j/sql/helper/OrderedParameterCommand.java new file mode 100644 index 00000000..f9c5a379 --- /dev/null +++ b/src/main/java/org/nkjmlab/sorm4j/sql/helper/OrderedParameterCommand.java @@ -0,0 +1,32 @@ +package org.nkjmlab.sorm4j.sql.helper; + +import org.nkjmlab.sorm4j.OrmConnection; +import org.nkjmlab.sorm4j.internal.sql.OrderedParameterCommandImpl; +import org.nkjmlab.sorm4j.sql.OrderedParameterSql; + +/** + * An executable request with ordered parameters. + * + * @author nkjm + * + */ +public interface OrderedParameterCommand extends OrderedParameterSql, Command { + + @Override + OrderedParameterCommand addParameter(Object parameter); + + @Override + OrderedParameterCommand addParameter(Object... parameters); + + /** + * Creates a request from SQL string. + * + * @param conn + * @param sql + * @return + */ + static OrderedParameterCommand from(OrmConnection conn, String sql) { + return new OrderedParameterCommandImpl(conn, sql); + } + +} diff --git a/src/main/java/org/nkjmlab/sorm4j/sql/helper/OrderedParameterQuery.java b/src/main/java/org/nkjmlab/sorm4j/sql/helper/OrderedParameterQuery.java deleted file mode 100644 index 2cbc37c7..00000000 --- a/src/main/java/org/nkjmlab/sorm4j/sql/helper/OrderedParameterQuery.java +++ /dev/null @@ -1,20 +0,0 @@ -package org.nkjmlab.sorm4j.sql.helper; - -import org.nkjmlab.sorm4j.sql.OrderedParameterSql; - -/** - * Query with ordered parameters. - * - * @author nkjm - * - * @param - */ -public interface OrderedParameterQuery extends Query, OrderedParameterSql { - - @Override - OrderedParameterQuery addParameter(Object... parameters); - - @Override - OrderedParameterQuery addParameter(Object parameter); - -} diff --git a/src/main/java/org/nkjmlab/sorm4j/sql/helper/OrderedParameterRequest.java b/src/main/java/org/nkjmlab/sorm4j/sql/helper/OrderedParameterRequest.java deleted file mode 100644 index e8d2b9f2..00000000 --- a/src/main/java/org/nkjmlab/sorm4j/sql/helper/OrderedParameterRequest.java +++ /dev/null @@ -1,32 +0,0 @@ -package org.nkjmlab.sorm4j.sql.helper; - -import org.nkjmlab.sorm4j.SqlExecutor; -import org.nkjmlab.sorm4j.internal.sql.OrderedParameterRequestImpl; -import org.nkjmlab.sorm4j.sql.OrderedParameterSql; - -/** - * An executable request with ordered parameters. - * - * @author nkjm - * - */ -public interface OrderedParameterRequest extends OrderedParameterSql, Request { - - @Override - OrderedParameterRequest addParameter(Object parameter); - - @Override - OrderedParameterRequest addParameter(Object... parameters); - - /** - * Creates a request from SQL string. - * - * @param sqlExecutor - * @param sql - * @return - */ - static OrderedParameterRequest from(SqlExecutor sqlExecutor, String sql) { - return new OrderedParameterRequestImpl(sqlExecutor, sql); - } - -} diff --git a/src/main/java/org/nkjmlab/sorm4j/sql/helper/Query.java b/src/main/java/org/nkjmlab/sorm4j/sql/helper/Query.java deleted file mode 100644 index e9fbc67d..00000000 --- a/src/main/java/org/nkjmlab/sorm4j/sql/helper/Query.java +++ /dev/null @@ -1,49 +0,0 @@ -package org.nkjmlab.sorm4j.sql.helper; - -import java.util.List; -import org.nkjmlab.sorm4j.annotation.Experimental; -import org.nkjmlab.sorm4j.sql.LazyResultSet; - -/** - * A query for reading and mapping a relation to object. - * - * @author nkjm - * - * @param - */ -@Experimental -public interface Query { - - /** - * Reads a list of objects from the database by mapping the results of the parameterized SQL query - * into instances of the given object class. Only the columns returned from the SQL query will be - * set into the object instance. - * - * @return - */ - T readOne(); - - /** - * Reads an object from the database. - * - * @return - */ - T readFirst(); - - /** - * Returns an {@link LazyResultSet}. It is able to convert to Stream, List, and so on. - * - * @return - */ - LazyResultSet readLazy(); - - /** - * Reads a list of objects from the database by mapping the results of the parameterized SQL query - * into instances of the given object class. Only the columns returned from the SQL query will be - * set into the object instance. - * - * @return - */ - List readList(); - -} diff --git a/src/main/java/org/nkjmlab/sorm4j/sql/helper/Request.java b/src/main/java/org/nkjmlab/sorm4j/sql/helper/Request.java deleted file mode 100644 index 269aa5ab..00000000 --- a/src/main/java/org/nkjmlab/sorm4j/sql/helper/Request.java +++ /dev/null @@ -1,44 +0,0 @@ -package org.nkjmlab.sorm4j.sql.helper; - -import java.sql.ResultSet; -import java.util.List; -import org.nkjmlab.sorm4j.FunctionHandler; -import org.nkjmlab.sorm4j.RowMapper; -import org.nkjmlab.sorm4j.annotation.Experimental; - - -/** - * An executable request - * - * @author nkjm - * - */ -@Experimental -public interface Request { - - /** - * Executes a query and apply the given handler to the returned result set. - * - * @param - * @param resultSetHandler - * @return - */ - T executeQuery(FunctionHandler resultSetHandler); - - - /** - * Executes a query and apply the given mapper to the each row in returned result set. - * - * @param - * @param rowMapper - * @return - */ - List executeQuery(RowMapper rowMapper); - - /** - * Executes an update and returns the number of rows modified. - * - * @return - */ - int executeUpdate(); -} diff --git a/src/main/java/org/nkjmlab/sorm4j/sql/helper/SelectQuery.java b/src/main/java/org/nkjmlab/sorm4j/sql/helper/SelectQuery.java deleted file mode 100644 index 261302e9..00000000 --- a/src/main/java/org/nkjmlab/sorm4j/sql/helper/SelectQuery.java +++ /dev/null @@ -1,86 +0,0 @@ -package org.nkjmlab.sorm4j.sql.helper; - -import java.util.Map; -import org.nkjmlab.sorm4j.annotation.Experimental; -import org.nkjmlab.sorm4j.sql.NamedParameterSql; -import org.nkjmlab.sorm4j.sql.OrderedParameterSql; -import org.nkjmlab.sorm4j.sql.ParameterizedSqlParser; - - -/** - * A query with builder for reading and mapping a relation to object. - * - * @author nkjm - * - * @param - */ -@Experimental -public interface SelectQuery extends SelectStringBuilder, NamedParameterSql, OrderedParameterSql, - ParameterizedSqlParser, Query { - @Override - OrderedParameterQuery addParameter(Object... parameters); - - @Override - OrderedParameterQuery addParameter(Object parameter); - - @Override - NamedParameterQuery bindAll(Map namedParams); - - @Override - NamedParameterQuery bind(String key, Object value); - - @Override - @Experimental - NamedParameterQuery bindBean(Object bean); - - - @Override - SelectQuery select(String... columns); - - @Override - SelectQuery distinct(); - - /** - * Sets the table name. The value automatically sets based on the given class. - * - */ - @Override - SelectQuery from(String table); - - @Override - SelectQuery groupBy(String... columns); - - @Override - SelectQuery having(SelectStringBuilder.Condition condition); - - @Override - SelectQuery having(String expr); - - @Override - SelectQuery limit(int limit); - - @Override - SelectQuery limit(int limit, int offset); - - @Override - SelectQuery orderBy(String column, String ascOrDesc); - - @Override - SelectQuery orderBy(SelectStringBuilder.OrderBy... orderBys); - - @Override - String build(); - - @Override - String toPrettyString(); - - @Override - String toPrettyString(boolean prettyPrint); - - @Override - SelectQuery where(SelectStringBuilder.Condition condition); - - @Override - SelectQuery where(String expr); - -} diff --git a/src/main/java/org/nkjmlab/sorm4j/sql/helper/SelectStringBuilder.java b/src/main/java/org/nkjmlab/sorm4j/sql/helper/SelectStringBuilder.java index 2ae5b845..a26eaf53 100644 --- a/src/main/java/org/nkjmlab/sorm4j/sql/helper/SelectStringBuilder.java +++ b/src/main/java/org/nkjmlab/sorm4j/sql/helper/SelectStringBuilder.java @@ -3,7 +3,7 @@ import java.util.Arrays; import java.util.stream.Collectors; import org.nkjmlab.sorm4j.annotation.Experimental; -import org.nkjmlab.sorm4j.internal.sql.SelectBuilderImpl; +import org.nkjmlab.sorm4j.internal.sql.SelectStringBuilderImpl; /** @@ -118,7 +118,7 @@ public static SelectStringBuilder.Condition cond(String left, String op, String * @return */ public static SelectStringBuilder create() { - return new SelectBuilderImpl(); + return new SelectStringBuilderImpl(); } /** diff --git a/src/main/java/org/nkjmlab/sorm4j/typed/TypedOrmConnection.java b/src/main/java/org/nkjmlab/sorm4j/typed/TypedOrmConnection.java index c81af35d..212537d5 100644 --- a/src/main/java/org/nkjmlab/sorm4j/typed/TypedOrmConnection.java +++ b/src/main/java/org/nkjmlab/sorm4j/typed/TypedOrmConnection.java @@ -1,16 +1,12 @@ package org.nkjmlab.sorm4j.typed; +import org.nkjmlab.sorm4j.BasicCommand; import org.nkjmlab.sorm4j.OrmConnection; import org.nkjmlab.sorm4j.OrmMapReader; import org.nkjmlab.sorm4j.ResultSetMapMapper; import org.nkjmlab.sorm4j.SqlExecutor; import org.nkjmlab.sorm4j.TransactionFunction; import org.nkjmlab.sorm4j.annotation.Experimental; -import org.nkjmlab.sorm4j.sql.helper.NamedParameterQuery; -import org.nkjmlab.sorm4j.sql.helper.NamedParameterRequest; -import org.nkjmlab.sorm4j.sql.helper.OrderedParameterQuery; -import org.nkjmlab.sorm4j.sql.helper.OrderedParameterRequest; -import org.nkjmlab.sorm4j.sql.helper.SelectQuery; /** * Main API for typed object relation mapping. The api consists of {@link TypedOrmReader}, @@ -24,45 +20,15 @@ public interface TypedOrmConnection extends TypedOrmReader, TypedOrmUpdater, OrmMapReader, SqlExecutor, TypedResultSetMapper, ResultSetMapMapper, TransactionFunction, AutoCloseable { - /** - * Creates a {@link NamedParameterQuery} from SQL string. - * - * @param sql - * @return - */ - NamedParameterQuery createNamedParameterQuery(String sql); - - /** - * Creates a {@link NamedParameterRequest} from SQL string. - * - * @param sql - * @return - */ - NamedParameterRequest createNamedParameterRequest(String sql); /** - * Creates a {@link OrderedParameterQuery} from SQL string. + * Creates a {@link BasicCommand} from SQL string. * * @param sql * @return */ - OrderedParameterQuery createOrderedParameterQuery(String sql); + BasicCommand createCommand(String sql); - /** - * Creates a {@link OrderedParameterRequest} from SQL string. - * - * @param sql - * @return - */ - OrderedParameterRequest createOrderedParameterRequest(String sql); - - - /** - * Creates a {@link SelectQuery}. - * - * @return - */ - SelectQuery createSelectQuery(); /** * Gets the table name mapping to this objects. diff --git a/src/test/java/org/nkjmlab/sorm4j/OrmConnectionTest.java b/src/test/java/org/nkjmlab/sorm4j/OrmConnectionTest.java index 9636273e..e2e052cd 100644 --- a/src/test/java/org/nkjmlab/sorm4j/OrmConnectionTest.java +++ b/src/test/java/org/nkjmlab/sorm4j/OrmConnectionTest.java @@ -87,7 +87,7 @@ void testJoin() { void testNamedRequest1() { AtomicInteger id = new AtomicInteger(10); int row = sorm.apply( - conn -> conn.createNamedParameterRequest("insert into players values(:id, :name, :address)") + conn -> conn.createCommand("insert into players values(:id, :name, :address)") .bindBean(new Player(1, "Frank", "Tokyo")).executeUpdate()); assertThat(row).isEqualTo(1); Player p = sorm.apply(conn -> conn.readAll(Player.class)).get(0); @@ -99,13 +99,14 @@ void testNamedRequest() { int row = sorm.apply( - conn -> conn.createNamedParameterRequest("insert into players values(:id, :name, :address)") + conn -> conn.createCommand("insert into players values(:id, :name, :address)") .bindAll(Map.of("id", id.incrementAndGet(), "name", "Frank", "address", "Tokyo")) .executeUpdate()); assertThat(row).isEqualTo(1); row = sorm.apply( - conn -> conn.createNamedParameterRequest("insert into players values(:id, :name, :address)") + conn -> conn + .createCommand("insert into players values(:id, :name, :address)") .bind("id", id.incrementAndGet()).bind("name", "Frank").bind("address", "Tokyo") .executeUpdate()); assertThat(row).isEqualTo(1); @@ -119,13 +120,12 @@ void testNamedRequest() { }); assertThat(row).isEqualTo(1); - List ret = - sorm.apply(conn -> conn.createNamedParameterRequest("select * from players where id=:id") - .bind("id", id.get()).executeQuery((rs, rowNum) -> conn.mapRow(Player.class, rs))); + List ret = sorm.apply(conn -> conn.createCommand("select * from players where id=:id") + .bind("id", id.get()).executeQuery((rs, rowNum) -> conn.mapRow(Player.class, rs))); assertThat(ret.size()).isEqualTo(1); - ret = sorm.apply(conn -> conn.createNamedParameterRequest("select * from players where id=:id") + ret = sorm.apply(conn -> conn.createCommand("select * from players where id=:id") .bind("id", id.get()).executeQuery(rs -> conn.mapRowList(Player.class, rs))); assertThat(ret.size()).isEqualTo(1); @@ -135,23 +135,23 @@ void testNamedRequest() { void testOrderedRequest() { AtomicInteger id = new AtomicInteger(10); int row = - sorm.apply(conn -> conn.createOrderedParameterRequest("insert into players values(?,?,?)") + sorm.apply(conn -> conn.createCommand("insert into players values(?,?,?)") .addParameter(id.incrementAndGet(), "Frank", "Tokyo").executeUpdate()); assertThat(row).isEqualTo(1); List ret = sorm.apply( - conn -> conn.createOrderedParameterRequest("select * from players where id=? and name=?") + conn -> conn.createCommand("select * from players where id=? and name=?") .addParameter(id.get(), "Frank").executeQuery(rs -> conn.mapRowList(Player.class, rs))); assertThat(ret.size()).isEqualTo(1); - row = sorm.apply(conn -> conn.createOrderedParameterRequest("insert into players values(?,?,?)") + row = sorm.apply(conn -> conn.createCommand("insert into players values(?,?,?)") .addParameter(id.incrementAndGet()).addParameter("Frank").addParameter("Tokyo") .executeUpdate()); assertThat(row).isEqualTo(1); - ret = sorm.apply(conn -> conn.createOrderedParameterRequest("select * from players where id=?") + ret = sorm.apply(conn -> conn.createCommand("select * from players where id=?") .addParameter(id.get()).executeQuery((rs, rowNum) -> conn.mapRow(Player.class, rs))); assertThat(ret.size()).isEqualTo(1); diff --git a/src/test/java/org/nkjmlab/sorm4j/sql/NamedParametersQueryImplTest.java b/src/test/java/org/nkjmlab/sorm4j/sql/NamedParametersQueryImplTest.java deleted file mode 100644 index ddec1223..00000000 --- a/src/test/java/org/nkjmlab/sorm4j/sql/NamedParametersQueryImplTest.java +++ /dev/null @@ -1,72 +0,0 @@ -package org.nkjmlab.sorm4j.sql; - -import static org.assertj.core.api.Assertions.*; -import static org.nkjmlab.sorm4j.common.SormTestUtils.*; -import java.util.Map; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.nkjmlab.sorm4j.Sorm; -import org.nkjmlab.sorm4j.common.Player; -import org.nkjmlab.sorm4j.common.SormTestUtils; - -class NamedParametersQueryImplTest { - - private Sorm sorm; - - @BeforeEach - void testBeforeEach() { - this.sorm = SormTestUtils.createSormAndDropAndCreateTableAll(); - } - - @Test - void testToSqlStatement() { - sorm.accept(con -> { - con.insert(PLAYER_ALICE); - ParameterizedSql ret = con.type(Player.class) - .createNamedParameterQuery("select * from players where id=:id and name=:name").parse(); - assertThat(ret.getSql()).isEqualTo( - ParameterizedSql.from("select * from players where id=:id and name=:name").getSql()); - }); - sorm.accept(con -> { - ParameterizedSql ret = con.createNamedParameterQuery(Player.class, - "select * from players where id=:id and name=:name").parse(); - assertThat(ret.getSql()).isEqualTo( - ParameterizedSql.from("select * from players where id=:id and name=:name").getSql()); - }); - } - - @Test - void testBindAll() { - sorm.accept(con -> { - con.insert(PLAYER_ALICE); - Player ret = con.type(Player.class) - .createNamedParameterQuery("select * from players where id=:id and name=:name") - .bindAll(Map.of("id", 1, "name", "Alice")).readOne(); - assertThat(ret).isEqualTo(PLAYER_ALICE); - }); - sorm.accept(con -> { - Player ret = con - .createNamedParameterQuery(Player.class, - "select * from players where id=:id and name=:name") - .bindAll(Map.of("id", 1, "name", "Alice")).readOne(); - assertThat(ret).isEqualTo(PLAYER_ALICE); - }); - } - - @Test - void testBind() { - sorm.accept(con -> { - con.insert(PLAYER_ALICE); - Player ret = - con.type(Player.class).createNamedParameterQuery("select * from players where id=:id") - .bind("id", 1).readFirst(); - assertThat(ret).isEqualTo(PLAYER_ALICE); - }); - sorm.accept(con -> { - Player ret = con.createNamedParameterQuery(Player.class, "select * from players where id=:id") - .bind("id", 1).readFirst(); - assertThat(ret).isEqualTo(PLAYER_ALICE); - }); - } - -} diff --git a/src/test/java/org/nkjmlab/sorm4j/sql/OrderedParametersQueryTest.java b/src/test/java/org/nkjmlab/sorm4j/sql/OrderedParametersQueryTest.java deleted file mode 100644 index cb15bc6c..00000000 --- a/src/test/java/org/nkjmlab/sorm4j/sql/OrderedParametersQueryTest.java +++ /dev/null @@ -1,37 +0,0 @@ -package org.nkjmlab.sorm4j.sql; - -import static org.assertj.core.api.Assertions.*; -import static org.nkjmlab.sorm4j.common.SormTestUtils.*; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.nkjmlab.sorm4j.Sorm; -import org.nkjmlab.sorm4j.common.Player; -import org.nkjmlab.sorm4j.common.SormTestUtils; - -class OrderedParametersQueryTest { - - private Sorm sorm; - - @BeforeEach - void testBeforeEach() { - this.sorm = SormTestUtils.createSormAndDropAndCreateTableAll(); - } - - @Test - void testAddObjectArray() { - sorm.accept(conn -> { - conn.insert(PLAYER_ALICE); - Player ret = - conn.type(Player.class).createOrderedParameterQuery("select * from PLAYERS where ID=?") - .addParameter(1).readList().get(0); - assertThat(ret).isEqualTo(PLAYER_ALICE); - }); - sorm.accept(conn -> { - Player ret = - conn.createOrderedParameterQuery(Player.class, "select * from PLAYERS where ID=?") - .addParameter(1).readList().get(0); - assertThat(ret).isEqualTo(PLAYER_ALICE); - }); - } - -} diff --git a/src/test/java/org/nkjmlab/sorm4j/sql/SelectQueryTest.java b/src/test/java/org/nkjmlab/sorm4j/sql/SelectQueryTest.java deleted file mode 100644 index 21d21b41..00000000 --- a/src/test/java/org/nkjmlab/sorm4j/sql/SelectQueryTest.java +++ /dev/null @@ -1,120 +0,0 @@ -package org.nkjmlab.sorm4j.sql; - -import static org.assertj.core.api.Assertions.*; -import static org.nkjmlab.sorm4j.common.SormTestUtils.*; -import static org.nkjmlab.sorm4j.sql.helper.SelectStringBuilder.*; -import java.util.Map; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.nkjmlab.sorm4j.Sorm; -import org.nkjmlab.sorm4j.common.Guest; -import org.nkjmlab.sorm4j.common.Player; -import org.nkjmlab.sorm4j.common.SormTestUtils; -import org.nkjmlab.sorm4j.sql.helper.SelectStringBuilder; -import org.nkjmlab.sorm4j.sql.helper.SelectQuery; - -class SelectQueryTest { - - private Sorm sorm; - - @BeforeEach - void testBeforeEach() { - this.sorm = SormTestUtils.createSormAndDropAndCreateTableAll(); - sorm.accept(con -> con.insert(SormTestUtils.PLAYER_ALICE)); - } - - @Test - void testExecBindQuery() { - sorm.accept(con -> assertThat( - con.type(Player.class).createSelectQuery().where("id=:id").bind("id", 1).readLazy().one()) - .isEqualTo(PLAYER_ALICE)); - sorm.accept(con -> assertThat( - con.createSelectQuery(Player.class).where("id=:id").bind("id", 1).readLazy().one()) - .isEqualTo(PLAYER_ALICE)); - - sorm.accept(con -> assertThat( - con.createNamedParameterQuery(Player.class, "select * from players where id=:id") - .bind("id", 1).readLazy().one()).isEqualTo(PLAYER_ALICE)); - - sorm.accept(con -> assertThat( - con.createOrderedParameterQuery(Player.class, "select * from players where id=?") - .addParameter(1).readLazy().one()).isEqualTo(PLAYER_ALICE)); - - } - - @Test - void testExecBindAllQuery() { - sorm.accept(con -> assertThat(con.type(Player.class).createSelectQuery().where("id=:id") - .bindAll(Map.of("id", 1)).readLazy().one()).isEqualTo(PLAYER_ALICE)); - } - - @Test - void testExecAddQuery() { - sorm.accept(con -> assertThat( - con.type(Player.class).createSelectQuery().where("id=?").addParameter(1).readLazy().one()) - .isEqualTo(PLAYER_ALICE)); - } - - @Test - void testExecAddAllQuery() { - sorm.accept( - con -> assertThat(con.type(Player.class).createSelectQuery().where(and("id=?", "name=?")) - .addParameter(PLAYER_ALICE.getId(), PLAYER_ALICE.getName()).readLazy().one()) - .isEqualTo(PLAYER_ALICE)); - } - - @Test - void testSelectQueryCond() { - sorm.accept(con -> { - SelectQuery builder = con.type(Guest.class).createSelectQuery(); - builder.orderBy(order("id", "asc")); - builder.having("avg(age)>100"); - assertThat(builder.toString()) - .isEqualTo("select * from GUESTS having avg(age)>100 order by id asc"); - - builder.having(cond("avg(age)>1000")); - assertThat(builder.toString()) - .isEqualTo("select * from GUESTS having avg(age)>1000 order by id asc"); - - builder.limit(10, 30); - assertThat(builder.toString()).isEqualTo( - "select * from GUESTS having avg(age)>1000 order by id asc limit 10 offset 30"); - - }); - - } - - @Test - void testCompareSelectBuilderAndSelectQuery() { - sorm.accept(con -> { - SelectQuery builder = con.type(Guest.class).createSelectQuery(); - builder.select(as("avg(AGE)", "AVERAGE_AGE"), "TEAM"); - builder.where(or(and("ID>100", "COUNTRY IN (?)"), "YEAR>2001")); - builder.groupBy("TEAM"); - builder.having("avg(age)>0"); - builder.distinct(); - String sql = builder.from("GUESTS").orderBy("age", "desc").limit(10).build(); - System.out.println(sql); - assertThat(sql).contains( - "select distinct avg(AGE) as AVERAGE_AGE, TEAM from GUESTS where ((ID>100 and COUNTRY IN (?)) or YEAR>2001) group by TEAM having avg(age)>0 order by age desc limit 10"); - - SelectStringBuilder bs = SelectStringBuilder.create(); - bs.select(as("avg(AGE)", "AVERAGE_AGE"), "TEAM"); - bs.where(or(and("ID>100", "COUNTRY IN (?)"), "YEAR>2001")); - bs.groupBy("TEAM"); - bs.having("avg(age)>0"); - bs.distinct(); - bs.toString(); - String sql2 = bs.from("GUESTS").orderBy("age", "desc").limit(10).build(); - - assertThat(sql).isEqualTo(sql2); - assertThat(builder.parse().getSql()).isEqualTo(sql2); - assertThat(builder.toPrettyString()).isEqualTo(bs.toPrettyString()); - assertThat(builder.toPrettyString(true)).isEqualTo(bs.toPrettyString(true)); - }); - - } - - - -} diff --git a/src/test/java/org/nkjmlab/sorm4j/typed/TypedOrmConnectionTest.java b/src/test/java/org/nkjmlab/sorm4j/typed/TypedOrmConnectionTest.java index eee3f347..0c0fade5 100644 --- a/src/test/java/org/nkjmlab/sorm4j/typed/TypedOrmConnectionTest.java +++ b/src/test/java/org/nkjmlab/sorm4j/typed/TypedOrmConnectionTest.java @@ -53,14 +53,14 @@ void testApplyPreparedStatementHandler() { void testOrderedRequest() { AtomicInteger id = new AtomicInteger(10); - int row = sorm.apply( - conn -> conn.createNamedParameterRequest("insert into players values(:id, :name, :address)") + int row = + sorm.apply(conn -> conn.createCommand("insert into players values(:id, :name, :address)") .bindAll(Map.of("id", id.incrementAndGet(), "name", "Frank", "address", "Tokyo")) .executeUpdate()); assertThat(row).isEqualTo(1); - row = sorm.apply(conn -> conn.createOrderedParameterRequest("insert into players values(?,?,?)") + row = sorm.apply(conn -> conn.createCommand("insert into players values(?,?,?)") .addParameter(id.incrementAndGet()).addParameter("Frank").addParameter("Tokyo") .executeUpdate()); assertThat(row).isEqualTo(1); From 2dd2cafaede61d3c8988242431c0839a1a81f12e Mon Sep 17 00:00:00 2001 From: Yuu Nakajima Date: Thu, 29 Apr 2021 00:18:39 +0900 Subject: [PATCH 18/20] Remove unused classes --- .../sorm4j/internal/sql/QueryExecutor.java | 36 ----------------- .../sorm4j/internal/sql/QueryOrmExecutor.java | 40 ------------------- .../internal/sql/QueryTypedOrmExecutor.java | 37 ----------------- 3 files changed, 113 deletions(-) delete mode 100644 src/main/java/org/nkjmlab/sorm4j/internal/sql/QueryExecutor.java delete mode 100644 src/main/java/org/nkjmlab/sorm4j/internal/sql/QueryOrmExecutor.java delete mode 100644 src/main/java/org/nkjmlab/sorm4j/internal/sql/QueryTypedOrmExecutor.java diff --git a/src/main/java/org/nkjmlab/sorm4j/internal/sql/QueryExecutor.java b/src/main/java/org/nkjmlab/sorm4j/internal/sql/QueryExecutor.java deleted file mode 100644 index 0d6f02c8..00000000 --- a/src/main/java/org/nkjmlab/sorm4j/internal/sql/QueryExecutor.java +++ /dev/null @@ -1,36 +0,0 @@ -package org.nkjmlab.sorm4j.internal.sql; - -import java.util.List; -import org.nkjmlab.sorm4j.sql.LazyResultSet; -import org.nkjmlab.sorm4j.sql.ParameterizedSql; -import org.nkjmlab.sorm4j.typed.TypedOrmReader; - -public interface QueryExecutor { - /** - * see {@link TypedOrmReader#readOne(ParameterizedSql)} - * - * @return - */ - T readOne(ParameterizedSql parameterizedSql); - - /** - * see {@link TypedOrmReader#readFirst(ParameterizedSql)} - * - * @return - */ - T readFirst(ParameterizedSql parameterizedSql); - - /** - * see {@link TypedOrmReader#readLazy(ParameterizedSql)} - * - * @return - */ - LazyResultSet readLazy(ParameterizedSql parameterizedSql); - - /** - * see {@link TypedOrmReader#readList(ParameterizedSql)} - * - * @return - */ - List readList(ParameterizedSql parameterizedSql); -} diff --git a/src/main/java/org/nkjmlab/sorm4j/internal/sql/QueryOrmExecutor.java b/src/main/java/org/nkjmlab/sorm4j/internal/sql/QueryOrmExecutor.java deleted file mode 100644 index 2589cf26..00000000 --- a/src/main/java/org/nkjmlab/sorm4j/internal/sql/QueryOrmExecutor.java +++ /dev/null @@ -1,40 +0,0 @@ -package org.nkjmlab.sorm4j.internal.sql; - -import java.util.List; -import org.nkjmlab.sorm4j.OrmReader; -import org.nkjmlab.sorm4j.sql.LazyResultSet; -import org.nkjmlab.sorm4j.sql.ParameterizedSql; - -public class QueryOrmExecutor implements QueryExecutor { - - protected final OrmReader conn; - private final Class objectClass; - - - public QueryOrmExecutor(OrmReader conn, Class objectClass) { - this.conn = conn; - this.objectClass = objectClass; - } - - @Override - public T readOne(ParameterizedSql parameterizedSql) { - return conn.readOne(objectClass, parameterizedSql); - } - - @Override - public T readFirst(ParameterizedSql parameterizedSql) { - return conn.readFirst(objectClass, parameterizedSql); - } - - @Override - public LazyResultSet readLazy(ParameterizedSql parameterizedSql) { - return conn.readLazy(objectClass, parameterizedSql); - } - - @Override - public List readList(ParameterizedSql parameterizedSql) { - return conn.readList(objectClass, parameterizedSql); - } - - -} diff --git a/src/main/java/org/nkjmlab/sorm4j/internal/sql/QueryTypedOrmExecutor.java b/src/main/java/org/nkjmlab/sorm4j/internal/sql/QueryTypedOrmExecutor.java deleted file mode 100644 index 37b31cd5..00000000 --- a/src/main/java/org/nkjmlab/sorm4j/internal/sql/QueryTypedOrmExecutor.java +++ /dev/null @@ -1,37 +0,0 @@ -package org.nkjmlab.sorm4j.internal.sql; - -import java.util.List; -import org.nkjmlab.sorm4j.sql.LazyResultSet; -import org.nkjmlab.sorm4j.sql.ParameterizedSql; -import org.nkjmlab.sorm4j.typed.TypedOrmReader; - -public class QueryTypedOrmExecutor implements QueryExecutor { - - protected final TypedOrmReader conn; - - public QueryTypedOrmExecutor(TypedOrmReader conn) { - this.conn = conn; - } - - @Override - public T readOne(ParameterizedSql parameterizedSql) { - return conn.readOne(parameterizedSql); - } - - @Override - public T readFirst(ParameterizedSql parameterizedSql) { - return conn.readFirst(parameterizedSql); - } - - @Override - public LazyResultSet readLazy(ParameterizedSql parameterizedSql) { - return conn.readLazy(parameterizedSql); - } - - @Override - public List readList(ParameterizedSql parameterizedSql) { - return conn.readList(parameterizedSql); - } - - -} From 7132f786938d5e71a20cd1f2ef0a22efcf43fb07 Mon Sep 17 00:00:00 2001 From: Yuu Nakajima Date: Thu, 29 Apr 2021 00:19:40 +0900 Subject: [PATCH 19/20] Modify javadoc --- src/main/java/org/nkjmlab/sorm4j/sql/helper/Command.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/org/nkjmlab/sorm4j/sql/helper/Command.java b/src/main/java/org/nkjmlab/sorm4j/sql/helper/Command.java index 72b14b18..53b18832 100644 --- a/src/main/java/org/nkjmlab/sorm4j/sql/helper/Command.java +++ b/src/main/java/org/nkjmlab/sorm4j/sql/helper/Command.java @@ -162,7 +162,6 @@ public interface Command { * @param * @param t1 * @param t2 - * @param parameters * @return */ From bb1fca033f11187b2982d0260d37174a6e6c11ef Mon Sep 17 00:00:00 2001 From: Yuu Nakajima Date: Thu, 29 Apr 2021 00:22:46 +0900 Subject: [PATCH 20/20] Add experimental tag --- .../org/nkjmlab/sorm4j/sql/helper/NamedParameterCommand.java | 1 + .../org/nkjmlab/sorm4j/sql/helper/OrderedParameterCommand.java | 2 ++ src/main/java/org/nkjmlab/sorm4j/typed/TypedOrmConnection.java | 1 + 3 files changed, 4 insertions(+) diff --git a/src/main/java/org/nkjmlab/sorm4j/sql/helper/NamedParameterCommand.java b/src/main/java/org/nkjmlab/sorm4j/sql/helper/NamedParameterCommand.java index 5d029eca..ad670e9a 100644 --- a/src/main/java/org/nkjmlab/sorm4j/sql/helper/NamedParameterCommand.java +++ b/src/main/java/org/nkjmlab/sorm4j/sql/helper/NamedParameterCommand.java @@ -13,6 +13,7 @@ * @author nkjm * */ +@Experimental public interface NamedParameterCommand extends NamedParameterSql, Command { diff --git a/src/main/java/org/nkjmlab/sorm4j/sql/helper/OrderedParameterCommand.java b/src/main/java/org/nkjmlab/sorm4j/sql/helper/OrderedParameterCommand.java index f9c5a379..dac8fab4 100644 --- a/src/main/java/org/nkjmlab/sorm4j/sql/helper/OrderedParameterCommand.java +++ b/src/main/java/org/nkjmlab/sorm4j/sql/helper/OrderedParameterCommand.java @@ -1,6 +1,7 @@ package org.nkjmlab.sorm4j.sql.helper; import org.nkjmlab.sorm4j.OrmConnection; +import org.nkjmlab.sorm4j.annotation.Experimental; import org.nkjmlab.sorm4j.internal.sql.OrderedParameterCommandImpl; import org.nkjmlab.sorm4j.sql.OrderedParameterSql; @@ -10,6 +11,7 @@ * @author nkjm * */ +@Experimental public interface OrderedParameterCommand extends OrderedParameterSql, Command { @Override diff --git a/src/main/java/org/nkjmlab/sorm4j/typed/TypedOrmConnection.java b/src/main/java/org/nkjmlab/sorm4j/typed/TypedOrmConnection.java index 212537d5..70727c25 100644 --- a/src/main/java/org/nkjmlab/sorm4j/typed/TypedOrmConnection.java +++ b/src/main/java/org/nkjmlab/sorm4j/typed/TypedOrmConnection.java @@ -27,6 +27,7 @@ public interface TypedOrmConnection extends TypedOrmReader, TypedOrmUpdate * @param sql * @return */ + @Experimental BasicCommand createCommand(String sql);