Skip to content

Commit 1eaed6a

Browse files
committed
Add KeyHolder support to the template direct inserts
1 parent dfe5d5c commit 1eaed6a

File tree

3 files changed

+74
-11
lines changed

3 files changed

+74
-11
lines changed

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

Lines changed: 27 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,10 @@ fun <T> NamedParameterJdbcTemplate.insertMultiple(insertStatement: MultiRowInser
114114
keyHolder: KeyHolder) =
115115
update(insertStatement.insertStatement, BeanPropertySqlParameterSource(insertStatement), keyHolder)
116116

117+
// insert with KeyHolder support
118+
fun NamedParameterJdbcTemplate.withKeyHolder(keyHolder: KeyHolder) =
119+
KeyHolderHelper(keyHolder, this)
120+
117121
fun NamedParameterJdbcTemplate.select(vararg selectList: BasicColumn) =
118122
SelectListFromGatherer(selectList.toList(), this)
119123

@@ -211,20 +215,39 @@ class SelectOneMapperGatherer(
211215
template.selectOne(selectStatement, rowMapper)
212216
}
213217

218+
@MyBatisDslMarker
219+
class KeyHolderHelper(private val keyHolder: KeyHolder, private val template: NamedParameterJdbcTemplate) {
220+
fun insertInto(table: SqlTable, completer: GeneralInsertCompleter) =
221+
template.insert(org.mybatis.dynamic.sql.util.kotlin.spring.insertInto(table, completer), keyHolder)
222+
223+
fun <T> insert(record: T) =
224+
SingleRowInsertHelper(record, template, keyHolder)
225+
226+
fun <T> insertMultiple(vararg records: T) =
227+
insertMultiple(records.asList())
228+
229+
fun <T> insertMultiple(records: List<T>) =
230+
MultiRowInsertHelper(records, template, keyHolder)
231+
}
232+
214233
@MyBatisDslMarker
215234
class BatchInsertHelper<T>(private val records: List<T>, private val template: NamedParameterJdbcTemplate) {
216235
fun into(table: SqlTable, completer: BatchInsertCompleter<T>) =
217236
template.insert(SqlBuilder.insert(records).into(table, completer))
218237
}
219238

