การปรับแต่ง ResultSet

JDBC API ที่ทันสมัยช่วยให้คุณปรับแต่งออบเจกต์ได้อย่างมากคำแถลงและชุดผลลัพธ์. ตัวอย่างเช่น การใช้ชุดผลลัพธ์คุณสามารถเปลี่ยนแถวในฐานข้อมูลได้

เมื่อสร้างวัตถุคำสั่ง เราสามารถส่งความปรารถนาของเราลงไปได้ ความปรารถนาเหล่านี้สามารถแบ่งออกเป็นสามกลุ่ม:

  • ประเภทการเชื่อมต่อพื้นฐาน
  • การควบคุมการเข้าถึงพร้อมกัน
  • ความคงอยู่และการทำธุรกรรม

สามารถส่งผ่านพารามิเตอร์เหล่านี้ได้เมื่อสร้างวัตถุคำแถลงหรืองบที่เตรียมไว้. ตัวอย่าง:

Statement statement = connection.createStatement(
    ResultSet.TYPE_FORWARD_ONLY,
    ResultSet.CONCUR_READ_ONLY,
    ResultSet.CLOSE_CURSORS_OVER_COMMIT );

PreparedStatement statement = connection.prepareStatement(sql,
    ResultSet.TYPE_FORWARD_ONLY,
    ResultSet.CONCUR_READ_ONLY,
    ResultSet.CLOSE_CURSORS_OVER_COMMIT);

เราจะไม่ศึกษาสิ่งเหล่านี้ในเชิงลึก แต่ฉันต้องการให้คุณรู้ว่าสิ่งนี้เป็นไปได้หากคุณพบสิ่งที่คล้ายกันในรหัสของคนอื่น

ประเภทชุดผลลัพธ์

ResultSet สามารถเป็นประเภทเฉพาะได้ ประเภทกำหนดคุณลักษณะและความสามารถบางอย่างของ ResultSet

ฐานข้อมูลและไดรเวอร์ JDBC ไม่รองรับทุกประเภท คุณจะต้องตรวจสอบฐานข้อมูลและไดรเวอร์ JDBC เพื่อดูว่ารองรับประเภทที่คุณต้องการใช้หรือไม่ เมธอดDatabaseMetaData.supportsResultSetType(int type)ส่งคืนค่าจริงหรือเท็จ ขึ้นอยู่กับว่ารองรับประเภทที่ระบุหรือไม่

ในขณะที่เขียน มีชุดผลลัพธ์สามประเภท:

  • ชุดผลลัพธ์ TYPE_FORWARD_ONLY
  • ชุดผลลัพธ์ TYPE_SCROLL_INSENSITIVE
  • ชุดผลลัพธ์ TYPE_SCROLL_SENSITIVE

ประเภทเริ่มต้นคือ TYPE_FORWARD_ONLY

TYPE_FORWARD_ONLYหมายความว่าชุดผลลัพธ์สามารถเลื่อนไปข้างหน้าเท่านั้น นั่นคือ คุณสามารถเลื่อนจากแถวที่ 1 แถวที่ 2 แถวที่ 3 เป็นต้น ใน ResultSet คุณไม่สามารถเลื่อนย้อนกลับได้ คุณไม่สามารถอ่านข้อมูลจากแถวที่ 9 หลังจากอ่านแถวที่สิบ

TYPE_SCROLL_INSENSITIVEหมายความว่าชุดผลลัพธ์สามารถเลื่อน (เลื่อน) ไปข้างหน้าหรือข้างหลังได้ คุณยังสามารถย้ายไปยังตำแหน่งที่สัมพันธ์กับตำแหน่งปัจจุบัน หรือย้ายไปยังตำแหน่งที่แน่นอน

ResultSet ประเภทนี้จะไม่ไวต่อการเปลี่ยนแปลงแหล่งข้อมูลพื้นฐานในขณะที่เปิด ResultSet นั่นคือ ถ้ารายการใน ResultSet มีการเปลี่ยนแปลงในฐานข้อมูลโดยเธรดหรือกระบวนการอื่น รายการนั้นจะไม่ปรากฏในรายการที่เปิดไว้แล้วชุดผลลัพธ์ประเภทนี้

TYPE_SCROLL_SENSITIVEหมายความว่าชุดผลลัพธ์สามารถเลื่อน (เลื่อน) ไปข้างหน้าหรือข้างหลังได้ คุณยังสามารถย้ายไปยังตำแหน่งที่สัมพันธ์กับตำแหน่งปัจจุบัน หรือย้ายไปยังตำแหน่งที่แน่นอน

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

