Skip to content

Commit 1bdb75d

Browse files
committed
Add Template extensions that further simplify Spring usage
1 parent 9da977e commit 1bdb75d

File tree

5 files changed

+411
-7
lines changed

5 files changed

+411
-7
lines changed

src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/spring/NamedParameterJdbcTemplateExtensions.kt

Lines changed: 45 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,28 +15,72 @@
1515
*/
1616
package org.mybatis.dynamic.sql.util.kotlin.spring
1717

18+
import org.mybatis.dynamic.sql.BasicColumn
19+
import org.mybatis.dynamic.sql.SqlBuilder
20+
import org.mybatis.dynamic.sql.SqlTable
1821
import org.mybatis.dynamic.sql.delete.render.DeleteStatementProvider
1922
import org.mybatis.dynamic.sql.insert.render.InsertStatementProvider
2023
import org.mybatis.dynamic.sql.select.render.SelectStatementProvider
2124
import org.mybatis.dynamic.sql.update.render.UpdateStatementProvider
25+
import org.mybatis.dynamic.sql.util.kotlin.*
2226
import org.springframework.jdbc.core.namedparam.BeanPropertySqlParameterSource
2327
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate
2428
import java.sql.ResultSet
2529

2630
fun NamedParameterJdbcTemplate.count(selectStatement: SelectStatementProvider) =
2731
queryForObject(selectStatement.selectStatement, selectStatement.parameters, Long::class.java)!!
2832

33+
fun NamedParameterJdbcTemplate.count(table: SqlTable, completer: CountCompleter) =
34+
count(org.mybatis.dynamic.sql.util.kotlin.spring.count(table, completer))
35+
2936
fun NamedParameterJdbcTemplate.delete(deleteStatement: DeleteStatementProvider) =
3037
update(deleteStatement.deleteStatement, deleteStatement.parameters)
3138

39+
fun NamedParameterJdbcTemplate.deleteFrom(table: SqlTable, completer: DeleteCompleter) =
40+
delete(org.mybatis.dynamic.sql.util.kotlin.spring.deleteFrom(table, completer))
41+
3242
fun <T> NamedParameterJdbcTemplate.insert(insertStatement: InsertStatementProvider<T>) =
3343
update(insertStatement.insertStatement, BeanPropertySqlParameterSource(insertStatement.record))
3444

35-
fun <T> NamedParameterJdbcTemplate.selectMany(selectStatement: SelectStatementProvider, rowMapper: (rs: ResultSet, rowNum: Int) -> T): List<T> =
45+
fun <T> NamedParameterJdbcTemplate.insert(record: T, table: SqlTable, completer: InsertCompleter<T>) =
46+
insert(org.mybatis.dynamic.sql.util.kotlin.spring.insert(record, table, completer))
47+
48+
fun NamedParameterJdbcTemplate.select(vararg selectList: BasicColumn) =
49+
FromGatherer(selectList.toList(), this)
50+
51+
fun NamedParameterJdbcTemplate.selectDistinct(vararg selectList: BasicColumn) =
52+
DistinctFromGatherer(selectList.toList(), this)
53+
54+
fun <T> NamedParameterJdbcTemplate.selectList(selectStatement: SelectStatementProvider, rowMapper: (rs: ResultSet, rowNum: Int) -> T): List<T> =
3655
query(selectStatement.selectStatement, selectStatement.parameters, rowMapper)
3756

3857
fun <T> NamedParameterJdbcTemplate.selectOne(selectStatement: SelectStatementProvider, rowMapper: (rs: ResultSet, rowNum: Int) -> T): T? =
3958
queryForObject(selectStatement.selectStatement, selectStatement.parameters, rowMapper)
4059

4160
fun NamedParameterJdbcTemplate.update(updateStatement: UpdateStatementProvider) =
4261
update(updateStatement.updateStatement, updateStatement.parameters)
62+
63+
fun NamedParameterJdbcTemplate.update(table: SqlTable, completer: UpdateCompleter) =
64+
update(org.mybatis.dynamic.sql.util.kotlin.spring.update(table, completer))
65+
66+
// support classes for select DSL
67+
class FromGatherer(private val selectList: List<BasicColumn>, private val template: NamedParameterJdbcTemplate) {
68+
fun from(table: SqlTable, completer: SelectCompleter) =
69+
MapperGatherer(SqlBuilder.select(selectList).from(table, completer), template)
70+
71+
fun from(table: SqlTable, alias: String, completer: SelectCompleter) =
72+
MapperGatherer(SqlBuilder.select(selectList).from(table, alias, completer), template)
73+
}
74+
75+
class DistinctFromGatherer(private val selectList: List<BasicColumn>, private val template: NamedParameterJdbcTemplate) {
76+
fun from(table: SqlTable, completer: SelectCompleter) =
77+
MapperGatherer(SqlBuilder.selectDistinct(selectList).from(table, completer), template)
78+
79+
fun from(table: SqlTable, alias: String, completer: SelectCompleter) =
80+
MapperGatherer(SqlBuilder.selectDistinct(selectList).from(table, alias, completer), template)
81+
}
82+
83+
class MapperGatherer(private val selectStatement: SelectStatementProvider, private val template: NamedParameterJdbcTemplate) {
84+
fun <T> withRowMapper(rowMapper: (rs: ResultSet, rowNum: Int) -> T) =
85+
template.selectList(selectStatement, rowMapper)
86+
}

src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/spring/ProviderBuilderFunctions.kt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ package org.mybatis.dynamic.sql.util.kotlin.spring
1818
import org.mybatis.dynamic.sql.SqlBuilder
1919
import org.mybatis.dynamic.sql.SqlTable
2020
import org.mybatis.dynamic.sql.insert.render.InsertStatementProvider
21-
import org.mybatis.dynamic.sql.insert.render.MultiRowInsertStatementProvider
2221
import org.mybatis.dynamic.sql.render.RenderingStrategies
2322
import org.mybatis.dynamic.sql.select.QueryExpressionDSL
2423
import org.mybatis.dynamic.sql.select.SelectModel

src/site/markdown/docs/kotlinMyBatis3.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ MyBatis Dynamic SQL includes Kotlin extension methods that enable an SQL DSL for
33

44
The standard usage patterns for MyBatis Dynamic SQL and MyBatis3 in Java must be modified somewhat for Kotlin. Kotlin interfaces can contain both abstract and non-abstract methods (somewhat similar to Java's default methods in an interface). But using these methods in Kotlin based mapper interfaces will cause a failure with MyBatis because of the underlying Kotlin implementation.
55

6-
This page will show our recommended pattern for using the MyBatis Dynamic SQL with Kotlin. The code shown on this page is from the `src/test/kotlin/examples/kotlin/mybatis3/canonical` directory in this repository. That directory contains a complete example of using this library with Kotlin.
6+
This page will show our recommended pattern for using the MyBatis Dynamic SQL with Kotlin and MyBatis3. The code shown on this page is from the `src/test/kotlin/examples/kotlin/mybatis3/canonical` directory in this repository. That directory contains a complete example of using this library with Kotlin.
77

88
All Kotlin support is available in two packages:
99

0 commit comments

Comments
 (0)