Skip to content

Commit b7b4206

Browse files
committed
Parameter type converter can be compatible with Spring converters
1 parent 58c8521 commit b7b4206

File tree

8 files changed

+25
-28
lines changed

8 files changed

+25
-28
lines changed

src/main/java/org/mybatis/dynamic/sql/BindableColumn.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -47,8 +47,8 @@ default Optional<String> typeHandler() {
4747
default Optional<RenderingStrategy> renderingStrategy() {
4848
return Optional.empty();
4949
}
50-
51-
default Optional<ParameterTypeConverter<T>> parameterTypeConverter() {
52-
return Optional.empty();
50+
51+
default Object convertParameterType(T value) {
52+
return value;
5353
}
5454
}

src/main/java/org/mybatis/dynamic/sql/ParameterTypeConverter.java

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717

1818
/**
1919
* A parameter type converter is used to change a parameter value from one type to another
20-
* during statement rendering before the parameter is placed into the parameter map. This can be used
20+
* during statement rendering and before the parameter is placed into the parameter map. This can be used
2121
* to somewhat mimic the function of a MyBatis type handler for runtimes such as Spring that don't have
2222
* a corresponding concept.
2323
*
@@ -28,27 +28,27 @@
2828
*
2929
* <p>A parameter type converter is associated with a SqlColumn.
3030
*
31-
* <p>A parameter type converter is compatible with Spring's general Converter interface so existing converters
32-
* can be reused here if they are marked with this additional interface. The return type is always Object as the
33-
* converter is called immediately before a value is placed into a parameter Map and there is no longer any need for
34-
* the actual target type. Having a fixed return type removes quite a few generic hurdles.
31+
* <p>This interface is based on Spring's general Converter interface and is intentionally compatible with it.
32+
* Existing converters may be reused if they are marked with this additional interface.
3533
*
36-
* <p>The converter is only used for parameters - it is not used for result set processing. The converter will be
37-
* called in the following circumstances:
34+
* <p>The converter is only used for parameters in a parameter map. It is not used for result set processing.
35+
* It is also not used for insert statements that are based on an external record class. The converter will be called
36+
* in the following circumstances:
3837
*
3938
* <ul>
40-
* <li>Parameters in a general insert statement</li>
41-
* <li>Parameters in an update statement</li>
42-
* <li>Parameters in a where clause in any statement</li>
39+
* <li>Parameters in a general insert statement (for the Value and ValueWhenPresent mappings)</li>
40+
* <li>Parameters in an update statement (for the Value and ValueWhenPresent mappings)</li>
41+
* <li>Parameters in a where clause in any statement (for conditions that accept a value or multiple values)</li>
4342
* </ul>
4443
*
4544
* @param <S> Source Type
45+
* @param <T> Target Type
4646
*
4747
* @see SqlColumn
4848
* @author Jeff Butler
4949
* @since 1.1.5
5050
*/
5151
@FunctionalInterface
52-
public interface ParameterTypeConverter<S> {
53-
Object convert(S source);
52+
public interface ParameterTypeConverter<S, T> {
53+
T convert(S source);
5454
}

src/main/java/org/mybatis/dynamic/sql/SqlColumn.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ public class SqlColumn<T> implements BindableColumn<T>, SortSpecification {
3131
protected String alias;
3232
protected String typeHandler;
3333
protected RenderingStrategy renderingStrategy;
34-
protected ParameterTypeConverter<T> parameterTypeConverter;
34+
protected ParameterTypeConverter<T, ?> parameterTypeConverter;
3535

3636
private SqlColumn(Builder builder) {
3737
name = Objects.requireNonNull(builder.name);
@@ -49,7 +49,7 @@ protected SqlColumn(SqlColumn<?> sqlColumn) {
4949
alias = sqlColumn.alias;
5050
typeHandler = sqlColumn.typeHandler;
5151
renderingStrategy = sqlColumn.renderingStrategy;
52-
parameterTypeConverter = (ParameterTypeConverter<T>) sqlColumn.parameterTypeConverter;
52+
parameterTypeConverter = (ParameterTypeConverter<T, ?>) sqlColumn.parameterTypeConverter;
5353
}
5454

5555
public String name() {
@@ -76,8 +76,8 @@ public Optional<String> typeHandler() {
7676
}
7777

7878
@Override
79-
public Optional<ParameterTypeConverter<T>> parameterTypeConverter() {
80-
return Optional.ofNullable(parameterTypeConverter);
79+
public Object convertParameterType(T value) {
80+
return parameterTypeConverter == null ? value : parameterTypeConverter.convert(value);
8181
}
8282

8383
@Override
@@ -128,7 +128,7 @@ public <S> SqlColumn<S> withRenderingStrategy(RenderingStrategy renderingStrateg
128128
return column;
129129
}
130130

131-
public <S> SqlColumn<S> withParameterTypeConverter(ParameterTypeConverter<S> parameterTypeConverter) {
131+
public <S> SqlColumn<S> withParameterTypeConverter(ParameterTypeConverter<S, ?> parameterTypeConverter) {
132132
SqlColumn<S> column = new SqlColumn<>(this);
133133
column.parameterTypeConverter = parameterTypeConverter;
134134
return column;

src/main/java/org/mybatis/dynamic/sql/util/ValueMapping.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,7 @@ private ValueMapping(SqlColumn<T> column, Supplier<T> valueSupplier) {
3333
}
3434

3535
public Object value() {
36-
return localColumn.parameterTypeConverter().map(tc -> tc.convert(valueSupplier.get()))
37-
.orElseGet(valueSupplier);
36+
return localColumn.convertParameterType(valueSupplier.get());
3837
}
3938

4039
@Override

src/main/java/org/mybatis/dynamic/sql/util/ValueWhenPresentMapping.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ public Optional<Object> value() {
3838
}
3939

4040
private Object convert(T value) {
41-
return localColumn.parameterTypeConverter().map(tc -> tc.convert(value)).orElse(value);
41+
return localColumn.convertParameterType(value);
4242
}
4343

4444
@Override

src/main/java/org/mybatis/dynamic/sql/where/render/WhereConditionVisitor.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -118,9 +118,7 @@ public Optional<FragmentAndParameters> visit(AbstractColumnComparisonCondition<T
118118
}
119119

120120
private Object convertValue(T value) {
121-
return column.parameterTypeConverter()
122-
.map(tc -> tc.convert(value))
123-
.orElse(value);
121+
return column.convertParameterType(value);
124122
}
125123

126124
private FragmentAndParameters toFragmentAndParameters(T value) {

src/test/java/examples/spring/LastNameParameterConverter.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
import org.mybatis.dynamic.sql.ParameterTypeConverter;
1919
import org.springframework.core.convert.converter.Converter;
2020

21-
public class LastNameParameterConverter implements ParameterTypeConverter<LastName>, Converter<LastName, String> {
21+
public class LastNameParameterConverter implements ParameterTypeConverter<LastName, String>, Converter<LastName, String> {
2222
@Override
2323
public String convert(LastName source) {
2424
return source == null ? null : source.getName();

src/test/java/examples/spring/YesNoParameterConverter.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717

1818
import org.mybatis.dynamic.sql.ParameterTypeConverter;
1919

20-
public class YesNoParameterConverter implements ParameterTypeConverter<Boolean> {
20+
public class YesNoParameterConverter implements ParameterTypeConverter<Boolean, String> {
2121

2222
@Override
2323
public String convert(Boolean source) {

0 commit comments

Comments
 (0)