Kotlin e PostgreSQL: uma dupla inesperada para o seu backend
\n\nQuando se trata de desenvolvimento moderno de backend, Kotlin e PostgreSQL aparecem cada vez mais na mesma frase. E isso não é por acaso. Kotlin traz concisão e recursos funcionais ao mundo JVM, enquanto o PostgreSQL continua sendo o padrão de confiabilidade e flexibilidade entre os bancos de dados relacionais. Neste guia, vamos explorar como integrar essas duas tecnologias, escrever código real e analisar as melhores práticas.
\n\nSe você já conhece Kotlin para backend ou está apenas começando — este artigo fornecerá um plano de ação claro. Vamos nessa!
\n\nPor que Kotlin + PostgreSQL é incrível?
\n\nKotlin é uma linguagem que faz você se apaixonar desde as primeiras linhas. É compatível com Java, mas elimina toneladas de código boilerplate. E o PostgreSQL não é apenas "mais um banco de dados". É uma ferramenta poderosa com suporte a JSON, busca em texto completo, funções de janela e extensões como PostGIS.
\n\nJuntos, eles oferecem:
\n- \n
- Segurança contra nulos em nível de tipo — Kotlin protege você de NPE ao trabalhar com resultados de consultas. \n
- Assincronicidade nativa — as corrotinas do Kotlin são ideais para trabalhar com pools de conexão. \n
- DSL para SQL — bibliotecas como Exposed permitem escrever consultas como parte da linguagem. \n
- Desempenho — JVM + driver JDBC otimizado proporcionam excelente velocidade. \n
Preparação do ambiente: o que instalar
\n\nAntes de escrever código, certifique-se de ter:
\n- \n
- JDK 17+ instalado \n
- IntelliJ IDEA (a Community Edition é suficiente) \n
- PostgreSQL 14+ (pode ser via Docker:
docker run --name pg -e POSTGRES_PASSWORD=pass -p 5432:5432 -d postgres) \n - Conhecimento básico de SQL \n
Crie um novo projeto Gradle no IntelliJ. Em build.gradle.kts, adicione as dependências:
dependencies {\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 implementation("org.postgresql:postgresql:42.7.1")\n implementation("com.zaxxer:HikariCP:5.1.0")\n implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3")\n}\n\nConexão com PostgreSQL via HikariCP
\n\nPara trabalhar com PostgreSQL em Kotlin, precisamos de um pool de conexões. O HikariCP é o padrão de facto. É rápido, leve e configurável em poucas linhas.
\n\nCrie a classe DatabaseFactory:
import com.zaxxer.hikari.HikariConfig\nimport com.zaxxer.hikari.HikariDataSource\nimport org.jetbrains.exposed.sql.Database\n\nobject DatabaseFactory {\n fun init() {\n val config = HikariConfig().apply {\n jdbcUrl = "jdbc:postgresql://localhost:5432/yourdb"\n driverClassName = "org.postgresql.Driver"\n username = "postgres"\n password = "pass"\n maximumPoolSize = 10\n isAutoCommit = false\n transactionIsolation = "TRANSACTION_REPEATABLE_READ"\n }\n\n val dataSource = HikariDataSource(config)\n Database.connect(dataSource)\n }\n}\n\nObserve: isAutoCommit = false nos dá controle sobre as transações. Isso é importante para a consistência dos dados.
Criação de tabelas com Exposed ORM
\n\nExposed é um ORM leve para Kotlin que não impõe suas próprias regras. Você pode trabalhar tanto com DSL quanto com objetos DAO.
\n\nVamos definir o modelo de usuário:
\n\nimport org.jetbrains.exposed.sql.Table\n\nobject Users : Table("users") {\n val id = integer("id").autoIncrement()\n val name = varchar("name", 100)\n val email = varchar("email", 255).uniqueIndex()\n val