Exposed para Kotlin: guía completa con ejemplos

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

¿Qué es Exposed y para qué sirve?

\n\n

Exposed es una biblioteca ORM (Object-Relational Mapping) ligera pero potente para el lenguaje de programación Kotlin, desarrollada por la empresa JetBrains. Proporciona dos enfoques principales para trabajar con bases de datos: DSL (Domain Specific Language) y DAO (Data Access Objects).

\n\n

¿Para qué sirve Exposed?

\n
    \n
  • Seguridad de tipos: A diferencia de las consultas SQL en bruto, Exposed utiliza construcciones tipificadas de Kotlin, lo que permite detectar errores en tiempo de compilación.
  • \n
  • Concisión: El código en Exposed es significativamente más corto y legible que las consultas SQL equivalentes o el código en Java con JPA.
  • \n
  • Rendimiento: Exposed no utiliza reflexión ni objetos proxy (como Hibernate), lo que lo hace muy rápido y predecible.
  • \n
  • Flexibilidad: Puede cambiar fácilmente entre DSL (para consultas complejas) y DAO (para operaciones CRUD simples) dentro de un mismo proyecto.
  • \n
  • Soporte para múltiples bases de datos: PostgreSQL, MySQL, MariaDB, SQLite, H2, Oracle, SQL Server.
  • \n
\n\n

Instalación de Exposed

\n\n

Exposed se instala a través del sistema de compilación Gradle o Maven. Agregue las siguientes dependencias a su build.gradle.kts:

\n\n
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    // Controlador JDBC para su base de datos (ejemplo para PostgreSQL)\n    implementation("org.postgresql:postgresql:42.7.1")\n    // Pool de conexiones HikariCP (recomendado)\n    implementation("com.zaxxer:HikariCP:5.1.0")\n    // Registro de SQL (opcional)\n    implementation("ch.qos.logback:logback-classic:1.4.14")\n}
\n\n

Para Maven (pom.xml):

\n\n
<dependency>\n    <groupId>org.jetbrains.exposed</groupId>\n    <artifactId>exposed-core</artifactId>\n    <version>0.44.1</version>\n</dependency>
\n\n

Inicio rápido: ejemplo de código

\n\n

Creemos una aplicación simple para la gestión de tareas (ToDo):

\n\n
import 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. Definimos la tabla\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 mayor comodidad\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. Nos conectamos a la base de datos (H2 en memoria para el ejemplo)\n    Database.connect("jdbc:h2:mem:test;DB_CLOSE_DELAY=-1", driver = "org.h2.Driver")\n\n    transaction {\n        // 4. Creamos la tabla\n        SchemaUtils.create(Tasks)\n\n        // 5. Insertamos datos\n        val insertId = Tasks.insert {\n            it[title] = "Estudiar Exposed"\n            it[description] = "Leer la documentación y escribir un ejemplo"\n        } get Tasks.id\n\n        println("Tarea insertada con ID: $insertId")\n\n        // 6. Seleccionamos todas las tareas\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 las tareas: $allTasks")\n\n        // 7. Actualizamos una tarea\n        Tasks.updat                    

Recommendations