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