Kotlin的ORM:Exposed、Room和Ktorm对比及示例

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

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

开始课程

Kotlin的ORM:对比与示例

在开发Kotlin应用程序时,处理数据库是一项关键任务。开发人员越来越多地使用ORM(对象关系映射)工具,而不是编写原始SQL查询,这些工具可以自动在对象模型和关系表之间转换数据。在本文中,我们将介绍三种流行的Kotlin ORM:Exposed、Room和Ktorm。我们将比较它们的架构、性能、易用性,并提供实际的代码示例。



1. Exposed——JetBrains的轻量级DSL库

Exposed 是由Kotlin的创建者开发的库。它不是一个传统意义上的完整ORM(如Hibernate),而是提供了两种方法:DSL(领域特定语言)用于以Kotlin风格编写查询,以及DAO(数据访问对象)用于处理对象。Exposed运行在JDBC之上,支持PostgreSQL、MySQL、H2、SQLite等数据库。



Exposed代码示例(DSL)

// 连接到数据库Database.connect("jdbc:h2:mem:test", driver = "org.h2.Driver")

// 定义表object Users : Table("users") { val id = integer("id").autoIncrement() val name = varchar("name", 50) val age = integer("age") override val primaryKey = PrimaryKey(id)}

// 插入和查询transaction { SchemaUtils.create(Users) Users.insert { it[name] = "Alice" it[age] = 30 } Users.selectAll().forEach { println("${it[Users.name]}: ${it[Users.age]}") }}


Exposed的优缺点

  • 优点:轻量级,完全控制SQL,与Kotlin协程良好集成,社区活跃。
  • 缺点:缺乏自动模式生成(需要手动创建),没有内置迁移支持(需要Flyway或Liquibase)。


2. Room——Google官方的Android ORM

Room 是Android Jetpack组件库的一部分。它提供了对SQLite的抽象层,并自动生成数据访问代码。Room使用注解和编译时代码生成(KAPT或KSP),从而提供高性能和类型安全。



Room代码示例

// 实体@Entity(tableName = "users")data class User(    @PrimaryKey(autoGenerate = true) val id: Int = 0,    val name: String,    val age: Int)

// DAO@Daointerface UserDao { @Query("SELECT * FROM users") suspend fun getAll(): List<User>

@Insert suspend fun insert(user: User)}

// 数据库@Database(entities = [User::class], version = 1)abstract class AppDatabase : RoomDatabase() { abstract fun userDao(): UserDao}


Room的优缺点

  • 优点:与Android完全集成,支持Flow和LiveData,自动代码生成,内置迁移支持。
  • 缺点:绑定Android平台(不适用于服务器或桌面应用程序),与Exposed相比更重。


3. Ktorm——Kotlin的函数式ORM

Ktorm 是一个现代的ORM库,提供函数式风格的数据库操作。它不使用注解和反射,而是依赖Kotlin DSL和扩展。Ktorm支持多种数据库管理系统(MySQL、PostgreSQL、Oracle、SQLite等),并且可以与JDBC以及SQL方言一起使用。



Ktorm代码示例

// 连接和定义表val database = Database.connect("jdbc:mysql://localhost/mydb", user = "root", password = "pass")

object Users : Table<Nothing>("users") { val id = int("id").primaryKey() val name = varch

推荐