From 37e8e8cacb510b8f9d741ae8e79c1a0fc9fdcef7 Mon Sep 17 00:00:00 2001 From: Jeff Butler Date: Fri, 22 Apr 2022 10:14:34 -0400 Subject: [PATCH] Add Kotlin utility functions for Spring RowMapper SAM conversions --- .../NamedParameterJdbcTemplateExtensions.kt | 19 ++++++++++++++++- ...CanonicalSpringKotlinTemplateDirectTest.kt | 21 ++++++++++++++++--- 2 files changed, 36 insertions(+), 4 deletions(-) diff --git a/src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/spring/NamedParameterJdbcTemplateExtensions.kt b/src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/spring/NamedParameterJdbcTemplateExtensions.kt index c492fea81..20d1b4663 100644 --- a/src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/spring/NamedParameterJdbcTemplateExtensions.kt +++ b/src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/spring/NamedParameterJdbcTemplateExtensions.kt @@ -37,6 +37,7 @@ import org.mybatis.dynamic.sql.util.kotlin.MyBatisDslMarker import org.mybatis.dynamic.sql.util.kotlin.SelectCompleter import org.mybatis.dynamic.sql.util.kotlin.UpdateCompleter import org.springframework.dao.EmptyResultDataAccessException +import org.springframework.jdbc.core.RowMapper import org.springframework.jdbc.core.namedparam.BeanPropertySqlParameterSource import org.springframework.jdbc.core.namedparam.MapSqlParameterSource import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate @@ -193,6 +194,11 @@ fun NamedParameterJdbcTemplate.selectDistinct( fun NamedParameterJdbcTemplate.selectList( selectStatement: SelectStatementProvider, rowMapper: (rs: ResultSet, rowNum: Int) -> T +): List = selectList(selectStatement, RowMapper(rowMapper)) + +fun NamedParameterJdbcTemplate.selectList( + selectStatement: SelectStatementProvider, + rowMapper: RowMapper ): List = query(selectStatement.selectStatement, selectStatement.parameters, rowMapper) @@ -217,10 +223,15 @@ fun NamedParameterJdbcTemplate.selectOne( this ) -@SuppressWarnings("SwallowedException") fun NamedParameterJdbcTemplate.selectOne( selectStatement: SelectStatementProvider, rowMapper: (rs: ResultSet, rowNum: Int) -> T +): T? = selectOne(selectStatement, RowMapper(rowMapper)) + +@SuppressWarnings("SwallowedException") +fun NamedParameterJdbcTemplate.selectOne( + selectStatement: SelectStatementProvider, + rowMapper: RowMapper ): T? = try { queryForObject(selectStatement.selectStatement, selectStatement.parameters, rowMapper) } catch (e: EmptyResultDataAccessException) { @@ -251,6 +262,9 @@ class SelectListMapperGatherer( ) { fun withRowMapper(rowMapper: (rs: ResultSet, rowNum: Int) -> T): List = template.selectList(selectStatement, rowMapper) + + fun withRowMapper(rowMapper: RowMapper): List = + template.selectList(selectStatement, rowMapper) } @MyBatisDslMarker @@ -260,6 +274,9 @@ class SelectOneMapperGatherer( ) { fun withRowMapper(rowMapper: (rs: ResultSet, rowNum: Int) -> T): T? = template.selectOne(selectStatement, rowMapper) + + fun withRowMapper(rowMapper: RowMapper): T? = + template.selectOne(selectStatement, rowMapper) } @MyBatisDslMarker diff --git a/src/test/kotlin/examples/kotlin/spring/canonical/CanonicalSpringKotlinTemplateDirectTest.kt b/src/test/kotlin/examples/kotlin/spring/canonical/CanonicalSpringKotlinTemplateDirectTest.kt index 1686a03ce..5fb55b250 100644 --- a/src/test/kotlin/examples/kotlin/spring/canonical/CanonicalSpringKotlinTemplateDirectTest.kt +++ b/src/test/kotlin/examples/kotlin/spring/canonical/CanonicalSpringKotlinTemplateDirectTest.kt @@ -621,12 +621,10 @@ open class CanonicalSpringKotlinTemplateDirectTest { @Test fun testAutoMapping() { - val rm = DataClassRowMapper.newInstance(AddressRecord::class.java) - val rows = template.select(address.id.`as`("id"), address.streetAddress, address.city, address.state) { from(address) orderBy(address.id) - }.withRowMapper(rm::mapRow) + }.withRowMapper(DataClassRowMapper(AddressRecord::class.java)) assertThat(rows).hasSize(2) with(rows[0]) { @@ -637,6 +635,23 @@ open class CanonicalSpringKotlinTemplateDirectTest { } } + @Test + fun testAutoMappingOneRow() { + val row = template.selectOne(address.id.`as`("id"), address.streetAddress, address.city, address.state) { + from(address) + where { address.id isEqualTo 1 } + orderBy(address.id) + }.withRowMapper(DataClassRowMapper(AddressRecord::class.java)) + + assertThat(row).isNotNull + with(row!!) { + assertThat(id).isEqualTo(1) + assertThat(streetAddress).isEqualTo("123 Main Street") + assertThat(city).isEqualTo("Bedrock") + assertThat(state).isEqualTo("IN") + } + } + @Test fun testSelectWithJoin() { val rows = template.select(