Skip to content

Commit ec868d7

Browse files
authored
Merge pull request #139 from jeffgbutler/kotlin-spring
Kotlin Extensions for Spring JDBC Template
2 parents cb9d3a4 + ee2fd4f commit ec868d7

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

54 files changed

+1916
-195
lines changed

CHANGELOG.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ GitHub milestone: [https://github.com/mybatis/mybatis-dynamic-sql/issues?q=miles
1111
- Added support for `count(distinct ...)` ([#112](https://github.com/mybatis/mybatis-dynamic-sql/issues/112))
1212
- Added support for multiple row inserts ([#116](https://github.com/mybatis/mybatis-dynamic-sql/issues/116))
1313
- Utility classes and a new canonical pattern for MyBatis Generator (CRUD) mappers ([#118](https://github.com/mybatis/mybatis-dynamic-sql/issues/118)) ([#125](https://github.com/mybatis/mybatis-dynamic-sql/pull/125)) ([#128](https://github.com/mybatis/mybatis-dynamic-sql/pull/128))
14-
- Kotlin Extensions and Kotlin DSL ([#133](https://github.com/mybatis/mybatis-dynamic-sql/pull/133))
14+
- Kotlin Extensions and Kotlin DSL ([#133](https://github.com/mybatis/mybatis-dynamic-sql/pull/133)) ([#139](https://github.com/mybatis/mybatis-dynamic-sql/pull/139))
1515

1616

1717
## Release 1.1.2 - July 5, 2019

README.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,10 @@ See the following pages for further information:
2626
|------|---------|
2727
|[Quick Start](src/site/markdown/docs/quickStart.md) | Shows a complete example of building code for this library |
2828
|[MyBatis3 Support](src/site/markdown/docs/mybatis3.md) | Information about specialized support for [MyBatis3](https://github.com/mybatis/mybatis-3). The examples on this page are similar to the code generated by [MyBatis Generator](https://github.com/mybatis/generator) |
29+
|[Kotlin Support with MyBatis3](src/site/markdown/docs/kotlinMyBatis3.md) | Information about the Kotlin extensions and Kotlin DSL when using MyBatis3 as the runtime |
2930
|[Spring Support](src/site/markdown/docs/spring.md) | Information about specialized support for Spring JDBC Templates |
31+
|[Kotlin Support with Spring](src/site/markdown/docs/kotlinSpring.md) | Information about the Kotlin extensions and Kotlin DSL when using Spring JDBC Template as the runtime |
3032
|[Spring Batch Support](src/site/markdown/docs/springBatch.md) | Information about specialized support for Spring Batch using the [MyBatis Spring Integration](https://github.com/mybatis/spring) |
31-
|[Kotlin Support](src/site/markdown/docs/kotlin.md) | Information about the Kotlin extensions and Kotlin DSL |
3233

3334
## Requirements
3435

pom.xml

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,8 @@
3535
<java.version>1.8</java.version>
3636
<maven.compiler.source>${java.version}</maven.compiler.source>
3737
<maven.compiler.target>${java.version}</maven.compiler.target>
38-
<junit.jupiter.version>5.5.1</junit.jupiter.version>
39-
<junit.platform.version>1.5.1</junit.platform.version>
38+
<junit.jupiter.version>5.5.2</junit.jupiter.version>
39+
<junit.platform.version>1.5.2</junit.platform.version>
4040
<spring.batch.version>4.1.2.RELEASE</spring.batch.version>
4141
<clirr.comparisonVersion>1.1.0</clirr.comparisonVersion>
4242
<module.name>org.mybatis.dynamic.sql</module.name>
@@ -173,6 +173,13 @@
173173
<version>${kotlin.version}</version>
174174
<scope>provided</scope>
175175
</dependency>
176+
<dependency>
177+
<groupId>org.springframework</groupId>
178+
<artifactId>spring-jdbc</artifactId>
179+
<version>5.1.9.RELEASE</version>
180+
<scope>provided</scope>
181+
</dependency>
182+
176183
<dependency>
177184
<groupId>org.junit.jupiter</groupId>
178185
<artifactId>junit-jupiter-api</artifactId>
@@ -191,7 +198,6 @@
191198
<version>${junit.platform.version}</version>
192199
<scope>test</scope>
193200
</dependency>
194-
195201
<dependency>
196202
<groupId>org.assertj</groupId>
197203
<artifactId>assertj-core</artifactId>
@@ -216,12 +222,6 @@
216222
<version>2.5.0</version>
217223
<scope>test</scope>
218224
</dependency>
219-
<dependency>
220-
<groupId>org.springframework</groupId>
221-
<artifactId>spring-jdbc</artifactId>
222-
<version>5.1.9.RELEASE</version>
223-
<scope>test</scope>
224-
</dependency>
225225
<dependency>
226226
<groupId>org.springframework.batch</groupId>
227227
<artifactId>spring-batch-core</artifactId>

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -96,8 +96,8 @@ public String renderWithTableAlias(TableAliasCalculator tableAliasCalculator) {
9696
.orElseGet(this::name);
9797
}
9898

99-
public <S> SqlColumn<S> withTypeHandler(String typeHandler) {
100-
SqlColumn<S> column = new SqlColumn<>(this);
99+
public SqlColumn<T> withTypeHandler(String typeHandler) {
100+
SqlColumn<T> column = new SqlColumn<>(this);
101101
column.typeHandler = typeHandler;
102102
return column;
103103
}

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,8 @@ public <T> SqlColumn<T> column(String name, JDBCType jdbcType) {
9898

9999
@NotNull
100100
public <T> SqlColumn<T> column(String name, JDBCType jdbcType, String typeHandler) {
101-
return SqlColumn.of(name, this, jdbcType).withTypeHandler(typeHandler);
101+
SqlColumn<T> column = SqlColumn.of(name, this, jdbcType);
102+
return column.withTypeHandler(typeHandler);
102103
}
103104

104105
public static SqlTable of(String name) {

src/main/java/org/mybatis/dynamic/sql/select/CountDSLCompleter.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
* client code look a bit cleaner.
2828
*
2929
* <p>This function is intended to by used in conjunction with a utility method like
30-
* {@link MyBatis3Utils#count(ToLongFunction, CountDSL, CountDSLCompleter)}
30+
* {@link MyBatis3Utils#countFrom(ToLongFunction, CountDSL, CountDSLCompleter)}
3131
*
3232
* <p>For example, you can create mapper interface methods like this:
3333
*

src/main/java/org/mybatis/dynamic/sql/util/mybatis3/MyBatis3Utils.java

Lines changed: 63 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,11 @@
1717

1818
import java.util.Collection;
1919
import java.util.List;
20-
import java.util.Optional;
2120
import java.util.function.Function;
2221
import java.util.function.ToIntFunction;
2322
import java.util.function.ToLongFunction;
2423
import java.util.function.UnaryOperator;
2524

26-
import org.jetbrains.annotations.NotNull;
27-
import org.jetbrains.annotations.Nullable;
2825
import org.mybatis.dynamic.sql.BasicColumn;
2926
import org.mybatis.dynamic.sql.SqlBuilder;
3027
import org.mybatis.dynamic.sql.SqlTable;
@@ -53,86 +50,110 @@
5350
public class MyBatis3Utils {
5451
private MyBatis3Utils() {}
5552

56-
public static long count(ToLongFunction<SelectStatementProvider> mapper,
53+
public static SelectStatementProvider countFrom(SqlTable table, CountDSLCompleter completer) {
54+
return countFrom(SqlBuilder.countFrom(table), completer);
55+
}
56+
57+
public static long countFrom(ToLongFunction<SelectStatementProvider> mapper,
5758
SqlTable table, CountDSLCompleter completer) {
58-
return count(mapper, SqlBuilder.countFrom(table), completer);
59+
return mapper.applyAsLong(countFrom(table, completer));
60+
}
61+
62+
public static SelectStatementProvider countFrom(CountDSL<SelectModel> start, CountDSLCompleter completer) {
63+
return completer.apply(start)
64+
.build()
65+
.render(RenderingStrategies.MYBATIS3);
5966
}
6067

61-
public static long count(ToLongFunction<SelectStatementProvider> mapper,
68+
public static long countFrom(ToLongFunction<SelectStatementProvider> mapper,
6269
CountDSL<SelectModel> start, CountDSLCompleter completer) {
63-
return mapper.applyAsLong(completer.apply(start).build().render(RenderingStrategies.MYBATIS3));
70+
return mapper.applyAsLong(countFrom(start, completer));
71+
}
72+
73+
public static DeleteStatementProvider deleteFrom(SqlTable table, DeleteDSLCompleter completer) {
74+
return completer.apply(SqlBuilder.deleteFrom(table))
75+
.build()
76+
.render(RenderingStrategies.MYBATIS3);
6477
}
6578

6679
public static int deleteFrom(ToIntFunction<DeleteStatementProvider> mapper,
6780
SqlTable table, DeleteDSLCompleter completer) {
68-
return mapper.applyAsInt(
69-
completer.apply(SqlBuilder.deleteFrom(table))
70-
.build()
71-
.render(RenderingStrategies.MYBATIS3));
81+
return mapper.applyAsInt(deleteFrom(table, completer));
7282
}
7383

84+
public static <R> InsertStatementProvider<R> insert(R record, SqlTable table, UnaryOperator<InsertDSL<R>> completer) {
85+
return completer.apply(SqlBuilder.insert(record).into(table))
86+
.build()
87+
.render(RenderingStrategies.MYBATIS3);
88+
}
89+
7490
public static <R> int insert(ToIntFunction<InsertStatementProvider<R>> mapper, R record,
7591
SqlTable table, UnaryOperator<InsertDSL<R>> completer) {
76-
return mapper.applyAsInt(completer.apply(
77-
SqlBuilder.insert(record).into(table)).build().render(RenderingStrategies.MYBATIS3));
92+
return mapper.applyAsInt(insert(record, table, completer));
7893
}
7994

95+
public static <R> MultiRowInsertStatementProvider<R> insertMultiple(Collection<R> records, SqlTable table,
96+
UnaryOperator<MultiRowInsertDSL<R>> completer) {
97+
return completer.apply(SqlBuilder.insertMultiple(records).into(table))
98+
.build()
99+
.render(RenderingStrategies.MYBATIS3);
100+
}
101+
80102
public static <R> int insertMultiple(ToIntFunction<MultiRowInsertStatementProvider<R>> mapper,
81103
Collection<R> records, SqlTable table, UnaryOperator<MultiRowInsertDSL<R>> completer) {
82-
return mapper.applyAsInt(completer.apply(
83-
SqlBuilder.insertMultiple(records).into(table)).build().render(RenderingStrategies.MYBATIS3));
104+
return mapper.applyAsInt(insertMultiple(records, table, completer));
84105
}
85106

86-
public static <R> List<R> selectDistinct(Function<SelectStatementProvider, List<R>> mapper,
87-
BasicColumn[] selectList, SqlTable table, SelectDSLCompleter completer) {
88-
return selectDistinct(mapper, SqlBuilder.selectDistinct(selectList).from(table), completer);
107+
public static SelectStatementProvider select(BasicColumn[] selectList, SqlTable table,
108+
SelectDSLCompleter completer) {
109+
return select(SqlBuilder.select(selectList).from(table), completer);
110+
}
111+
112+
public static SelectStatementProvider select(QueryExpressionDSL<SelectModel> start,
113+
SelectDSLCompleter completer) {
114+
return completer.apply(start)
115+
.build()
116+
.render(RenderingStrategies.MYBATIS3);
117+
}
118+
119+
public static SelectStatementProvider selectDistinct(BasicColumn[] selectList, SqlTable table,
120+
SelectDSLCompleter completer) {
121+
return select(SqlBuilder.selectDistinct(selectList).from(table), completer);
89122
}
90123

91124
public static <R> List<R> selectDistinct(Function<SelectStatementProvider, List<R>> mapper,
92-
QueryExpressionDSL<SelectModel> start, SelectDSLCompleter completer) {
93-
return mapper.apply(completer.apply(start).build().render(RenderingStrategies.MYBATIS3));
125+
BasicColumn[] selectList, SqlTable table, SelectDSLCompleter completer) {
126+
return mapper.apply(selectDistinct(selectList, table, completer));
94127
}
95128

96129
public static <R> List<R> selectList(Function<SelectStatementProvider, List<R>> mapper,
97130
BasicColumn[] selectList, SqlTable table, SelectDSLCompleter completer) {
98-
return selectList(mapper, SqlBuilder.select(selectList).from(table), completer);
131+
return mapper.apply(select(selectList, table, completer));
99132
}
100133

101134
public static <R> List<R> selectList(Function<SelectStatementProvider, List<R>> mapper,
102135
QueryExpressionDSL<SelectModel> start, SelectDSLCompleter completer) {
103-
return mapper.apply(completer.apply(start).build().render(RenderingStrategies.MYBATIS3));
136+
return mapper.apply(select(start, completer));
104137
}
105138

106-
@Nullable
107139
public static <R> R selectOne(Function<SelectStatementProvider, R> mapper,
108140
BasicColumn[] selectList, SqlTable table, SelectDSLCompleter completer) {
109-
return selectOne(mapper, SqlBuilder.select(selectList).from(table), completer);
141+
return mapper.apply(select(selectList, table, completer));
110142
}
111143

112-
@Nullable
113144
public static <R> R selectOne(Function<SelectStatementProvider, R> mapper,
114-
QueryExpressionDSL<SelectModel> start,
115-
SelectDSLCompleter completer) {
116-
return mapper.apply(completer.apply(start).build().render(RenderingStrategies.MYBATIS3));
117-
}
118-
119-
@NotNull
120-
public static <R> Optional<R> selectOptional(Function<SelectStatementProvider, Optional<R>> mapper,
121-
BasicColumn[] selectList, SqlTable table, SelectDSLCompleter completer) {
122-
return selectOptional(mapper, SqlBuilder.select(selectList).from(table), completer);
145+
QueryExpressionDSL<SelectModel> start,SelectDSLCompleter completer) {
146+
return mapper.apply(select(start, completer));
123147
}
124148

125-
@NotNull
126-
public static <R> Optional<R> selectOptional(Function<SelectStatementProvider, Optional<R>> mapper,
127-
QueryExpressionDSL<SelectModel> start, SelectDSLCompleter completer) {
128-
return mapper.apply(completer.apply(start).build().render(RenderingStrategies.MYBATIS3));
149+
public static UpdateStatementProvider update(SqlTable table, UpdateDSLCompleter completer) {
150+
return completer.apply(SqlBuilder.update(table))
151+
.build()
152+
.render(RenderingStrategies.MYBATIS3);
129153
}
130154

131155
public static int update(ToIntFunction<UpdateStatementProvider> mapper,
132156
SqlTable table, UpdateDSLCompleter completer) {
133-
return mapper.applyAsInt(
134-
completer.apply(SqlBuilder.update(table))
135-
.build()
136-
.render(RenderingStrategies.MYBATIS3));
157+
return mapper.applyAsInt(update(table, completer));
137158
}
138159
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ public Optional<FragmentAndParameters> visit(AbstractColumnComparisonCondition<T
117117
return FragmentAndParameters.withFragment(fragment).buildOptional();
118118
}
119119

120-
private FragmentAndParameters toFragmentAndParameters(Object value) {
120+
private FragmentAndParameters toFragmentAndParameters(T value) {
121121
String mapKey = formatParameterMapKey(sequence.getAndIncrement());
122122

123123
return FragmentAndParameters.withFragment(getFormattedJdbcPlaceholder(mapKey))

src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/UpdateDSLExtensions.kt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,16 @@ package org.mybatis.dynamic.sql.util.kotlin
1717

1818
import org.mybatis.dynamic.sql.BindableColumn
1919
import org.mybatis.dynamic.sql.VisitableCondition
20+
import org.mybatis.dynamic.sql.insert.InsertDSL
21+
import org.mybatis.dynamic.sql.insert.MultiRowInsertDSL
2022
import org.mybatis.dynamic.sql.update.UpdateDSL
2123
import org.mybatis.dynamic.sql.update.UpdateModel
2224
import org.mybatis.dynamic.sql.util.Buildable
2325

26+
// insert completers are here because sonar doesn't see them as covered if they are in a file by themselves
27+
typealias InsertCompleter<T> = InsertDSL<T>.() -> InsertDSL<T>
28+
typealias MultiRowInsertCompleter<T> = MultiRowInsertDSL<T>.() -> MultiRowInsertDSL<T>
29+
2430
typealias UpdateCompleter = UpdateDSL<UpdateModel>.() -> Buildable<UpdateModel>
2531

2632
fun <T> UpdateDSL<UpdateModel>.where(column: BindableColumn<T>, condition: VisitableCondition<T>, collect: CriteriaReceiver) =

src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/mybatis3/MapperSupportFunctions.kt

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
package org.mybatis.dynamic.sql.util.kotlin.mybatis3
1717

1818
import org.mybatis.dynamic.sql.BasicColumn
19+
import org.mybatis.dynamic.sql.SqlBuilder
1920
import org.mybatis.dynamic.sql.SqlTable
2021
import org.mybatis.dynamic.sql.delete.render.DeleteStatementProvider
2122
import org.mybatis.dynamic.sql.insert.render.InsertStatementProvider
@@ -24,34 +25,31 @@ import org.mybatis.dynamic.sql.select.QueryExpressionDSL
2425
import org.mybatis.dynamic.sql.select.SelectModel
2526
import org.mybatis.dynamic.sql.select.render.SelectStatementProvider
2627
import org.mybatis.dynamic.sql.update.render.UpdateStatementProvider
27-
import org.mybatis.dynamic.sql.util.kotlin.CountCompleter
28-
import org.mybatis.dynamic.sql.util.kotlin.DeleteCompleter
29-
import org.mybatis.dynamic.sql.util.kotlin.SelectCompleter
30-
import org.mybatis.dynamic.sql.util.kotlin.UpdateCompleter
28+
import org.mybatis.dynamic.sql.util.kotlin.*
3129

32-
fun count(mapper: (SelectStatementProvider) -> Long, table: SqlTable, completer: CountCompleter) =
33-
mapper(count(table, completer))
30+
fun countFrom(mapper: (SelectStatementProvider) -> Long, table: SqlTable, completer: CountCompleter) =
31+
mapper(countFrom(table, completer))
3432

3533
fun deleteFrom(mapper: (DeleteStatementProvider) -> Int, table: SqlTable, completer: DeleteCompleter) =
3634
mapper(deleteFrom(table, completer))
3735

3836
fun <T> insert(mapper: (InsertStatementProvider<T>) -> Int, record: T, table: SqlTable, completer: InsertCompleter<T>) =
39-
mapper(insert(record, table, completer))
37+
mapper(SqlBuilder.insert(record).into(table, completer))
4038

4139
fun <T> insertMultiple(mapper: (MultiRowInsertStatementProvider<T>) -> Int, records: Collection<T>, table: SqlTable, completer: MultiRowInsertCompleter<T>) =
42-
mapper(insertMultiple(records, table, completer))
40+
mapper(SqlBuilder.insertMultiple(records).into(table, completer))
4341

4442
fun <T> selectDistinct(mapper: (SelectStatementProvider) -> List<T>, selectList: List<BasicColumn>, table: SqlTable, completer: SelectCompleter) =
45-
mapper(selectDistinct(selectList, table, completer))
43+
mapper(SqlBuilder.selectDistinct(selectList).from(table, completer))
4644

4745
fun <T> selectList(mapper: (SelectStatementProvider) -> List<T>, selectList: List<BasicColumn>, table: SqlTable, completer: SelectCompleter) =
48-
mapper(select(selectList, table, completer))
46+
mapper(SqlBuilder.select(selectList).from(table, completer))
4947

5048
fun <T> selectList(mapper: (SelectStatementProvider) -> List<T>, start: QueryExpressionDSL<SelectModel>, completer: SelectCompleter) =
5149
mapper(select(start, completer))
5250

5351
fun <T> selectOne(mapper: (SelectStatementProvider) -> T?, selectList: List<BasicColumn>, table: SqlTable, completer: SelectCompleter) =
54-
mapper(select(selectList, table, completer))
52+
mapper(SqlBuilder.select(selectList).from(table, completer))
5553

5654
fun <T> selectOne(mapper: (SelectStatementProvider) -> T?, start: QueryExpressionDSL<SelectModel>, completer: SelectCompleter) =
5755
mapper(select(start, completer))

0 commit comments

Comments
 (0)