¿Qué es Exposed y para qué sirve?
\n\nExposed 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
Instalación de Exposed
\n\nExposed se instala a través del sistema de compilación Gradle o Maven. Agregue las siguientes dependencias a su 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 // 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\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\nInicio rápido: ejemplo de código
\n\nCreemos una aplicación simple para la gestión de tareas (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. 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 También en la biblioteca
mimalloc en C++: guía completa con ejemplos prácticos
Event Bus y el patrón Observer en PHP: implementación y ejemplos
Trabajo con imágenes en Swift: guía completa para iOS y macOS
Generación de informes PDF en Go: revisión de bibliotecas y ejemplos de código