0Pricing
Kotlin Academy · บทเรียน

การตั้งค่า Exposed: การเชื่อมต่อฐานข้อมูลและ DSL ธุรกรรม

เชื่อมต่อฐานข้อมูล กำหนดค่า Exposed และเรียกใช้โค้ดภายในธุรกรรม

การตั้งค่า Exposed: การเชื่อมต่อฐานข้อมูลและ DSL ธุรกรรม เป็นบทเรียน Kotlin Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Kotlin Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Kotlin Academy มีบทเรียนทั้งหมด 4 บทเรียน

Exposed คืออะไร

Exposed คือเฟรมเวิร์ก SQL น้ำหนักเบาของ JetBrains สำหรับ Kotlin โดยมีสองระดับ ได้แก่ DSL สำหรับการสอบถาม (นิพจน์ SQL ที่ตรวจสอบชนิดข้อมูล) และ ชั้น DAO (เอนทิตีรูปแบบ Active Record) ทั้งสองระดับทำงานภายในธุรกรรมที่ระบุไว้อย่างชัดเจน

การเพิ่มไลบรารี Exposed

เพิ่มแกนหลัก สะพานเชื่อมไดรเวอร์ JDBC และไดรเวอร์ฐานข้อมูลที่คุณใช้:

dependencies {
    implementation("org.jetbrains.exposed:exposed-core:0.52.0")
    implementation("org.jetbrains.exposed:exposed-jdbc:0.52.0")
    implementation("org.jetbrains.exposed:exposed-dao:0.52.0")
    implementation("com.h2database:h2:2.2.224") // or postgresql driver
    implementation("com.zaxxer:HikariCP:5.1.0")  // connection pooling
}

การเชื่อมต่อกับฐานข้อมูล

เรียก Database.connect() เพียงครั้งเดียวเมื่อเริ่มต้นระบบ สำหรับสภาพแวดล้อมจริง ให้ส่ง HikariDataSource ส่วนการทดสอบใช้ URL ของ JDBC แบบธรรมดาได้:

import org.jetbrains.exposed.sql.Database

// Simple (dev/test)
Database.connect(
    url = "jdbc:h2:mem:test;DB_CLOSE_DELAY=-1",
    driver = "org.h2.Driver"
)

// Production with HikariCP
Database.connect(HikariDataSource(HikariConfig().apply {
    jdbcUrl = "jdbc:postgresql://localhost/mydb"
    username = "user"
    password = "pass"
    maximumPoolSize = 10
}))

บล็อกธุรกรรม { }

การดำเนินการทั้งหมดของ Exposed ต้องทำงานภายในบล็อก transaction { } Exposed จะยืนยันธุรกรรมเมื่อทำงานสำเร็จ และย้อนกลับธุรกรรมเมื่อเกิดข้อยกเว้นที่ไม่ได้ดักจับ:

transaction {
    // all DB operations here
    SchemaUtils.create(Users)
}

ธุรกรรมที่รองรับโคโรทีน

ใช้ newSuspendedTransaction { } จาก exposed-r2dbc หรือ exposed-spring-boot-starter สำหรับธุรกรรมที่ใช้ร่วมกับโคโรทีนได้ ใน Ktor ให้ครอบการเรียก Exposed ที่บล็อกการทำงานด้วย withContext(Dispatchers.IO) { transaction { ... } }:

suspend fun findUser(id: Long): User? = withContext(Dispatchers.IO) {
    transaction {
        UserEntity.findById(id)?.toUser()
    }
}

SchemaUtils: การสร้างและลบตาราง

ใช้ SchemaUtils.create(Table1, Table2) เพื่อสร้างตารางที่ยังไม่มีอยู่ และใช้ SchemaUtils.drop() เพื่อลบตาราง เรียกใช้ภายใน transaction { } ตอนเริ่มต้นแอปพลิเคชัน:

transaction {
    SchemaUtils.create(Users, Posts, Comments)
}

การกำหนดค่าการเชื่อมต่อใน Ktor

เริ่มต้นฐานข้อมูลในโมดูล Application เพื่อให้ทำงานเพียงครั้งเดียวเมื่อเซิร์ฟเวอร์เริ่มทำงาน:

