Skip to content

Commit 47bf61a

Browse files
committed
Centralize SqlSessionFactory creation
1 parent 061cfe6 commit 47bf61a

File tree

10 files changed

+271
-380
lines changed

10 files changed

+271
-380
lines changed
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
/*
2+
* Copyright 2016-2022 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+
* https://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
17+
18+
import org.apache.ibatis.datasource.unpooled.UnpooledDataSource
19+
import org.apache.ibatis.jdbc.ScriptRunner
20+
import org.apache.ibatis.mapping.Environment
21+
import org.apache.ibatis.session.Configuration
22+
import org.apache.ibatis.session.SqlSessionFactory
23+
import org.apache.ibatis.session.SqlSessionFactoryBuilder
24+
import org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory
25+
import java.io.InputStreamReader
26+
import javax.sql.DataSource
27+
import kotlin.reflect.KClass
28+
29+
class TestUtils {
30+
companion object {
31+
const val JDBC_URL = "jdbc:hsqldb:mem:aname"
32+
const val JDBC_DRIVER = "org.hsqldb.jdbcDriver"
33+
34+
fun buildSqlSessionFactory(configurator: FactoryConfig.() -> Unit): SqlSessionFactory {
35+
val factoryConfig = FactoryConfig().apply(configurator)
36+
37+
val dataSource = factoryConfig.dataSource?:defaultDataSource()
38+
39+
factoryConfig.initializationScript?.let {
40+
val script = TestUtils::class.java.getResourceAsStream(it)
41+
dataSource.getConnection("sa", "").use { connection ->
42+
val sr = ScriptRunner(connection)
43+
sr.setLogWriter(null)
44+
sr.runScript(InputStreamReader(script!!))
45+
}
46+
}
47+
48+
val environment = Environment("test", JdbcTransactionFactory(), dataSource)
49+
with(Configuration(environment)) {
50+
factoryConfig.typeHandlers.map(KClass<*>::java).forEach(typeHandlerRegistry::register)
51+
factoryConfig.mappers.map(KClass<*>::java).forEach { addMapper(it) }
52+
return SqlSessionFactoryBuilder().build(this)
53+
}
54+
}
55+
56+
private fun defaultDataSource() = UnpooledDataSource(JDBC_DRIVER, JDBC_URL, "sa", "")
57+
}
58+
59+
class FactoryConfig {
60+
internal var initializationScript: String? = null
61+
internal val mappers = mutableListOf<KClass<*>>()
62+
internal val typeHandlers = mutableListOf<KClass<*>>()
63+
internal var dataSource: DataSource? = null
64+
65+
fun withInitializationScript(initializationScript: String) {
66+
this.initializationScript = initializationScript
67+
}
68+
69+
fun withMapper(mapper: KClass<*>) {
70+
this.mappers.add(mapper)
71+
}
72+
73+
fun withTypeHandler(typeHandler: KClass<*>) {
74+
this.typeHandlers.add(typeHandler)
75+
}
76+
77+
fun withDataSource(dataSource: DataSource) {
78+
this.dataSource = dataSource
79+
}
80+
}
81+
}

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

Lines changed: 5 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -15,43 +15,25 @@
1515
*/
1616
package examples.kotlin.mybatis3.canonical
1717

18+
import examples.kotlin.mybatis3.TestUtils
1819
import examples.kotlin.mybatis3.canonical.GeneratedAlwaysDynamicSqlSupport.firstName
1920
import examples.kotlin.mybatis3.canonical.GeneratedAlwaysDynamicSqlSupport.generatedAlways
2021
import examples.kotlin.mybatis3.canonical.GeneratedAlwaysDynamicSqlSupport.lastName
21-
import org.apache.ibatis.datasource.unpooled.UnpooledDataSource
22-
import org.apache.ibatis.jdbc.ScriptRunner
23-
import org.apache.ibatis.mapping.Environment
24-
import org.apache.ibatis.session.Configuration
2522
import org.apache.ibatis.session.ExecutorType
2623
import org.apache.ibatis.session.SqlSession
27-
import org.apache.ibatis.session.SqlSessionFactoryBuilder
28-
import org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory
2924
import org.assertj.core.api.Assertions.assertThat
3025
import org.junit.jupiter.api.Test
3126
import org.mybatis.dynamic.sql.util.kotlin.elements.insertBatch
3227
import org.mybatis.dynamic.sql.util.kotlin.mybatis3.insertInto
3328
import org.mybatis.dynamic.sql.util.kotlin.mybatis3.into
34-
import java.io.InputStreamReader
35-
import java.sql.DriverManager
3629

3730
class GeneratedAlwaysTest {
3831
private fun newSession(executorType: ExecutorType = ExecutorType.REUSE): SqlSession {
3932
// this method re-initializes the database with every test - needed because of autoincrement fields
40-
41-
Class.forName(JDBC_DRIVER)
42-
val script = javaClass.getResourceAsStream("/examples/kotlin/spring/CreateGeneratedAlwaysDB.sql")
43-
DriverManager.getConnection(JDBC_URL, "sa", "").use { connection ->
44-
val sr = ScriptRunner(connection)
45-
sr.setLogWriter(null)
46-
sr.runScript(InputStreamReader(script!!))
47-
}
48-
49-
val dataSource = UnpooledDataSource(JDBC_DRIVER, JDBC_URL, "sa", "")
50-
val environment = Environment("test", JdbcTransactionFactory(), dataSource)
51-
with(Configuration(environment)) {
52-
addMapper(GeneratedAlwaysMapper::class.java)
53-
return SqlSessionFactoryBuilder().build(this).openSession(executorType)
54-
}
33+
return TestUtils.buildSqlSessionFactory {
34+
withInitializationScript("/examples/kotlin/spring/CreateGeneratedAlwaysDB.sql")
35+
withMapper(GeneratedAlwaysMapper::class)
36+
}.openSession(executorType)
5537
}
5638

5739
@Test
@@ -181,9 +163,4 @@ class GeneratedAlwaysTest {
181163
assertThat(fullName).isEqualTo("Fred Flintstone")
182164
}
183165
}
184-
185-
companion object {
186-
const val JDBC_URL = "jdbc:hsqldb:mem:aname"
187-
const val JDBC_DRIVER = "org.hsqldb.jdbcDriver"
188-
}
189166
}

0 commit comments

Comments
 (0)