Kotlin Academy · บทเรียน

CRUD ด้วย Query DSL: insert, select, update, delete

ดำเนินการ CRUD ทั้งหมดด้วย Query DSL ที่ปลอดภัยด้านชนิดของ Exposed

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

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

ภาพรวม DSL สำหรับการสอบถาม

DSL สำหรับการสอบถามของ Exposed ช่วยให้คุณเขียนการดำเนินการกับ SQL ที่ตรวจสอบชนิดข้อมูลได้โดยใช้ฟังก์ชันของ Kotlin การดำเนินการทั้งหมดจะทำภายในบล็อก transaction { } ไม่มีสตริงที่กำหนดแบบฝังตายตัว การอ้างอิงคอลัมน์คือพร็อพเพอร์ตีของ Kotlin ดังนั้นข้อผิดพลาดจากการพิมพ์ชื่อจึงถูกตรวจพบระหว่างการคอมไพล์

การแทรกข้อมูล

ใช้ Table.insert { } เพื่อเพิ่มแถว โดยแลมบ์ดาจะได้รับ InsertStatement และคุณกำหนดค่าคอลัมน์โดยใช้ตัวดำเนินการ [column]:

transaction {
    Users.insert {
        it[Users.name]  = "Alice"
        it[Users.email] = "alice@example.com"
        it[Users.age]   = 30
    }
}

การแทรกข้อมูลและรับรหัสที่สร้างขึ้น

ใช้ insertAndGetId { } บน IdTable เพื่อดึงคีย์หลักที่สร้างขึ้นโดยอัตโนมัติหลังการแทรกข้อมูล:

val newId: Long = transaction {
    Users.insertAndGetId {
        it[Users.name]  = "Bob"
        it[Users.email] = "bob@example.com"
    }.value
}

การแทรกข้อมูลเป็นชุด

ใช้ batchInsert(list) { item -> ... } เพื่อแทรกข้อมูลหลายแถวอย่างมีประสิทธิภาพ Exposed จะรวมการแทรกเหล่านี้ไว้ในคำสั่งที่เตรียมไว้คำสั่งเดียว:

val newUsers = listOf("Carol" to "carol@e.com", "Dave" to "dave@e.com")
transaction {
    Users.batchInsert(newUsers) { (name, email) ->
        this[Users.name]  = name
        this[Users.email] = email
    }
}

การเลือกแถวทั้งหมด

ใช้ Table.selectAll() เพื่อดึงข้อมูลทุกแถว วนซ้ำผลลัพธ์ในรูปแบบลำดับของออบเจ็กต์ ResultRow และเข้าถึงค่าคอลัมน์ผ่าน row[Column]:

transaction {
    Users.selectAll().forEach { row ->
        println("${row[Users.id]}: ${row[Users.name]}")
    }
}

การเลือกข้อมูลด้วยเงื่อนไข Where

เชื่อม .where { condition } (Exposed 0.46 ขึ้นไป) หรือ .select { condition } เพื่อกรองแถว เงื่อนไขจะใช้การโอเวอร์โหลดตัวดำเนินการ (eq, like, greater และอื่น ๆ):

transaction {
    Users.selectAll()
        .where { Users.age greater 25 }
        .forEach { println(it[Users.name]) }
}

การเลือกคอลัมน์เฉพาะ

ส่งรายการคอลัมน์ให้กับ .select(col1, col2) เพื่อดึงเฉพาะคอลัมน์เหล่านั้น ซึ่งเทียบเท่ากับ SELECT col1, col2 FROM ...:

transaction {
    Users.select(Users.name, Users.email)
        .where { Users.age lessEq 30 }
        .map { it[Users.name] to it[Users.email] }
        .forEach(::println)
}

การอัปเดต

ใช้ Table.update({ condition }) { } เพื่อแก้ไขแถวที่มีอยู่แล้ว แลมบ์ดาด้านในจะได้รับ UpdateStatement และใช้ [column] เพื่อกำหนดค่าใหม่:

transaction {
    Users.update({ Users.id eq 1L }) {
        it[Users.name] = "Alice Updated"
        it[Users.age]  = 31
    }
}

การลบข้อมูล

ใช้ Table.deleteWhere { condition } เพื่อลบแถวที่ตรงกับเงื่อนไข ฟังก์ชันนี้จะส่งคืนจำนวนแถวที่ถูกลบ:

transaction {
    val deleted = Users.deleteWhere { Users.id eq 5L }
    println("Deleted $deleted rows")
}

การเรียงลำดับและการจำกัดผลลัพธ์

เชื่อม .orderBy(column to SortOrder.ASC) และ .limit(n) (พร้อม offset ที่เป็นตัวเลือก) เพื่อเรียงลำดับและแบ่งหน้าผลลัพธ์:

transaction {
    Users.selectAll()
        .orderBy(Users.name to SortOrder.ASC)
        .limit(10, offset = 20)
        .map { it[Users.name] }
        .forEach(::println)
}

การรวมค่าและการนับ

ใช้ฟังก์ชันรวมค่ามาตรฐานของ SQL ผ่านตัวดำเนินการคอลัมน์ของ Exposed เช่น Users.id.count(), Users.age.avg(), Users.age.max() และอื่น ๆ:

transaction {
    val total = Users.selectAll().count()
    println("Total users: $total")
}

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

ฟังก์ชันใดของ Exposed ที่ส่งคืนคีย์หลักซึ่งสร้างขึ้นโดยอัตโนมัติหลังจากแทรกแถวลงใน IdTable

สรุป: CRUD กับ Query DSL

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

  • insert { } — เพิ่มแถว; insertAndGetId { } — เพิ่มแถวและรับค่า PK
  • selectAll().where { } — สอบถามข้อมูลพร้อมตัวกรอง; เชื่อมต่อกับ .orderBy(), .limit() ได้
  • update({ condition }) { } — แก้ไขแถว; deleteWhere { } — ลบแถว
  • การดำเนินการทั้งหมดทำงานภายใน transaction { }
  • การอ้างอิงคอลัมน์ปลอดภัยตั้งแต่เวลาคอมไพล์ — ไม่ต้องใช้ชื่อคอลัมน์แบบสตริง
เริ่มต้นได้ฟรี

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

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

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

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

บทเรียน “CRUD ด้วย Query DSL: insert, select, update, delete” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “CRUD ด้วย Query DSL: insert, select, update, delete”

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

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

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

บทเรียน “CRUD ด้วย Query DSL: insert, select, update, delete” ใช้เวลานานแค่ไหน

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