JDBC - ชุดผลลัพธ์
คำสั่ง SQL ที่อ่านข้อมูลจากคิวรีฐานข้อมูลส่งคืนข้อมูลในชุดผลลัพธ์ คำสั่ง SELECT เป็นวิธีมาตรฐานในการเลือกแถวจากฐานข้อมูลและดูในชุดผลลัพธ์ java.sql.ResultSetอินเตอร์เฟซหมายถึงชุดผลลัพธ์ของการค้นหาฐานข้อมูล
วัตถุ ResultSet จะรักษาเคอร์เซอร์ที่ชี้ไปยังแถวปัจจุบันในชุดผลลัพธ์ คำว่า "ชุดผลลัพธ์" หมายถึงข้อมูลแถวและคอลัมน์ที่อยู่ในออบเจ็กต์ ResultSet
วิธีการของอินเทอร์เฟซ ResultSet สามารถแบ่งออกเป็นสามประเภท -
Navigational methods: ใช้เพื่อเลื่อนเคอร์เซอร์ไปรอบ ๆ
Get methods: ใช้เพื่อดูข้อมูลในคอลัมน์ของแถวปัจจุบันที่เคอร์เซอร์ชี้
Update methods:ใช้เพื่ออัปเดตข้อมูลในคอลัมน์ของแถวปัจจุบัน จากนั้นสามารถอัปเดตการอัปเดตในฐานข้อมูลพื้นฐานได้เช่นกัน
เคอร์เซอร์สามารถเคลื่อนย้ายได้ตามคุณสมบัติของ ResultSet คุณสมบัติเหล่านี้ถูกกำหนดเมื่อมีการสร้าง Statement ที่สอดคล้องกันซึ่งสร้าง ResultSet
JDBC จัดเตรียมวิธีการเชื่อมต่อต่อไปนี้เพื่อสร้างคำสั่งด้วย ResultSet ที่ต้องการ -
createStatement(int RSType, int RSConcurrency);
prepareStatement(String SQL, int RSType, int RSConcurrency);
prepareCall(String sql, int RSType, int RSConcurrency);
อาร์กิวเมนต์แรกระบุประเภทของอ็อบเจ็กต์ ResultSet และอาร์กิวเมนต์ที่สองคือค่าคงที่ ResultSet หนึ่งในสองค่าสำหรับการระบุว่าชุดผลลัพธ์เป็นแบบอ่านอย่างเดียวหรือสามารถอัพเดตได้
ประเภทของ ResultSet
RSType ที่เป็นไปได้มีให้ด้านล่าง หากคุณไม่ระบุประเภท ResultSet ใด ๆ คุณจะได้รับประเภทที่เป็น TYPE_FORWARD_ONLY โดยอัตโนมัติ
ประเภท | คำอธิบาย |
---|---|
ResultSet.TYPE_FORWARD_ONLY | เคอร์เซอร์สามารถเลื่อนไปข้างหน้าได้ในชุดผลลัพธ์เท่านั้น |
ResultSet.TYPE_SCROLL_INSENSITIVE | เคอร์เซอร์สามารถเลื่อนไปข้างหน้าและข้างหลังได้และชุดผลลัพธ์จะไม่ไวต่อการเปลี่ยนแปลงที่ทำโดยผู้อื่นในฐานข้อมูลที่เกิดขึ้นหลังจากสร้างชุดผลลัพธ์ |
ResultSet.TYPE_SCROLL_SENSITIVE | เคอร์เซอร์สามารถเลื่อนไปข้างหน้าและข้างหลังได้และชุดผลลัพธ์จะไวต่อการเปลี่ยนแปลงที่ทำโดยผู้อื่นในฐานข้อมูลที่เกิดขึ้นหลังจากสร้างชุดผลลัพธ์ |
การทำงานพร้อมกันของ ResultSet
RSConcurrency ที่เป็นไปได้มีให้ด้านล่าง หากคุณไม่ระบุประเภทการทำงานพร้อมกันใด ๆ คุณจะได้รับประเภทที่เป็น CONCUR_READ_ONLY โดยอัตโนมัติ
ภาวะพร้อมกัน | คำอธิบาย |
---|---|
ResultSet.CONCUR_READ_ONLY | สร้างชุดผลลัพธ์แบบอ่านอย่างเดียว นี่คือค่าเริ่มต้น |
ResultSet.CONCUR_UPDATABLE | สร้างชุดผลลัพธ์ที่สามารถอัพเดตได้ |
ตัวอย่างทั้งหมดของเราที่เขียนจนถึงตอนนี้สามารถเขียนได้ดังต่อไปนี้ซึ่งเริ่มต้นอ็อบเจ็กต์ Statement เพื่อสร้างอ็อบเจกต์ ResultSet ไปข้างหน้าเท่านั้น -
try {
Statement stmt = conn.createStatement(
ResultSet.TYPE_FORWARD_ONLY,
ResultSet.CONCUR_READ_ONLY);
}
catch(Exception ex) {
....
}
finally {
....
}
การนำทางชุดผลลัพธ์
มีหลายวิธีในอินเทอร์เฟซ ResultSet ที่เกี่ยวข้องกับการเลื่อนเคอร์เซอร์ ได้แก่ -
SN | วิธีการและคำอธิบาย |
---|---|
1 | public void beforeFirst() throws SQLException เลื่อนเคอร์เซอร์ก่อนแถวแรก |
2 | public void afterLast() throws SQLException ย้ายเคอร์เซอร์ไปหลังแถวสุดท้าย |
3 | public boolean first() throws SQLException เลื่อนเคอร์เซอร์ไปที่แถวแรก |
4 | public void last() throws SQLException เลื่อนเคอร์เซอร์ไปที่แถวสุดท้าย |
5 | public boolean absolute(int row) throws SQLException เลื่อนเคอร์เซอร์ไปยังแถวที่ระบุ |
6 | public boolean relative(int row) throws SQLException เลื่อนเคอร์เซอร์ไปตามจำนวนแถวที่กำหนดไปข้างหน้าหรือข้างหลังจากตำแหน่งที่กำลังชี้อยู่ |
7 | public boolean previous() throws SQLException ย้ายเคอร์เซอร์ไปที่แถวก่อนหน้า วิธีนี้จะคืนค่าเป็นเท็จหากแถวก่อนหน้าปิดชุดผลลัพธ์ |
8 | public boolean next() throws SQLException ย้ายเคอร์เซอร์ไปที่แถวถัดไป วิธีนี้จะคืนค่าเท็จหากไม่มีแถวเพิ่มเติมในชุดผลลัพธ์ |
9 | public int getRow() throws SQLException ส่งคืนหมายเลขแถวที่เคอร์เซอร์ชี้ไป |
10 | public void moveToInsertRow() throws SQLException ย้ายเคอร์เซอร์ไปยังแถวพิเศษในชุดผลลัพธ์ที่สามารถใช้เพื่อแทรกแถวใหม่ลงในฐานข้อมูล ตำแหน่งเคอร์เซอร์ปัจจุบันถูกจดจำ |
11 | public void moveToCurrentRow() throws SQLException ย้ายเคอร์เซอร์กลับไปที่แถวปัจจุบันหากขณะนี้เคอร์เซอร์อยู่ที่แถวแทรก มิฉะนั้นวิธีนี้จะไม่ทำอะไรเลย |
เพื่อความเข้าใจที่ดีขึ้นให้เราศึกษานำทาง - รหัสตัวอย่าง
การดูชุดผลลัพธ์
อินเทอร์เฟซ ResultSet มีหลายวิธีในการรับข้อมูลของแถวปัจจุบัน
มีเมธอด get สำหรับแต่ละประเภทข้อมูลที่เป็นไปได้และแต่ละเมธอด get มีสองเวอร์ชัน -
หนึ่งที่ใช้ในชื่อคอลัมน์
หนึ่งที่ใช้ในดัชนีคอลัมน์
ตัวอย่างเช่นหากคอลัมน์ที่คุณสนใจดูมี int คุณต้องใช้หนึ่งในเมธอด getInt () ของ ResultSet -
SN | วิธีการและคำอธิบาย |
---|---|
1 | public int getInt(String columnName) throws SQLException ส่งคืน int ในแถวปัจจุบันในคอลัมน์ชื่อ columnName |
2 | public int getInt(int columnIndex) throws SQLException ส่งคืน int ในแถวปัจจุบันในดัชนีคอลัมน์ที่ระบุ ดัชนีคอลัมน์เริ่มต้นที่ 1 ซึ่งหมายความว่าคอลัมน์แรกของแถวคือ 1 คอลัมน์ที่สองของแถวคือ 2 และอื่น ๆ |
ในทำนองเดียวกันมีเมธอดในอินเทอร์เฟซ ResultSet สำหรับ Java primitive แต่ละประเภททั้งแปดชนิดเช่นเดียวกับประเภททั่วไปเช่น java.lang.String, java.lang.Object และ java.net.URL
นอกจากนี้ยังมีวิธีการรับข้อมูล SQL ชนิด java.sql.Date, java.sql.Time, java.sql.TimeStamp, java.sql.Clob และ java.sql.Blob ตรวจสอบเอกสารสำหรับข้อมูลเพิ่มเติมเกี่ยวกับการใช้ชนิดข้อมูล SQL เหล่านี้
เพื่อความเข้าใจที่ดีขึ้นให้เราศึกษาส่วนตัว - รหัสตัวอย่าง
การอัปเดตชุดผลลัพธ์
อินเทอร์เฟซ ResultSet ประกอบด้วยชุดวิธีการอัพเดตสำหรับการอัพเดตข้อมูลของชุดผลลัพธ์
เช่นเดียวกับเมธอด get มีสองวิธีการอัปเดตสำหรับข้อมูลแต่ละประเภท -
หนึ่งที่ใช้ในชื่อคอลัมน์
หนึ่งที่ใช้ในดัชนีคอลัมน์
ตัวอย่างเช่นในการอัปเดตคอลัมน์ String ของแถวปัจจุบันของชุดผลลัพธ์คุณต้องใช้หนึ่งในวิธีการ updateString () ต่อไปนี้ -
SN | วิธีการและคำอธิบาย |
---|---|
1 | public void updateString(int columnIndex, String s) throws SQLException เปลี่ยนสตริงในคอลัมน์ที่ระบุเป็นค่า s |
2 | public void updateString(String columnName, String s) throws SQLException คล้ายกับวิธีการก่อนหน้านี้ยกเว้นว่าคอลัมน์จะถูกระบุด้วยชื่อแทนที่จะเป็นดัชนี |
มีวิธีการอัพเดตสำหรับชนิดข้อมูลดั้งเดิมแปดชนิดเช่นเดียวกับ String, Object, URL และชนิดข้อมูล SQL ในแพ็คเกจ java.sql
การอัปเดตแถวในชุดผลลัพธ์จะเปลี่ยนคอลัมน์ของแถวปัจจุบันในออบเจ็กต์ ResultSet แต่ไม่ใช่ในฐานข้อมูลพื้นฐาน ในการอัปเดตการเปลี่ยนแปลงของคุณในแถวในฐานข้อมูลคุณต้องเรียกใช้หนึ่งในวิธีต่อไปนี้
SN | วิธีการและคำอธิบาย |
---|---|
1 | public void updateRow() อัพเดตแถวปัจจุบันโดยอัพเดตแถวที่เกี่ยวข้องในฐานข้อมูล |
2 | public void deleteRow() ลบแถวปัจจุบันออกจากฐานข้อมูล |
3 | public void refreshRow() รีเฟรชข้อมูลในชุดผลลัพธ์เพื่อแสดงการเปลี่ยนแปลงล่าสุดในฐานข้อมูล |
4 | public void cancelRowUpdates() ยกเลิกการอัปเดตที่เกิดขึ้นในแถวปัจจุบัน |
5 | public void insertRow() แทรกแถวลงในฐานข้อมูล วิธีนี้สามารถเรียกใช้ได้เมื่อเคอร์เซอร์ชี้ไปที่แถวแทรกเท่านั้น |
เพื่อความเข้าใจที่ดีขึ้นให้เราศึกษาการปรับปรุง - รหัสตัวอย่าง