Skip to content

Commit ff3ae6a

Browse files
authored
Merge pull request #116 from VadimKulikov/jdbi
Added Jdbi sample
2 parents f0612fc + 5066302 commit ff3ae6a

File tree

4 files changed

+185
-2
lines changed

4 files changed

+185
-2
lines changed

kotlin-jvm/build.gradle.kts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,8 @@ dependencies {
4646
implementation("it.skrape:skrapeit-http-fetcher:_")
4747
implementation("org.apache.velocity.tools:velocity-tools-generic:_")
4848
implementation("org.apache.velocity:velocity-engine-core:_")
49+
implementation("org.jdbi:jdbi3-core:_")
50+
implementation("org.jdbi:jdbi3-kotlin-sqlobject:_")
4951
implementation("org.jetbrains.exposed:exposed-core:_")
5052
implementation("org.jetbrains.exposed:exposed-dao:_")
5153
implementation("org.jetbrains.exposed:exposed-java-time:_")
Lines changed: 159 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,159 @@
1+
@file:Suppress("PackageDirectoryMismatch")
2+
3+
package playground.jdbi
4+
5+
import org.jdbi.v3.core.Jdbi
6+
import org.jdbi.v3.core.extension.ExtensionCallback
7+
import org.jdbi.v3.core.extension.ExtensionConsumer
8+
import org.jdbi.v3.sqlobject.customizer.Bind
9+
import org.jdbi.v3.sqlobject.customizer.BindBean
10+
import org.jdbi.v3.sqlobject.statement.SqlQuery
11+
import org.jdbi.v3.sqlobject.statement.SqlUpdate
12+
import playground.shouldBe
13+
14+
/**
15+
* Jdbi provides convenient, idiomatic access to relational data
16+
* - [GitHub](https://github.com/jdbi/jdbi)
17+
* - [Official Website](https://jdbi.org/)
18+
*/
19+
20+
private val testUser by lazy { User(1L, "Derrek") }
21+
private val testOrders by lazy {
22+
listOf(
23+
Order(1L, "T-shirt", 50, 1L),
24+
Order(2L, "Jeans", 100, 1L),
25+
Order(3L, "Hat", 35, 1L)
26+
)
27+
}
28+
29+
fun main() {
30+
println()
31+
println("Jdbi - Kotlin SQL Framework")
32+
val jdbi = Jdbi.create("jdbc:h2:mem:test;DB_CLOSE_DELAY=-1")
33+
jdbi.installPlugins()
34+
35+
insertData(jdbi)
36+
readData(jdbi)
37+
deleteData(jdbi)
38+
}
39+
40+
fun insertData(jdbi: Jdbi) {
41+
jdbi.useExtension(UserDAO::class.java, ExtensionConsumer { dao ->
42+
dao.createTable()
43+
dao.createUser(testUser)
44+
})
45+
46+
jdbi.useExtension(OrderDAO::class.java, ExtensionConsumer { dao ->
47+
dao.createTable()
48+
testOrders.forEach {
49+
dao.createOrder(it)
50+
}
51+
})
52+
53+
println("Data inserted successfully")
54+
}
55+
56+
fun readData(jdbi: Jdbi) {
57+
val user = jdbi.withExtension(UserDAO::class.java, ExtensionCallback {
58+
it.findByName("Derrek")
59+
})
60+
61+
user shouldBe testUser
62+
63+
val orders = jdbi.withExtension(OrderDAO::class.java, ExtensionCallback {
64+
it.findOrdersByUser(user.userId)
65+
})
66+
67+
orders shouldBe testOrders
68+
69+
println("Data fetched successfully")
70+
}
71+
72+
fun deleteData(jdbi: Jdbi) {
73+
val orders = jdbi.withExtension(OrderDAO::class.java, ExtensionCallback { dao ->
74+
dao.deleteAll()
75+
dao.findAll()
76+
})
77+
78+
orders shouldBe emptyList()
79+
80+
val users = jdbi.withExtension(UserDAO::class.java, ExtensionCallback { dao ->
81+
dao.deleteAll()
82+
dao.findAll()
83+
})
84+
85+
users shouldBe emptyList()
86+
87+
println("Data removed successfully")
88+
}
89+
90+
data class User(
91+
val userId: Long,
92+
val userName: String
93+
)
94+
95+
data class Order(
96+
val orderId: Long,
97+
val product: String,
98+
val price: Int,
99+
val orderedBy: Long
100+
)
101+
102+
interface UserDAO {
103+
@SqlUpdate(
104+
"""
105+
CREATE TABLE IF NOT EXISTS user(
106+
user_id bigint GENERATED BY DEFAULT AS IDENTITY
107+
PRIMARY KEY,
108+
user_name varchar
109+
)
110+
"""
111+
)
112+
fun createTable()
113+
114+
@SqlUpdate("INSERT INTO user(user_name) VALUES (:userName)")
115+
fun createUser(@BindBean user: User)
116+
117+
@SqlQuery("SELECT * FROM user")
118+
fun findAll(): List<User>
119+
120+
@SqlQuery("SELECT * FROM user WHERE user_name = :name")
121+
fun findByName(@Bind("name") name: String): User
122+
123+
@SqlUpdate("DELETE FROM user")
124+
fun deleteAll()
125+
}
126+
127+
interface OrderDAO {
128+
@SqlUpdate(
129+
"""
130+
CREATE TABLE IF NOT EXISTS orders(
131+
order_id bigint GENERATED BY DEFAULT AS IDENTITY
132+
PRIMARY KEY,
133+
product varchar,
134+
price int,
135+
ordered_by bigint
136+
CONSTRAINT fk_ordered_by_id
137+
REFERENCES user(user_id)
138+
)
139+
"""
140+
)
141+
fun createTable()
142+
143+
@SqlUpdate(
144+
"""
145+
INSERT INTO ORDERS(product, price, ordered_by)
146+
VALUES (:product, :price, :orderedBy)
147+
"""
148+
)
149+
fun createOrder(@BindBean order: Order)
150+
151+
@SqlQuery("SELECT * FROM orders WHERE ordered_by = :orderedBy")
152+
fun findOrdersByUser(@Bind("orderedBy") orderedBy: Long): List<Order>
153+
154+
@SqlUpdate("DELETE FROM orders")
155+
fun deleteAll()
156+
157+
@SqlQuery("SELECT * FROM orders")
158+
fun findAll(): List<Order>
159+
}

kotlin-jvm/src/main/kotlin/playground/_main.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ fun main() {
1717
playground.exposed.main()
1818
playground.fuel.main()
1919
playground.hoplite.main()
20+
playground.jdbi.main()
2021
playground.klaxon.main()
2122
playground.kodein.db.main()
2223
playground.konad.main()

versions.properties

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -69,11 +69,14 @@ plugin.android=4.1.1
6969
## # available=7.1.0-alpha07
7070
## # available=7.1.0-alpha08
7171
## # available=7.1.0-alpha09
72+
7273
plugin.com.apollographql.apollo=2.5.7
7374
## # available=2.5.8
7475
## # available=2.5.9
76+
7577
plugin.com.github.ben-manes.versions=0.38.0
7678
## # available=0.39.0
79+
7780
plugin.com.squareup.sqldelight=1.5.0
7881
## # available=1.5.1
7982

@@ -145,6 +148,7 @@ version.com.beust..klaxon=5.5
145148
version.com.github.ajalt..mordant=1.2.1
146149

147150
version.com.github.ajalt.clikt..clikt=3.2.0
151+
148152
## unused
149153
version.com.github.ajalt.mordant..mordant=1.2.1
150154

@@ -230,16 +234,21 @@ version.it.skrape..skrapeit-http-fetcher=1.1.1
230234
## # available=1.1.3
231235
## # available=1.1.4
232236
## # available=1.1.5
237+
233238
version.junit=5.7.2
234239
### available=5.8.0-M1
235240
### available=5.8.0-RC1
241+
236242
version.junit.junit=4.13.2
243+
237244
version.kodein.di=7.7.0
245+
238246
version.kotest=4.4.3
239247
## # available=4.5.0.RC1
240248
## # available=4.5.0
241249
## # available=4.6.0
242250
## # available=4.6.1
251+
243252
version.kotlin=1.5.0
244253
## # available=1.5.10
245254
## # available=1.5.20-M1
@@ -262,19 +271,24 @@ version.kotlinx.html=0.7.3
262271

263272
version.kotlinx.serialization=1.2.1
264273
## # available=1.2.2
265-
version.ktor=1.5.4
274+
275+
version.ktor=1.5.4
266276
### available=1.6.0
267277
### available=1.6.1
268278
### available=1.6.2
279+
269280
version.mockito=3.10.0
270281
## # available=3.11.0
271282
## # available=3.11.1
272283
## # available=3.11.2
273284
## # available=3.12.0
274285
## # available=3.12.1
286+
275287
version.mockk=1.11.0
276288
### available=1.12.0
289+
277290
version.moshi=1.12.0
291+
278292
version.okhttp3=4.9.1
279293
## # available=4.10.0-RC1
280294
## # available=5.0.0-alpha.1
@@ -289,6 +303,10 @@ version.org.apache.velocity..velocity-engine-core=2.3
289303

290304
version.org.apache.velocity.tools..velocity-tools-generic=3.1
291305

306+
version.org.jdbi..jdbi3-core=3.27.2
307+
308+
version.org.jdbi..jdbi3-kotlin-sqlobject=3.27.2
309+
292310
version.org.jetbrains..markdown-jvm=0.2.3
293311
## # available=0.2.4
294312

@@ -350,12 +368,15 @@ version.org.slf4j..slf4j-simple=1.7.31
350368
## # available=2.0.0-alpha2
351369
## # available=2.0.0-alpha3
352370
## # available=2.0.0-alpha4
371+
353372
version.retrofit2=2.9.0
354-
version.spek=2.0.13
373+
374+
version.spek=2.0.13
355375
### available=2.0.14
356376
### available=2.0.15
357377
### available=2.0.16
358378
### available=2.0.17
379+
359380
version.sqldelight=1.5.0
360381
## # available=1.5.1
361382

0 commit comments

Comments
 (0)