220239
@MyBatisDslMarker
221-
class MultiRowInsertHelper<T>(private val records: List<T>, private val template: NamedParameterJdbcTemplate) {
240+
class MultiRowInsertHelper<T>(private val records: List<T>, private val template: NamedParameterJdbcTemplate,
241+
private val keyHolder: KeyHolder? = null) {
222242
fun into(table: SqlTable, completer: MultiRowInsertCompleter<T>) =
223-
template.insertMultiple(SqlBuilder.insertMultiple(records).into(table, completer))
243+
keyHolder?.let { template.insertMultiple(SqlBuilder.insertMultiple(records).into(table, completer), it) }
244+
?:template.insertMultiple(SqlBuilder.insertMultiple(records).into(table, completer))
224245
}
225246

226247
@MyBatisDslMarker
227-
class SingleRowInsertHelper<T>(private val record: T, private val template: NamedParameterJdbcTemplate) {
248+
class SingleRowInsertHelper<T>(private val record: T, private val template: NamedParameterJdbcTemplate,
249+
private val keyHolder: KeyHolder? = null) {
228250
fun into(table: SqlTable, completer: InsertCompleter<T>) =
229-
template.insert(SqlBuilder.insert(record).into(table, completer))
251+
keyHolder?.let { template.insert(SqlBuilder.insert(record).into(table, completer), it) }
252+
?:template.insert(SqlBuilder.insert(record).into(table, completer))
230253
}

src/test/kotlin/examples/kotlin/spring/canonical/CanonicalSpringKotlinTemplateDirectTest.kt

Lines changed: 43 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
package examples.kotlin.spring.canonical
1717

1818
import examples.kotlin.spring.canonical.AddressDynamicSqlSupport.Address
19+
import examples.kotlin.spring.canonical.GeneratedAlwaysDynamicSqlSupport.GeneratedAlways
1920
import examples.kotlin.spring.canonical.PersonDynamicSqlSupport.Person
2021
import examples.kotlin.spring.canonical.PersonDynamicSqlSupport.Person.addressId
2122
import examples.kotlin.spring.canonical.PersonDynamicSqlSupport.Person.birthDate
@@ -32,6 +33,7 @@ import org.mybatis.dynamic.sql.util.kotlin.spring.*
3233
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate
3334
import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder
3435
import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType
36+
import org.springframework.jdbc.support.GeneratedKeyHolder
3537
import java.util.*
3638

3739
class CanonicalSpringKotlinTemplateDirectTest {
@@ -246,16 +248,54 @@ class CanonicalSpringKotlinTemplateDirectTest {
246248
assertThat(rows[1]).isEqualTo(1)
247249
}
248250

251+
@Test
249252
fun testGeneralInsertWithGeneratedKey() {
250-
TODO()
253+
val keyHolder = GeneratedKeyHolder()
254+
255+
val rows = template.withKeyHolder(keyHolder).insertInto(GeneratedAlways) {
256+
set(GeneratedAlways.firstName).toValue("Fred")
257+
set(GeneratedAlways.lastName).toValue("Flintstone")
258+
}
259+
260+
assertThat(rows).isEqualTo(1)
261+
assertThat(keyHolder.keys).containsEntry("ID", 22)
262+
assertThat(keyHolder.keys).containsEntry("FULL_NAME", "Fred Flintstone")
251263
}
252264

265+
@Test
253266
fun testInsertWithGeneratedKey() {
254-
TODO()
267+
val record = GeneratedAlwaysRecord(firstName = "Fred", lastName = "Flintstone")
268+
269+
val keyHolder = GeneratedKeyHolder()
270+
271+
val rows = template.withKeyHolder(keyHolder).insert(record).into(GeneratedAlways) {
272+
map(GeneratedAlways.firstName).toProperty("firstName")
273+
map(GeneratedAlways.lastName).toProperty("lastName")
274+
}
275+
276+
assertThat(rows).isEqualTo(1)
277+
assertThat(keyHolder.keys).containsEntry("ID", 22)
278+
assertThat(keyHolder.keys).containsEntry("FULL_NAME", "Fred Flintstone")
255279
}
256280

281+
@Test
257282
fun testMultiRowInsertWithGeneratedKey() {
258-
TODO()
283+
val record1 = GeneratedAlwaysRecord(firstName = "Fred", lastName = "Flintstone")
284+
val record2 = GeneratedAlwaysRecord(firstName = "Barney", lastName = "Rubble")
285+
286+
val keyHolder = GeneratedKeyHolder()
287+
288+
val rows = template.withKeyHolder(keyHolder).insertMultiple(record1, record2)
289+
.into(GeneratedAlways) {
290+
map(GeneratedAlways.firstName).toProperty("firstName")
291+
map(GeneratedAlways.lastName).toProperty("lastName")
292+
}
293+
294+
assertThat(rows).isEqualTo(2)
295+
assertThat(keyHolder.keyList[0]).containsEntry("ID", 22)
296+
assertThat(keyHolder.keyList[0]).containsEntry("FULL_NAME", "Fred Flintstone")
297+
assertThat(keyHolder.keyList[1]).containsEntry("ID", 23)
298+
assertThat(keyHolder.keyList[1]).containsEntry("FULL_NAME", "Barney Rubble")
259299
}
260300

261301
@Test

src/test/kotlin/examples/kotlin/spring/canonical/CanonicalSpringKotlinTest.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -355,8 +355,8 @@ class CanonicalSpringKotlinTest {
355355
val record = GeneratedAlwaysRecord(firstName = "Fred", lastName = "Flintstone")
356356

357357
val insertStatement = insert(record).into(GeneratedAlways) {
358-
map(firstName).toProperty("firstName")
359-
map(lastName).toProperty("lastName")
358+
map(GeneratedAlways.firstName).toProperty("firstName")
359+
map(GeneratedAlways.lastName).toProperty("lastName")
360360
}
361361

362362
val keyHolder = GeneratedKeyHolder()
@@ -374,8 +374,8 @@ class CanonicalSpringKotlinTest {
374374

375375
val insertStatement = insertMultiple(record1, record2)
376376
.into(GeneratedAlways) {
377-
map(firstName).toProperty("firstName")
378-
map(lastName).toProperty("lastName")
377+
map(GeneratedAlways.firstName).toProperty("firstName")
378+
map(GeneratedAlways.lastName).toProperty("lastName")
379379
}
380380

381381
val keyHolder = GeneratedKeyHolder()

0 commit comments

Comments
 (0)