O que é Exposed e para que serve?
\n\nExposed é uma biblioteca ORM (Object-Relational Mapping) leve, porém poderosa, para a linguagem de programação Kotlin, desenvolvida pela empresa JetBrains. Ela oferece duas abordagens principais para trabalhar com bancos de dados: DSL (Domain Specific Language) e DAO (Data Access Objects).
\n\nPara que serve o Exposed?
\n- \n
- Type safety: Ao contrário de consultas SQL brutas, o Exposed usa construções tipadas do Kotlin, permitindo detectar erros em tempo de compilação. \n
- Concisão: O código em Exposed é significativamente mais curto e legível do que consultas SQL equivalentes ou código Java com JPA. \n
- Desempenho: Exposed não usa reflexão ou objetos proxy (como Hibernate), tornando-o muito rápido e previsível. \n
- Flexibilidade: Você pode alternar facilmente entre DSL (para consultas complexas) e DAO (para operações CRUD simples) dentro do mesmo projeto. \n
- Suporte a múltiplos bancos de dados: PostgreSQL, MySQL, MariaDB, SQLite, H2, Oracle, SQL Server. \n
Instalação do Exposed
\n\nO Exposed é instalado através do sistema de build Gradle ou Maven. Adicione as seguintes dependências ao seu build.gradle.kts:
dependencies {\n // Biblioteca principal\n implementation("org.jetbrains.exposed:exposed-core:0.44.1")\n // DSL para consultas\n implementation("org.jetbrains.exposed:exposed-dao:0.44.1")\n // Driver JDBC para seu banco de dados (exemplo para PostgreSQL)\n implementation("org.postgresql:postgresql:42.7.1")\n // Pool de conexões HikariCP (recomendado)\n implementation("com.zaxxer:HikariCP:5.1.0")\n // Logging SQL (opcional)\n implementation("ch.qos.logback:logback-classic:1.4.14")\n}\n\nPara Maven (pom.xml):
<dependency>\n <groupId>org.jetbrains.exposed</groupId>\n <artifactId>exposed-core</artifactId>\n <version>0.44.1</version>\n</dependency>\n\nInício rápido: exemplo de código
\n\nVamos criar uma aplicação simples para gerenciamento de tarefas (ToDo):
\n\nimport org.jetbrains.exposed.sql.*\nimport org.jetbrains.exposed.sql.transactions.transaction\nimport org.jetbrains.exposed.sql.SqlExpressionBuilder.eq\nimport java.time.LocalDateTime\n\n// 1. Definindo a tabela\nobject Tasks : Table() {\n val id = integer("id").autoIncrement()\n val title = varchar("title", 255)\n val description = text("description").nullable()\n val isCompleted = bool("is_completed").default(false)\n val createdAt = datetime("created_at").default(LocalDateTime.now())\n\n override val primaryKey = PrimaryKey(id)\n}\n\n// 2. Data class para conveniência\ndata class Task(\n val id: Int,\n val title: String,\n val description: String?,\n val isCompleted: Boolean,\n val createdAt: LocalDateTime\n)\n\nfun main() {\n // 3. Conectando ao banco de dados (H2 em memória para exemplo)\n Database.connect("jdbc:h2:mem:test;DB_CLOSE_DELAY=-1", driver = "org.h2.Driver")\n\n transaction {\n // 4. Criando a tabela\n SchemaUtils.create(Tasks)\n\n // 5. Inserindo dados\n val insertId = Tasks.insert {\n it[title] = "Estudar Exposed"\n it[description] = "Ler a documentação e escrever um exemplo"\n } get Tasks.id\n\n println("Tarefa inserida com ID: $insertId")\n\n // 6. Selecionando todas as tarefas\n val allTasks = Tasks.selectAll().map { row ->\n Task(\n id = row[Tasks.id],\n title = row[Tasks.title],\n description = row[Tasks.description],\n isCompleted = row[Tasks.isCompleted],\n createdAt = row[Tasks.createdAt]\n )\n }\n println("Todas as tarefas: $allTasks")\n\n // 7. Atualizando uma tarefa\n Tasks.updat Também na biblioteca
Doctrine ORM para PHP: guia completo com exemplos
Processamento de JSON em Kotlin: bibliotecas, parsing e serialização
Integração de métricas Prometheus em C++: biblioteca prometheus-cpp