Introdução: Por que Kotlin para Trabalhar com Bancos de Dados?
Kotlin é uma linguagem moderna de tipagem estática que é totalmente compatível com Java e é ativamente usada para criar aplicações backend. Graças à sua sintaxe concisa, segurança contra nulos e ferramentas poderosas, Kotlin é ideal para trabalhar com bancos de dados relacionais (PostgreSQL) e orientados a documentos (MongoDB). Neste artigo, analisaremos exemplos práticos de conexão, realização de operações CRUD e otimização de consultas.
Veremos duas bibliotecas populares: Exposed (para PostgreSQL) e KMongo (para MongoDB). Você aprenderá como configurar o ambiente, escrever consultas eficientes e evitar erros comuns.
1. Trabalhando com PostgreSQL via Exposed
Exposed é uma biblioteca ORM para Kotlin que fornece duas APIs: DSL (Domain-Specific Language) para escrever consultas no estilo SQL e DAO (Data Access Object) para uma abordagem orientada a objetos. Vamos ver ambas as opções.
1.1. Conexão e Configuração
Adicione as dependências ao build.gradle.kts:
dependencies { implementation("org.jetbrains.exposed:exposed-core:0.41.1") implementation("org.jetbrains.exposed:exposed-dao:0.41.1") implementation("org.jetbrains.exposed:exposed-jdbc:0.41.1") implementation("org.postgresql:postgresql:42.5.0")}Conectando ao banco de dados:
import org.jetbrains.exposed.sql.Databaseimport org.jetbrains.exposed.sql.transactions.transaction
fun main() { Database.connect( url = "jdbc:postgresql://localhost:5432/mydb", driver = "org.postgresql.Driver", user = "user", password = "password" ) println("Conexão com PostgreSQL estabelecida")}1.2. Criando uma Tabela e Operações CRUD (DSL)
Vamos definir a tabela Users:
import org.jetbrains.exposed.sql.Tableimport org.jetbrains.exposed.sql.insertimport org.jetbrains.exposed.sql.selectAllimport org.jetbrains.exposed.sql.update
object Users : Table() { val id = integer("id").autoIncrement() val name = varchar("name", 50) val email = varchar("email", 100).uniqueIndex() override val primaryKey = PrimaryKey(id)}Vamos realizar operações CRUD:
transaction { // Criando a tabela SchemaUtils.create(Users)
// INSERT Users.insert { it[name] = "Alexey" it[email] = "alex@example.com" }
// SELECT val users = Users.selectAll().map { "${it[Users.id]}: ${it[Users.name]} (${it[Users.email]})" } println(users)
// UPDATE Users.update({ Users.id eq 1 }) { it[name] = "Alexey Ivanov" }
// DELETE (usando deleteWhere) Users.deleteWhere { Users.id eq 2 }}1.3. Abordagem DAO
Vamos criar uma entidade e uma classe DAO:
import org.jetbrains.exposed.dao.IntEntityimport org.jetbrains.exposed.dao.IntEntityClassimport org.jetbrains.exposed.dao.id.EntityIDimport org.jetbrains.exposed.dao.id.IntIdTable
object UsersDAO : IntIdTable() { val name = varchar("name", 50) val email = varchar("email", 100)}
class User(id: EntityID<Int>) : IntEntity(id) { companion object : IntEntityClass<User>(UsersDAO) var name by UsersDAO.name var email by UsersDAO.email}
// Uso (Usage)transaction { val newUser = User.new { name = "Maria" email = "maria@example.com" } println("Usuário criado com ID: ${newUser.id.value}")}2. Trabalhando com MongoDB via KMongo
KMongo é um driver orientado a corrotinas para MongoDB, construído sobre o driver Java oficial. Ele suporta serialização via kotlinx.serialization e Jackson.
2.1. Conectando o KMongo
Adicione ao build.gradle.kts: