Skip to content

Commit 7e207a3

Browse files
committed
Add Kotlin support for javaType on SqlColumn
1 parent be2483f commit 7e207a3

File tree

8 files changed

+105
-24
lines changed

8 files changed

+105
-24
lines changed

src/main/kotlin/org/mybatis/dynamic/sql/util/kotlin/elements/SqlTableExtensions.kt

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import org.mybatis.dynamic.sql.SqlColumn
1919
import org.mybatis.dynamic.sql.SqlTable
2020
import org.mybatis.dynamic.sql.render.RenderingStrategy
2121
import java.sql.JDBCType
22+
import kotlin.reflect.KClass
2223

2324
/**
2425
* This function replaces the native functions in [@see SqlColumn} such as
@@ -31,7 +32,8 @@ fun <T : Any> SqlTable.column(
3132
jdbcType: JDBCType? = null,
3233
typeHandler: String? = null,
3334
renderingStrategy: RenderingStrategy? = null,
34-
parameterTypeConverter: ((T?) -> Any?)? = null
35+
parameterTypeConverter: ((T?) -> Any?)? = null,
36+
javaType: KClass<T>? = null
3537
): SqlColumn<T> {
3638
var column: SqlColumn<T> = if (jdbcType == null) {
3739
column(name)
@@ -51,5 +53,9 @@ fun <T : Any> SqlTable.column(
5153
column = column.withParameterTypeConverter(parameterTypeConverter)
5254
}
5355

56+
if (javaType != null) {
57+
column = column.withJavaType(javaType.java)
58+
}
59+
5460
return column
5561
}

src/test/kotlin/examples/kotlin/mybatis3/canonical/AddressDynamicSqlSupport.kt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,11 +25,18 @@ object AddressDynamicSqlSupport {
2525
val streetAddress = address.streetAddress
2626
val city = address.city
2727
val state = address.state
28+
val addressType = address.addressType
2829

2930
class Address : SqlTable("Address") {
3031
val id = column<Int>(name = "address_id", jdbcType = JDBCType.INTEGER)
3132
val streetAddress = column<String>(name = "street_address", jdbcType = JDBCType.VARCHAR)
3233
val city = column<String>(name = "city", jdbcType = JDBCType.VARCHAR)
3334
val state = column<String>(name = "state", jdbcType = JDBCType.VARCHAR)
35+
val addressType = column(
36+
name = "address_type",
37+
jdbcType = JDBCType.INTEGER,
38+
javaType = AddressType::class,
39+
typeHandler = "org.apache.ibatis.type.EnumOrdinalTypeHandler"
40+
)
3441
}
3542
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
/*
2+
* Copyright 2016-2021 the original author or authors.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
package examples.kotlin.mybatis3.canonical
17+
18+
import org.mybatis.dynamic.sql.util.mybatis3.CommonInsertMapper
19+
import org.mybatis.dynamic.sql.util.mybatis3.CommonSelectMapper
20+
21+
interface AddressMapper: CommonInsertMapper<AddressRecord>, CommonSelectMapper

src/test/kotlin/examples/kotlin/mybatis3/canonical/AddressRecord.kt

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2016-2020 the original author or authors.
2+
* Copyright 2016-2021 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -19,5 +19,10 @@ data class AddressRecord(
1919
var id: Int? = null,
2020
var streetAddress: String? = null,
2121
var city: String? = null,
22-
var state: String? = null
22+
var state: String? = null,
23+
var addressType: AddressType? = null
2324
)
25+
26+
enum class AddressType {
27+
HOME, BUSINESS
28+
}

src/test/kotlin/examples/kotlin/mybatis3/canonical/PersonMapperTest.kt

Lines changed: 42 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,15 @@
1515
*/
1616
package examples.kotlin.mybatis3.canonical
1717

18-
import examples.kotlin.mybatis3.canonical.PersonDynamicSqlSupport.person
18+
import examples.kotlin.mybatis3.canonical.AddressDynamicSqlSupport.address
1919
import examples.kotlin.mybatis3.canonical.PersonDynamicSqlSupport.addressId
2020
import examples.kotlin.mybatis3.canonical.PersonDynamicSqlSupport.birthDate
2121
import examples.kotlin.mybatis3.canonical.PersonDynamicSqlSupport.employed
2222
import examples.kotlin.mybatis3.canonical.PersonDynamicSqlSupport.firstName
2323
import examples.kotlin.mybatis3.canonical.PersonDynamicSqlSupport.id
2424
import examples.kotlin.mybatis3.canonical.PersonDynamicSqlSupport.lastName
2525
import examples.kotlin.mybatis3.canonical.PersonDynamicSqlSupport.occupation
26+
import examples.kotlin.mybatis3.canonical.PersonDynamicSqlSupport.person
2627
import org.apache.ibatis.datasource.unpooled.UnpooledDataSource
2728
import org.apache.ibatis.jdbc.ScriptRunner
2829
import org.apache.ibatis.mapping.Environment
@@ -44,9 +45,11 @@ import org.mybatis.dynamic.sql.util.kotlin.elements.isLike
4445
import org.mybatis.dynamic.sql.util.kotlin.elements.isNotLike
4546
import org.mybatis.dynamic.sql.util.kotlin.elements.isNull
4647
import org.mybatis.dynamic.sql.util.kotlin.elements.isTrue
48+
import org.mybatis.dynamic.sql.util.kotlin.mybatis3.insertInto
49+
import org.mybatis.dynamic.sql.util.kotlin.mybatis3.select
4750
import java.io.InputStreamReader
4851
import java.sql.DriverManager
49-
import java.util.Date
52+
import java.util.*
5053

