Introdução ao trabalho com bancos de dados em Kotlin
\n\nKotlin é uma linguagem moderna estaticamente tipada, executada na JVM, que está ganhando popularidade rapidamente devido à sua concisão e segurança. Uma das habilidades essenciais para qualquer desenvolvedor é saber interagir com bancos de dados. Neste artigo, veremos como conectar e realizar as operações básicas (CRUD) com os dois tipos de BD mais populares: o relacional PostgreSQL e o orientado a documentos MongoDB.
\n\nUsaremos bibliotecas modernas, totalmente adaptadas ao Kotlin idiomático:
\n- \n
- Exposed — framework ORM da JetBrains para bancos de dados SQL (PostgreSQL, MySQL, etc.). \n
- KMongo — cliente ODM reativo para MongoDB, construído sobre corrotinas. \n
O artigo é voltado para iniciantes: abordaremos a configuração do projeto, a conexão ao BD e exemplos simples de inserção, leitura, atualização e exclusão de dados.
\n\n1. Configuração do projeto e adição de dependências
\n\nPara começar, crie um novo projeto Kotlin (por exemplo, via IntelliJ IDEA com Gradle ou Maven). Adicione as dependências necessárias no arquivo build.gradle.kts.
Dependências Gradle para PostgreSQL (Exposed)
\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 // Driver PostgreSQL\n implementation("org.postgresql:postgresql:42.7.1")\n\n // Pool de conexões (HikariCP)\n implementation("com.zaxxer:HikariCP:5.1.0")\n}\n\nDependências Gradle para MongoDB (KMongo)
\ndependencies {\n // KMongo (com corrotinas)\n implementation("org.litote.kmongo:kmongo-coroutine:4.11.0")\n\n // Ktor Client (se precisar de driver reativo)\n implementation("org.litote.kmongo:kmongo-async:4.11.0")\n}\n\nApós sincronizar o projeto, podemos prosseguir com a conexão.
\n\n2. Trabalhando com PostgreSQL via Exposed
\n\nO Exposed oferece duas abordagens: DSL (consultas SQL type-safe) e DAO (mapeamento objeto-relacional). Usaremos DAO, que é mais intuitivo para iniciantes.
\n\nConexão ao banco de dados
\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("Conexão com PostgreSQL estabelecida!")\n}\n\nDefinição da tabela e entidade
\nimport org.jetbrains.exposed.dao.id.IntIdTable\nimport org.jetbrains.exposed.dao.IntEntity\nimport org.jetbrains.exposed.dao.IntEntityClass\n\n// Definindo a tabela\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// Definindo a Entity (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\nOperações CRUD
\nfun performCRUD() {\n transaction {\n // Criar tabela (se não existir)\n SchemaUtils.create(UsersTable)\n\n // INSERT\n val newUser = UserEntity.new {\n name = "Ivan Petrov"\n email = "ivan@example.com"\n age = 25\n }\n println("Usuário criado