การทำงานพร้อมกัน

การทำงานพร้อมกันของ ResultSet จะกำหนดว่า ResultSet สามารถอัปเดตหรืออ่านอย่างเดียว

ฐานข้อมูลและไดรเวอร์ JDBC บางตัวรองรับการอัปเดต ResultSet แต่ไม่ใช่ทั้งหมด เมธอดDatabaseMetaData.supportsResultSetConcurrency(int concurrency)ส่งคืนค่าจริงหรือเท็จ ขึ้นอยู่กับว่ารองรับโหมดการทำงานพร้อมกันที่กำหนดหรือไม่

ResultSet สามารถมีหนึ่งในสองระดับของการทำงานพร้อมกัน:

  • ชุดผลลัพธ์ CONCUR_READ_ONLY
  • ชุดผลลัพธ์ CONCUR_UPDATABLE

CONCUR_READ_ONLYหมายถึงชุดผลลัพธ์สามารถอ่านได้เท่านั้น

CONCUR_UPDATABLEหมายถึงชุดผลลัพธ์สามารถอ่านและแก้ไขได้

ตัวอย่างการเปลี่ยนแปลงข้อมูลในฐานข้อมูล

ด้วยพารามิเตอร์เหล่านี้ คุณสามารถควบคุม Statement ที่สร้างขึ้นและชุดผลลัพธ์

ตัวอย่างเช่น คุณสามารถสร้าง ResultSet ที่อัปเดตได้และใช้เพื่อเปลี่ยนฐานข้อมูล เมื่อสร้างใบแจ้งยอด สิ่งสำคัญคือต้องปฏิบัติตามเงื่อนไขต่อไปนี้:

  • ระบุเพียงตารางเดียว
  • ไม่มีการเข้าร่วมหรือจัดกลุ่มตามข้อ
  • คอลัมน์แบบสอบถามต้องมีคีย์หลัก

เมื่อตรงตามเงื่อนไขข้างต้น คุณสามารถใช้ชุดผลลัพธ์ที่อัปเดตเพื่ออัปเดตตารางในฐานข้อมูลได้ เมื่อสร้างวัตถุคำสั่ง คุณต้องระบุพารามิเตอร์ต่อไปนี้:

Statement st = createStatement(Result.TYPE_SCROLL_INSENSITIVE, Result.CONCUR_UPDATABLE)

ผลลัพธ์ของการดำเนินการคำสั่งดังกล่าวคือชุดผลลัพธ์ที่อัปเดตได้ วิธีการอัพเดตคือย้ายเคอร์เซอร์ ResultSet ไปยังแถวที่คุณต้องการอัพเดต จากนั้นเรียกเมธอดupdateXXX ()

เมธอดupdateXXXทำงานคล้ายกับ เมธอด getXXX ( ) เมธอดupdateXXX()มีสองพารามิเตอร์ คอลัมน์แรกคือหมายเลขของคอลัมน์ที่กำลังอัปเดต ซึ่งอาจเป็นชื่อคอลัมน์หรือหมายเลขซีเรียลก็ได้ ประการที่สองคือข้อมูลที่จำเป็นต้องอัปเดต และประเภทข้อมูลนี้จะต้องเหมือนกับ XXX

ในการอัปเดตแถวในฐานข้อมูล คุณต้องเรียกใช้เมธอดupdateRow()ก่อนที่เคอร์เซอร์ ResultSet จะออกจากแถวที่เปลี่ยนแปลง มิฉะนั้น การเปลี่ยนแปลงจะไม่เข้าสู่ฐานข้อมูล

คุณยังสามารถเพิ่มแถวใหม่ในตาราง:

ก่อนอื่นคุณต้องเลื่อนเคอร์เซอร์ไปที่บรรทัดว่าง เมื่อต้องการทำเช่นนี้ ให้เรียกเมธอดmoveToInsertRow()

จากนั้นคุณต้องกรอกข้อมูลแถวนี้โดยใช้เมธอดupdateXXX()

จากนั้นคุณต้องเรียกใช้ เมธอด inserterRow()เพื่อเพิ่มแถวไปยังฐาน

และสุดท้าย คุณต้องคืนเคอร์เซอร์กลับโดยเรียกเมธอดmoveToCurrentRow()

สำคัญ! DBMS บางตัวไม่สนับสนุนตัวเลือกเหล่านี้สำหรับคำชี้แจงเพิ่มเติม ในกรณีที่มีปัญหา โปรดดูเอกสารอย่างเป็นทางการของ DBMS นั้นๆ