在 Kotlin 中操作数据库:PostgreSQL 与 MongoDB

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

引言:为什么 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")}<                

博客

书籍推荐