Exposed क्या है और इसकी आवश्यकता क्यों है?
Exposed, JetBrains द्वारा विकसित Kotlin प्रोग्रामिंग भाषा के लिए एक हल्की लेकिन शक्तिशाली ORM (Object-Relational Mapping) लाइब्रेरी है। यह डेटाबेस के साथ काम करने के लिए दो मुख्य दृष्टिकोण प्रदान करती है: DSL (Domain Specific Language) और DAO (Data Access Objects)।
Exposed की आवश्यकता क्यों है?
- टाइप-सेफ्टी: कच्चे SQL क्वेरी के विपरीत, Exposed Kotlin के टाइप किए गए कंस्ट्रक्शन का उपयोग करता है, जिससे कंपाइल टाइम पर ही एरर पकड़ी जा सकती हैं।
- संक्षिप्तता: Exposed पर कोड समतुल्य SQL क्वेरी या JPA के साथ Java कोड की तुलना में काफी छोटा और पढ़ने में आसान होता है।
- प्रदर्शन: Exposed रिफ्लेक्शन और प्रॉक्सी ऑब्जेक्ट (जैसे Hibernate) का उपयोग नहीं करता, जिससे यह बहुत तेज़ और पूर्वानुमानित होता है।
- लचीलापन: आप एक ही प्रोजेक्ट में जटिल क्वेरी के लिए DSL और सरल CRUD ऑपरेशन के लिए DAO के बीच आसानी से स्विच कर सकते हैं।
- कई डेटाबेस का समर्थन: PostgreSQL, MySQL, MariaDB, SQLite, H2, Oracle, SQL Server।
Exposed की स्थापना (इंस्टॉलेशन)
Exposed को Gradle या Maven बिल्ड सिस्टम के माध्यम से स्थापित किया जाता है। अपने build.gradle.kts में निम्नलिखित डिपेंडेंसी जोड़ें:
dependencies {
// मुख्य लाइब्रेरी
implementation("org.jetbrains.exposed:exposed-core:0.44.1")
// क्वेरी के लिए DSL
implementation("org.jetbrains.exposed:exposed-dao:0.44.1")
// आपके डेटाबेस के लिए JDBC ड्राइवर (PostgreSQL का उदाहरण)
implementation("org.postgresql:postgresql:42.7.1")
// HikariCP कनेक्शन पूल (अनुशंसित)
implementation("com.zaxxer:HikariCP:5.1.0")
// SQL लॉगिंग (वैकल्पिक)
implementation("ch.qos.logback:logback-classic:1.4.14")
}
Maven (pom.xml) के लिए:
<dependency>
<groupId>org.jetbrains.exposed</groupId>
<artifactId>exposed-core</artifactId>
<version>0.44.1</version>
</dependency>
त्वरित शुरुआत: कोड उदाहरण
चलिए कार्य प्रबंधन (ToDo) के लिए एक सरल एप्लिकेशन बनाते हैं:
import org.jetbrains.exposed.sql.*
import org.jetbrains.exposed.sql.transactions.transaction
import org.jetbrains.exposed.sql.SqlExpressionBuilder.eq
import java.time.LocalDateTime
// 1. टेबल को परिभाषित करें
object Tasks : Table() {
val id = integer("id").autoIncrement()
val title = varchar("title", 255)
val description = text("description").nullable()
val isCompleted = bool("is_completed").default(false)
val createdAt = datetime("created_at").default(LocalDateTime.now())
override val primaryKey = PrimaryKey(id)
}
// 2. सुविधा के लिए Data class
data class Task(
val id: Int,
val title: String,
val description: String?,
val isCompleted: Boolean,
val createdAt: LocalDateTime
)
fun main() {
// 3. डेटाबेस से कनेक्ट करें (उदाहरण के लिए मेमोरी में H2)
Database.connect("jdbc:h2:mem:test;DB_CLOSE_DELAY=-1", driver = "org.h2.Driver")
transaction {
// 4. टेबल बनाएं
SchemaUtils.create(Tasks)
// 5. डेटा डालें
val insertId = Tasks.insert {
it[title] = "Exposed सीखें"
it[description] = "डॉक्यूमेंटेशन पढ़ें और उदाहरण लिखें"
} get Tasks.id
println("ID के साथ कार्य डाला गया: $insertId")
// 6. सभी कार्य चुनें
val allTasks = Tasks.selectAll().map { row ->
Task(
id = row[Tasks.id],
title = row[Tasks.title],
description = row[Tasks.description],
isCompleted = row[Tasks.isCompleted],
createdAt = row[Tasks.createdAt]
)
}
println("सभी कार्य: $allTasks")
// 7. कार्य अपडेट करें
Tasks.update({ Tasks.id eq 1 }) {
it[isCompleted] = true
}
// 8. कार्य हटाएं पुस्तकालय में भी
जावास्क्रिप्ट (Node.js) में रेट लिमिटिंग: express-rate-limit लाइब्रेरी के लिए पूर्ण गाइड
Rust में इमेज प्रोसेसिंग: image और imageproc के साथ resize और crop
Laravel Telescope PHP: पूरी गाइड, उदाहरण और इंस्टॉलेशन
JavaScript (Node.js) में PDF जनरेशन: PDF बनाने के लिए लाइब्रेरी और टूल्स
जावा में परीक्षण: फ्रेमवर्क और उपकरण (JUnit, TestNG, Mockito)