fun Application.configureDatabase() {
    val dbUrl = environment.config.property("ktor.database.url").getString()
    Database.connect(dbUrl, driver = "org.postgresql.Driver",
        user = "...", password = "...")
    transaction { SchemaUtils.create(Users) }
}

ระดับการแยกธุรกรรม

ส่งระดับการแยกธุรกรรมให้กับ transaction() เมื่อต้องการการรับประกันความสอดคล้องของข้อมูลที่เข้มงวดขึ้นหรือผ่อนคลายลง:

transaction(Connection.TRANSACTION_SERIALIZABLE) {
    // serializable isolation
}

ธุรกรรมซ้อนกัน

โดยค่าเริ่มต้น การเรียก transaction { } ที่ซ้อนกันจะเข้าร่วมกับธุรกรรมภายนอก หากต้องการธุรกรรมอิสระ ให้ใช้ transaction(db, outerTransactionIsEmpty = false) { } หรือจุดบันทึก:

การบันทึก SQL

เปิดใช้การบันทึก SQL เพื่อดูคำสั่งสอบถามที่สร้างขึ้นระหว่างการพัฒนา กำหนด StdOutSqlLogger หรือตัวบันทึกแบบกำหนดเองภายในบล็อกธุรกรรม:

transaction {
    addLogger(StdOutSqlLogger)
    // ...
}

แนวทางปฏิบัติที่ดีสำหรับการใช้พูลการเชื่อมต่อ

ในสภาพแวดล้อมจริง ควรใช้ HikariCP (หรือเครื่องมือที่คล้ายกัน) เสมอ กำหนด maximumPoolSize ให้สอดคล้องกับจำนวนเธรดของเซิร์ฟเวอร์ และกำหนด connectionTimeout เพื่อให้ล้มเหลวอย่างรวดเร็วเมื่อพูลไม่มีการเชื่อมต่อเหลืออยู่ ควรตรวจสอบการใช้งานพูลในสภาพแวดล้อมจริง

ตรวจสอบความเข้าใจ

จะเกิดอะไรขึ้นหากมีข้อยกเว้นที่ไม่ได้ดักจับเกิดขึ้นภายในบล็อก transaction { } ของ Exposed

ทบทวน: การตั้งค่า Exposed และ DSL ธุรกรรม

ประเด็นสำคัญ:

  • เชื่อมต่อด้วย Database.connect() เพียงครั้งเดียวเมื่อเริ่มต้นระบบ (ใช้ HikariCP ในสภาพแวดล้อมจริง)
  • การดำเนินการกับฐานข้อมูลทั้งหมดทำงานภายใน transaction { } — ยืนยันธุรกรรมเมื่อสำเร็จ และย้อนกลับเมื่อเกิดข้อยกเว้น
  • สร้างหรือลบตารางด้วย SchemaUtils.create() ภายในธุรกรรม
  • ครอบการเรียก Exposed ที่บล็อกการทำงานด้วย withContext(Dispatchers.IO) ในบริบทของโคโรทีน
  • เปิดใช้ StdOutSqlLogger ระหว่างการพัฒนาเพื่อตรวจสอบ SQL ที่สร้างขึ้น

คำถามที่พบบ่อย

บทเรียน “การตั้งค่า Exposed: การเชื่อมต่อฐานข้อมูลและ DSL ธุรกรรม” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “การตั้งค่า Exposed: การเชื่อมต่อฐานข้อมูลและ DSL ธุรกรรม” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Kotlin Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Kotlin Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “การตั้งค่า Exposed: การเชื่อมต่อฐานข้อมูลและ DSL ธุรกรรม”

เชื่อมต่อฐานข้อมูล กำหนดค่า Exposed และเรียกใช้โค้ดภายในธุรกรรม คุณปฏิบัติ Kotlin Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Kotlin Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Kotlin Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน

บทเรียน “การตั้งค่า Exposed: การเชื่อมต่อฐานข้อมูลและ DSL ธุรกรรม” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Kotlin Academy นี้ได้ไหม

ได้ บทเรียน Kotlin Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. การตั้งค่า Exposed: การเชื่อมต่อฐานข้อมูลและ DSL ธุรกรรม
  2. การกำหนดตารางด้วย DSL ของ Table
  3. CRUD ด้วย Query DSL: insert, select, update, delete
  4. Exposed DAO: คลาสเอนทิตีและความสัมพันธ์
← กลับไปที่ Kotlin Academy