การตั้งค่า 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การตั้งค่า Exposed: การเชื่อมต่อฐานข้อมูลและ DSL ธุรกรรม
- การกำหนดตารางด้วย DSL ของ Table
- CRUD ด้วย Query DSL: insert, select, update, delete
- Exposed DAO: คลาสเอนทิตีและความสัมพันธ์