การปรับแต่ง 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 นั้นๆ