引言:为什么 Kotlin 和数据库是理想组合
Kotlin 是一种运行在 JVM 之上的现代静态类型语言。凭借其简洁的语法、空安全(null safety)以及与 Java 的完全互操作性,Kotlin 已成为后端开发中增长最快的语言之一。在本文中,我们将探讨如何连接两个流行的数据库管理系统并执行 CRUD 操作:关系型数据库 PostgreSQL 和文档型数据库 MongoDB。
我们将介绍两种主要方法:使用 Exposed 库操作 SQL,以及使用 KMongo 框架操作 MongoDB。所有代码示例均使用纯 Kotlin 编写,可直接运行。
1. 通过 Exposed 库操作 PostgreSQL
1.1. 依赖配置
首先,在 build.gradle.kts 文件中添加以下依赖:
dependencies { implementation("org.jetbrains.exposed:exposed-core:0.44.0") implementation("org.jetbrains.exposed:exposed-dao:0.44.0") implementation("org.jetbrains.exposed:exposed-jdbc:0.44.0") implementation("org.postgresql:postgresql:42.6.0") implementation("com.zaxxer:HikariCP:5.0.1")}HikariCP 是一个高性能的连接池,我们将用它来管理数据库连接。
1.2. 连接数据库
创建一个用于管理连接的对象:
import com.zaxxer.hikari.HikariConfigimport com.zaxxer.hikari.HikariDataSourceimport org.jetbrains.exposed.sql.Database
object DatabaseFactory { fun init() { val config = HikariConfig().apply { driverClassName = "org.postgresql.Driver" jdbcUrl = "jdbc:postgresql://localhost:5432/my_db" username = "user" password = "password" maximumPoolSize = 10 isAutoCommit = false }
val dataSource = HikariDataSource(config) Database.connect(dataSource) }}1.3. 定义表和 CRUD 操作
Exposed 使用 DSL 风格来描述表。让我们定义一个简单的用户表:
import org.jetbrains.exposed.sql.Tableimport org.jetbrains.exposed.sql.*import org.jetbrains.exposed.sql.transactions.transaction
object Users : Table() { val id = integer("id").autoIncrement() val name = varchar("name", 100) val email = varchar("email", 255).uniqueIndex()
override val primaryKey = PrimaryKey(id)}
// 插入数据fun insertUser(name: String, email: String) { transaction { Users.insert { it[Users.name] = name it[Users.email] = email } }}
// 查询所有用户fun getAllUsers(): List<ResultRow> { return transaction { Users.selectAll().toList() }}
// 更新 emailfun updateUserEmail(id: Int, newEmail: String) { transaction { Users.update({ Users.id eq id }) { it[email] = newEmail } }}
// 删除用户fun deleteUser(id: Int) { transaction { Users.deleteWhere { Users.id eq id } }}1.4. Exposed 的特点
- 事务:所有操作都在
transaction块内执行。 - 类型安全:SQL 查询中的错误在编译阶段即可捕获。
- 迁移:Exposed 支持通过
SchemaUtils.create(Users)自动创建表。
2. 通过 KMongo 操作 MongoDB
2.1. 依赖配置
在 build.gradle.kts 中添加:
dependencies { implementation("org.litote.kmongo:kmongo-coroutine:4.9.0") implementation("org.litote.kmongo:kmongo-id:4.9.0")}<