ORM para Kotlin: comparação e exemplos
Ao desenvolver aplicações em Kotlin, trabalhar com bancos de dados é uma das tarefas principais. Em vez de escrever consultas SQL brutas, os desenvolvedores estão cada vez mais usando ORM (Object-Relational Mapping) — ferramentas que automatizam a conversão de dados entre o modelo de objetos e as tabelas relacionais. Neste artigo, veremos três ORMs populares para Kotlin: Exposed, Room e Ktorm. Compararemos sua arquitetura, desempenho, facilidade de uso e forneceremos exemplos práticos de código.
1. Exposed — biblioteca DSL leve da JetBrains
Exposed é uma biblioteca desenvolvida pelos criadores do Kotlin. Ela não é um ORM completo no sentido clássico (como Hibernate), mas oferece duas abordagens: DSL (Domain Specific Language) para escrever consultas no estilo Kotlin e DAO (Data Access Objects) para trabalhar com objetos. O Exposed funciona sobre JDBC e suporta PostgreSQL, MySQL, H2, SQLite e outros.
Exemplo de código com Exposed (DSL)
// Conexão ao banco de dadosDatabase.connect("jdbc:h2:mem:test", driver = "org.h2.Driver")
// Definição da tabelaobject Users : Table("users") { val id = integer("id").autoIncrement() val name = varchar("name", 50) val age = integer("age") override val primaryKey = PrimaryKey(id)}
// Inserção e consultatransaction { SchemaUtils.create(Users) Users.insert { it[name] = "Alice" it[age] = 30 } Users.selectAll().forEach { println("${it[Users.name]}: ${it[Users.age]}") }}Prós e contras do Exposed
- Prós: leve, controle total sobre SQL, boa integração com Kotlin Coroutines, comunidade ativa.
- Contras: ausência de geração automática de esquema (precisa criar manualmente), sem suporte nativo a migrações (requer Flyway ou Liquibase).
2. Room — ORM oficial para Android do Google
Room é uma biblioteca que faz parte do Android Jetpack. Ela fornece uma camada de abstração sobre o SQLite e gera automaticamente o código para acesso aos dados. O Room usa anotações e compilação em tempo de build (KAPT ou KSP), garantindo alta performance e segurança de tipos.
Exemplo de código com Room
// Entidade@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)}
// Banco de dados@Database(entities = [User::class], version = 1)abstract class AppDatabase : RoomDatabase() { abstract fun userDao(): UserDao}Prós e contras do Room
- Prós: integração total com Android, suporte a Flow e LiveData, geração automática de código, migrações integradas.
- Contras: vinculado à plataforma Android (não adequado para aplicações servidoras ou desktop), mais pesado em comparação ao Exposed.
3. Ktorm — ORM funcional para Kotlin
Ktorm é uma biblioteca ORM moderna que oferece um estilo funcional de trabalho com bancos de dados. Ela não usa anotações ou reflexão, mas sim DSL e extensões do Kotlin. O Ktorm suporta vários SGBDs (MySQL, PostgreSQL, Oracle, SQLite, etc.) e pode funcionar tanto com JDBC quanto com dialetos SQL.
Exemplo de código com Ktorm
// Conexão e definição da tabelaval database = Database.connect("jdbc:mysql://localhost/mydb", user = "root", password = "pass")
object Users : Table<Nothing>("users") { val id = int("id").primaryKey() val name = varch Também na biblioteca
Biblioteca WebSocket em C++: guia completo para escolha e uso
Autorização e Autenticação em Rust: Bibliotecas e Ferramentas
Autorização e Autenticação em C# (.NET): Guia Completo