Kotlin数据库操作入门
\n\nKotlin是一种运行在JVM上的现代静态类型语言,凭借其简洁性和安全性迅速流行起来。任何开发者的关键技能之一就是能够与数据库进行交互。在本文中,我们将探讨如何连接并执行两种最流行数据库类型的基本操作(CRUD):关系型PostgreSQL和文档型MongoDB。
\n\n我们将使用最适应Kotlin惯用法的现代库:
\n- \n
- Exposed — JetBrains为SQL数据库(PostgreSQL、MySQL等)开发的ORM框架。 \n
- KMongo — 基于协程的MongoDB反应式ODM客户端。 \n
本文面向初学者:我们将讲解项目配置、数据库连接以及插入、读取、更新和删除数据的简单示例。
\n\n1. 项目配置和依赖添加
\n\n首先,创建一个新的Kotlin项目(例如,通过IntelliJ IDEA使用Gradle或Maven)。在build.gradle.kts文件中添加必要的依赖。
PostgreSQL(Exposed)的Gradle依赖
\ndependencies {\n // Exposed\n implementation("org.jetbrains.exposed:exposed-core:0.44.1")\n implementation("org.jetbrains.exposed:exposed-dao:0.44.1")\n implementation("org.jetbrains.exposed:exposed-jdbc:0.44.1")\n\n // PostgreSQL驱动\n implementation("org.postgresql:postgresql:42.7.1")\n\n // 连接池(HikariCP)\n implementation("com.zaxxer:HikariCP:5.1.0")\n}\n\nMongoDB(KMongo)的Gradle依赖
\ndependencies {\n // KMongo(带协程)\n implementation("org.litote.kmongo:kmongo-coroutine:4.11.0")\n\n // Ktor客户端(如果需要反应式驱动)\n implementation("org.litote.kmongo:kmongo-async:4.11.0")\n}\n\n项目同步后,即可开始连接。
\n\n2. 通过Exposed操作PostgreSQL
\n\nExposed提供了两种方法:DSL(类型安全的SQL查询)和DAO(对象关系映射)。我们将介绍DAO——它对初学者更直观。
\n\n连接数据库
\nimport org.jetbrains.exposed.sql.Database\nimport org.jetbrains.exposed.sql.transactions.transaction\nimport com.zaxxer.hikari.HikariConfig\nimport com.zaxxer.hikari.HikariDataSource\n\nfun connectToPostgres() {\n val config = HikariConfig().apply {\n jdbcUrl = "jdbc:postgresql://localhost:5432/mydb"\n driverClassName = "org.postgresql.Driver"\n username = "user"\n password = "password"\n maximumPoolSize = 10\n }\n val dataSource = HikariDataSource(config)\n Database.connect(dataSource)\n println("PostgreSQL连接已建立!")\n}\n\n定义表和实体
\nimport org.jetbrains.exposed.dao.id.IntIdTable\nimport org.jetbrains.exposed.dao.IntEntity\nimport org.jetbrains.exposed.dao.IntEntityClass\n\n// 定义表\nobject UsersTable : IntIdTable("users") {\n val name = varchar("name", 100)\n val email = varchar("email", 255).uniqueIndex()\n val age = integer("age").default(18)\n}\n\n// 定义实体(DAO)\nclass UserEntity(id: EntityID<Int>) : IntEntity(id) {\n companion object : IntEntityClass<UserEntity>(UsersTable)\n\n var name by UsersTable.name\n var email by UsersTable.email\n var age by UsersTable.age\n}\n\nCRUD操作
\nfun performCRUD() {\n transaction {\n // 创建表(如果不存在)\n SchemaUtils.create(UsersTable)\n\n // INSERT\n val newUser = UserEntity.new {\n name = "伊万·彼得罗夫"\n email = "ivan@example.com"\n age = 25\n }\n println("用户已创建