Kotlin Academy · บทเรียน

Exposed DAO: คลาสเอนทิตีและความสัมพันธ์

ใช้ API ของ DAO เพื่อจับคู่ตารางกับคลาสเอนทิตีและสำรวจความสัมพันธ์

บทเรียน 4 จาก 413 ขั้นตอน

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

ชั้น DAO ของ Exposed คืออะไร

ชั้น DAO (Data Access Object) ของ Exposed ครอบ Query DSL ไว้ด้วย API ในรูปแบบ Active Record คุณกำหนดคลาสย่อยของ Entity เพื่อจับคู่กับแถวในตาราง และอ่านหรือเขียนพร็อพเพอร์ตีได้โดยตรงจากอินสแตนซ์ของเอนทิตี

การกำหนด Entity

จับคู่ LongIdTable กับคลาสย่อยของ Entity แต่ละคลาสเอนทิตีจะมี EntityClass ที่เป็นคลาสคู่กันสำหรับจัดการการสอบถามข้อมูล:

object Users : LongIdTable("users") {
    val name  = varchar("name", 100)
    val email = varchar("email", 255)
}

class User(id: EntityID<Long>) : LongEntity(id) {
    companion object : LongEntityClass<User>(Users)
    var name  by Users.name
    var email by Users.email
}

การสร้าง Entity

ใช้ Entity.new { } ภายใน transaction { } เพื่อสร้างแถวใหม่และรับอินสแตนซ์ของเอนทิตีกลับมา:

val alice: User = transaction {
    User.new {
        name  = "Alice"
        email = "alice@example.com"
    }
}

การค้นหา Entity

EntityClass ที่เป็นคลาสคู่กันมีเมธอดสำหรับค้นหา ได้แก่ findById(id), all() และ find { condition }:

transaction {
    val user: User? = User.findById(1L)
    val allUsers: SizedIterable<User> = User.all()
    val filtered = User.find { Users.name like "Al%" }.toList()
}

การอัปเดต Entity

อ่านเอนทิตี แก้ไขค่าพร็อพเพอร์ตีภายในธุรกรรม แล้ว Exposed จะสร้างคำสั่ง UPDATE ให้อัตโนมัติเมื่อธุรกรรมยืนยันการเปลี่ยนแปลง:

transaction {
    val user = User.findById(1L) ?: error("Not found")
    user.name = "Alice Smith"
    // UPDATE issued on transaction commit
}

การลบ Entity

เรียก entity.delete() ภายในธุรกรรมเพื่อลบแถวที่เกี่ยวข้อง:

transaction {
    User.findById(5L)?.delete()
}

ความสัมพันธ์แบบหนึ่งต่อหลาย

อ้างอิงเอนทิตีแม่จากเอนทิตีลูกโดยใช้ reference() บนตาราง และพร็อพเพอร์ตีแบบมอบหมายด้วย by บนเอนทิตี จากนั้นเข้าถึงรายการเอนทิตีลูกจากเอนทิตีแม่ผ่าน referrersOn:

object Posts : LongIdTable("posts") {
    val title    = varchar("title", 300)
    val authorId = reference("author_id", Users)
}
class Post(id: EntityID<Long>) : LongEntity(id) {
    companion object : LongEntityClass<Post>(Posts)
    var title  by Posts.title
    var author by User referencedOn Posts.authorId
}
// On User entity:
val posts by Post referrersOn Posts.authorId

ความสัมพันธ์แบบหลายต่อหลาย

ใช้ตารางเชื่อมตรงกลาง เปิดเผยตารางนี้เป็น EntityClass แล้วเข้าถึงทั้งสองฝั่งด้วย via():

object UserRoles : Table("user_roles") {
    val user = reference("user_id", Users)
    val role = reference("role_id", Roles)
}
// On User entity:
var roles by Role via UserRoles

การโหลดล่วงหน้าเทียบกับการโหลดเมื่อจำเป็น

ตามค่าเริ่มต้น Exposed จะโหลดเอนทิตีที่เกี่ยวข้องเมื่อมีการเรียกใช้ — การเข้าถึงแต่ละครั้งจะส่งคำสั่งสอบถาม SQL หนึ่งครั้ง ใช้ load() หรือ with() เพื่อโหลดความสัมพันธ์ล่วงหน้าและหลีกเลี่ยงปัญหาการสอบถามแบบ N+1:

transaction {
    User.all().with(User::posts).forEach { user ->
        println("${user.name}: ${user.posts.count()} posts")
    }
}

การแคชภายในธุรกรรม

Exposed จะแคชอินสแตนซ์ของเอนทิตีไว้ภายในธุรกรรม การเข้าถึงเอนทิตีเดียวกันด้วย ID หลายครั้งในธุรกรรมเดียวกันจะคืนอ็อบเจ็กต์ในหน่วยความจำตัวเดิม จึงไม่ต้องส่งคำขอไปยังฐานข้อมูลซ้ำโดยไม่จำเป็น

ควรใช้ DAO หรือ Query DSL เมื่อใด

ใช้ชั้น DAO เมื่อคุณต้องการรูปแบบการเข้าถึงแบบเชิงวัตถุพร้อมความสัมพันธ์ระหว่างเอนทิตี ใช้ Query DSL สำหรับการดำเนินการกับข้อมูลจำนวนมาก การเชื่อมตารางที่ซับซ้อน การรวมข้อมูล หรือเมื่อประสิทธิภาพสำคัญและคุณต้องการควบคุม SQL ได้อย่างละเอียด

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

คุณจะสร้างแถวใหม่และรับอินสแตนซ์ของเอนทิตีทันทีโดยใช้ DAO ของ Exposed ได้อย่างไร

สรุป: DAO ของ Exposed — คลาส Entity และความสัมพันธ์

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

  • จับคู่ LongIdTable กับคลาสย่อยของ LongEntity; พร็อพเพอร์ตีจะมอบหมายการทำงานให้คำจำกัดความของคอลัมน์
  • Entity.new { } — สร้าง; findById(), find { }, all() — สอบถามข้อมูล; entity.delete() — ลบ
  • หนึ่งต่อหลาย: referencedOn (ฝั่งลูก), referrersOn (ฝั่งแม่)
  • หลายต่อหลาย: ตารางเชื่อม + via()
  • ใช้ with() เพื่อโหลดความสัมพันธ์ล่วงหน้าและหลีกเลี่ยงการสอบถามแบบ N+1
เริ่มต้นได้ฟรี

เรียนรู้ Kotlin ด้วย AI tutor — ฟรี

เขียนและเรียกใช้โค้ดจริงในเบราว์เซอร์ของคุณ รับความช่วยเหลือทันทีจาก AI tutor 24/7 และเรียนรู้ต่อจากที่คุณหยุดบนเว็บหรือในแอป

คอร์ส
51
บทเรียน
203

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

บทเรียน “Exposed DAO: คลาสเอนทิตีและความสัมพันธ์” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “Exposed DAO: คลาสเอนทิตีและความสัมพันธ์”

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

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

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

บทเรียน “Exposed DAO: คลาสเอนทิตีและความสัมพันธ์” ใช้เวลานานแค่ไหน

บทเรียน 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