iT邦幫忙

2021 iThome 鐵人賽

DAY 8
1
Modern Web

Kotlin 怎麼操作資料庫?談談 Kotlin Exposed 框架系列 第 8

[Day 08] Kotlin DAO 其他和資料庫互動的方式

昨天我們看過了使用 Kotlin DAO 進行資料庫 CRUD 的方式。

今天我們來看看,除了基本的 CRUD,我們透過 DAO 還有什麼操作資料庫的方式。

排序

我們可以用 sortedBy() 進行資料的排序

transaction {  
 	SchemaUtils.create(Users)  
    User.new {  
 		cityId = 1  
 		name = "Carol"  
 	}  
 	User.new {  
 		cityId = 1  
 		name = "Alice"  
 	}  
 	User.new {  
 		cityId = 2  
 		name = "Bob"  
 	}  
 	User  
        .all()  
        .sortedBy{ it.name }  
 		.forEach{  
			println("name: ${it.name}")  
        }  
}

印出的結果根據 User.name的字母順序排序,會是

name: Alice
name: Bob
name: Carol

如果我們希望反向排列,我們可以用 sortedByDescending()

User  
    .all()  
    .sortedByDescending{ it.name }  
	.forEach{  
		println("name: ${it.name}")  
    }

這樣,我們的資料就會依照字母順序反向排序了

name: Carol
name: Bob
name: Alice

型態轉換

有時候我們需要的資料型態,和資料庫內實際儲存的資料型態,可能是不太一樣的。

如果每次我們在使用資料時,都要進行資料型態轉換的話,會在很多地方撰寫轉換的邏輯,導致開發和維護上的困擾。

這時候,我們可以將資料轉換定義在 DAO 裏面,合併所有轉換資料邏輯的位置。

比方說,我們希望 user.cityId 在資料庫是整數,在程式裡面固定是字串的話,我們可以利用 transform() 函數,來改寫 User 類別

class User(id: EntityID<Int>) : IntEntity(id) {  
    companion object : IntEntityClass<User>(Users)  
    var cityId by Users.cityId.transform({ it.toInt() }, { it.toString() })  
    var name by Users.name  
}

這樣會導致程式裏面的邏輯均要以字串處理,否則會無法編譯成功

transaction {  
	SchemaUtils.create(Users)  
    User.new {  
 		cityId = "1"  
 		name = "Carol"  
	}  
 	User.new {  
 		cityId = "1"  
 		name = "Alice"  
 	}  
 	User.new {  
 		cityId = "2"  
 		name = "Bob"  
 	}

最後我們可以利用 javaClass.kotlin 參數,來看 cityId 拿到的型態

User  
    .all()  
    .first()  
    .let {  
		println(it.cityId.javaClass.kotlin)  
    }

執行程式後,我們會看到

class kotlin.String

代表我們撰寫的程式內,cityId 確實被轉換成字串型態了。


上一篇
[Day 07] 透過 DAO 和資料庫進行互動
下一篇
[Day 09] 資料和資料之間的一對多關聯
系列文
Kotlin 怎麼操作資料庫?談談 Kotlin Exposed 框架30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言