5154
class PersonMapperTest {
5255
private fun newSession(executorType: ExecutorType = ExecutorType.REUSE): SqlSession {
@@ -55,7 +58,7 @@ class PersonMapperTest {
5558
DriverManager.getConnection(JDBC_URL, "sa", "").use { connection ->
5659
val sr = ScriptRunner(connection)
5760
sr.setLogWriter(null)
58-
sr.runScript(InputStreamReader(script))
61+
sr.runScript(InputStreamReader(script!!))
5962
}
6063

6164
val ds = UnpooledDataSource(JDBC_DRIVER, JDBC_URL, "sa", "")
@@ -64,6 +67,7 @@ class PersonMapperTest {
6467
config.typeHandlerRegistry.register(YesNoTypeHandler::class.java)
6568
config.addMapper(PersonMapper::class.java)
6669
config.addMapper(PersonWithAddressMapper::class.java)
70+
config.addMapper(AddressMapper::class.java)
6771
return SqlSessionFactoryBuilder().build(config).openSession(executorType)
6872
}
6973

@@ -600,6 +604,11 @@ class PersonMapperTest {
600604
assertThat(address?.streetAddress).isEqualTo("123 Main Street")
601605
assertThat(address?.city).isEqualTo("Bedrock")
602606
assertThat(address?.state).isEqualTo("IN")
607+
assertThat(address?.addressType).isEqualTo(AddressType.HOME)
608+
}
609+
610+
with(records[4]) {
611+
assertThat(address?.addressType).isEqualTo(AddressType.BUSINESS)
603612
}
604613
}
605614
}
@@ -625,6 +634,7 @@ class PersonMapperTest {
625634
assertThat(address?.streetAddress).isEqualTo("123 Main Street")
626635
assertThat(address?.city).isEqualTo("Bedrock")
627636
assertThat(address?.state).isEqualTo("IN")
637+
assertThat(address?.addressType).isEqualTo(AddressType.HOME)
628638
}
629639
}
630640
}
@@ -650,6 +660,7 @@ class PersonMapperTest {
650660
assertThat(address?.streetAddress).isEqualTo("123 Main Street")
651661
assertThat(address?.city).isEqualTo("Bedrock")
652662
assertThat(address?.state).isEqualTo("IN")
663+
assertThat(address?.addressType).isEqualTo(AddressType.HOME)
653664
}
654665
}
655666
}
@@ -673,6 +684,7 @@ class PersonMapperTest {
673684
assertThat(address?.streetAddress).isEqualTo("123 Main Street")
674685
assertThat(address?.city).isEqualTo("Bedrock")
675686
assertThat(address?.state).isEqualTo("IN")
687+
assertThat(address?.addressType).isEqualTo(AddressType.HOME)
676688
}
677689
}
678690
}
@@ -688,6 +700,33 @@ class PersonMapperTest {
688700
}
689701
}
690702

703+
@Test
704+
fun testWithEnumOrdinalTypeHandler() {
705+
newSession().use { session ->
706+
val mapper: AddressMapper = session.getMapper(AddressMapper::class.java)
707+
708+
val insertStatement = insertInto(address) {
709+
set(address.id).toValue(4)
710+
set(address.streetAddress).toValue("987 Elm Street")
711+
set(address.city).toValue("Mayberry")
712+
set(address.state).toValue("NC")
713+
set(address.addressType).toValue(AddressType.HOME)
714+
}
715+
716+
val rows = mapper.generalInsert(insertStatement)
717+
assertThat(rows).isEqualTo(1)
718+
719+
val selectStatement = select(address.addressType) {
720+
from(address)
721+
where(address.id, isEqualTo(4))
722+
}
723+
724+
val type = mapper.selectOptionalInteger(selectStatement)
725+
726+
assertThat(type).hasValueSatisfying { assertThat(it).isEqualTo(0) }
727+
}
728+
}
729+
691730
companion object {
692731
const val JDBC_URL = "jdbc:hsqldb:mem:aname"
693732
const val JDBC_DRIVER = "org.hsqldb.jdbcDriver"

src/test/kotlin/examples/kotlin/mybatis3/canonical/PersonWithAddressMapper.kt

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import org.apache.ibatis.annotations.Result
2020
import org.apache.ibatis.annotations.ResultMap
2121
import org.apache.ibatis.annotations.Results
2222
import org.apache.ibatis.annotations.SelectProvider
23+
import org.apache.ibatis.type.EnumOrdinalTypeHandler
2324
import org.apache.ibatis.type.JdbcType
2425
import org.mybatis.dynamic.sql.select.render.SelectStatementProvider
2526
import org.mybatis.dynamic.sql.util.SqlProviderAdapter
@@ -55,7 +56,13 @@ interface PersonWithAddressMapper {
5556
Result(column = "address_id", property = "address.id", jdbcType = JdbcType.INTEGER),
5657
Result(column = "street_address", property = "address.streetAddress", jdbcType = JdbcType.VARCHAR),
5758
Result(column = "city", property = "address.city", jdbcType = JdbcType.VARCHAR),
58-
Result(column = "state", property = "address.state", jdbcType = JdbcType.CHAR)
59+
Result(column = "state", property = "address.state", jdbcType = JdbcType.CHAR),
60+
Result(
61+
column = "address_type",
62+
property = "address.addressType",
63+
jdbcType = JdbcType.INTEGER,
64+
typeHandler = EnumOrdinalTypeHandler::class
65+
)
5966
]
6067
)
6168
fun selectMany(selectStatement: SelectStatementProvider): List<PersonWithAddress>

src/test/kotlin/examples/kotlin/mybatis3/canonical/PersonWithAddressMapperExtensions.kt

Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -29,11 +29,12 @@ import org.mybatis.dynamic.sql.util.kotlin.elements.isEqualTo
2929
import org.mybatis.dynamic.sql.util.kotlin.mybatis3.select
3030
import org.mybatis.dynamic.sql.util.kotlin.mybatis3.selectDistinct
3131

32+
private val columnList = listOf(id.`as`("A_ID"), firstName, lastName, birthDate,
33+
employed, occupation, address.id, address.streetAddress, address.city, address.state, address.addressType
34+
)
35+
3236
fun PersonWithAddressMapper.selectOne(completer: SelectCompleter): PersonWithAddress? =
33-
select(
34-
id.`as`("A_ID"), firstName, lastName, birthDate,
35-
employed, occupation, address.id, address.streetAddress, address.city, address.state
36-
) {
37+
select(columnList) {
3738
from(person)
3839
fullJoin(address) {
3940
on(person.addressId, equalTo(address.id))
@@ -42,10 +43,7 @@ fun PersonWithAddressMapper.selectOne(completer: SelectCompleter): PersonWithAdd
4243
}.run(this::selectOne)
4344

4445
fun PersonWithAddressMapper.select(completer: SelectCompleter): List<PersonWithAddress> =
45-
select(
46-
id.`as`("A_ID"), firstName, lastName, birthDate,
47-
employed, occupation, address.id, address.streetAddress, address.city, address.state
48-
) {
46+
select(columnList) {
4947
from(person, "p")
5048
fullJoin(address) {
5149
on(person.addressId, equalTo(address.id))
@@ -54,10 +52,7 @@ fun PersonWithAddressMapper.select(completer: SelectCompleter): List<PersonWithA
5452
}.run(this::selectMany)
5553

5654
fun PersonWithAddressMapper.selectDistinct(completer: SelectCompleter): List<PersonWithAddress> =
57-
selectDistinct(
58-
id.`as`("A_ID"), firstName, lastName,
59-
birthDate, employed, occupation, address.id, address.streetAddress, address.city, address.state
60-
) {
55+
selectDistinct(columnList) {
6156
from(person)
6257
fullJoin(address) {
6358
on(person.addressId, equalTo(address.id))

src/test/resources/examples/kotlin/mybatis3/CreateSimpleDB.sql

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
--
2-
-- Copyright 2016-2019 the original author or authors.
2+
-- Copyright 2016-2021 the original author or authors.
33
--
44
-- Licensed under the Apache License, Version 2.0 (the "License");
55
-- you may not use this file except in compliance with the License.
@@ -22,6 +22,7 @@ create table Address (
2222
street_address varchar(50) not null,
2323
city varchar(20) not null,
2424
state varchar(2) not null,
25+
address_type int not null,
2526
primary key(address_id)
2627
);
2728

@@ -36,11 +37,11 @@ create table Person (
3637
primary key(id)
3738
);
3839

39-
insert into Address (address_id, street_address, city, state)
40-
values(1, '123 Main Street', 'Bedrock', 'IN');
40+
insert into Address (address_id, street_address, city, state, address_type)
41+
values(1, '123 Main Street', 'Bedrock', 'IN', 0);
4142

42-
insert into Address (address_id, street_address, city, state)
43-
values(2, '456 Main Street', 'Bedrock', 'IN');
43+
insert into Address (address_id, street_address, city, state, address_type)
44+
values(2, '456 Main Street', 'Bedrock', 'IN', 1);
4445

4546
insert into Person values(1, 'Fred', 'Flintstone', '1935-02-01', 'Yes', 'Brontosaurus Operator', 1);
4647

0 commit comments

Comments
 (0)