การจัดการบรรทัดปัจจุบัน
เราเขียนโปรแกรมแรกและทำงานได้อย่างสมบูรณ์ เราเขียนคิวรี ดำเนินการ และผลลัพธ์คือ เมธอด executeQuery()ส่งออบเจกต์กลับมาให้เราชุดผลลัพธ์อันที่มีผลลัพธ์ทั้งหมดของแบบสอบถาม และตอนนี้เราจะพยายามหาวิธีการรับผลลัพธ์เหล่านี้
ผลลัพธ์ของคิวรีสามารถประกอบด้วยแถวนับพันแถวและหลายร้อยคอลัมน์ในหลากหลายประเภท ดังนั้นนี่จึงไม่ใช่เรื่องเล็กน้อยอย่างที่คุณคิด ตัวอย่างเช่น รูปภาพสามารถเก็บไว้ในฐานข้อมูล จากนั้นคุณจะได้รับรูปภาพเป็นชุดของไบต์หรือInputStreamเพื่อดาวน์โหลด
แต่เราจะเริ่มต้นด้วยวิธีที่ง่ายที่สุด - ด้วยแนวคิดของ " บรรทัดผลลัพธ์ปัจจุบัน " เนื่องจากผลลัพธ์มักจะมีหลายแถว ดังนั้นวัตถุชุดผลลัพธ์มีตัวชี้ไปยังบรรทัดปัจจุบันภายใน และสลับบรรทัดตามลำดับเพื่ออ่านโดยใช้เมธอดnext()
วิธีการนี้ทำขึ้นเพื่อการเพิ่มประสิทธิภาพเป็นหลัก ไดรเวอร์ JDBC อาจไม่โหลดสตริงจากฐานข้อมูลจนกว่าคุณจะอ่านตามลำดับ คุณก็อ่าน FileInputStreamตามลำดับตั้งแต่ต้นจนจบเช่นกัน ดังนั้นวิธีการนี้ควรเป็นที่คุ้นเคยและเข้าใจได้สำหรับคุณ
อย่างไรก็ตาม หากคุณต้องการจริงๆ คุณสามารถอ่านไฟล์ได้ทุกที่โดยใช้คลาสRandomAccessFile
คลาสResultSetยังอนุญาตสิ่งที่คล้ายกันและอนุญาตให้คุณย้ายแถวปัจจุบันไปตามผลลัพธ์ได้ทุกที่ ในการทำเช่นนี้มีวิธีการดังต่อไปนี้:
วิธี | คำอธิบาย | |
---|---|---|
1 | ต่อไป() | สลับไปยังบรรทัดถัดไป |
2 | ก่อนหน้า() | สลับไปยังบรรทัดก่อนหน้า |
3 | isFirst() | บรรทัดปัจจุบันก่อน? |
4 | isBeforeFirst() | เราอยู่หน้าบรรทัดแรกหรือไม่? |
5 | isLast() | บรรทัดปัจจุบันเป็นบรรทัดสุดท้ายหรือไม่ |
6 | isAfterLast() | เรามาหลังกำหนด? |
7 | สัมบูรณ์ (int n) | ทำให้บรรทัดที่ Nth เป็นปัจจุบัน |
8 | ญาติ (int n) | เลื่อนตำแหน่งปัจจุบันของบรรทัด N ไปข้างหน้า N สามารถเป็น <0 |
9 | รับแถว () | ส่งกลับหมายเลขบรรทัด |
วิธีการนั้นค่อนข้างง่าย แต่ต้องมีคำอธิบายสองข้อ ผลที่ได้คือถูกตีกรอบด้วยเส้นว่างทั้งสองด้าน ดังนั้น ในขั้นต้น บรรทัดปัจจุบันจะอยู่ก่อนบรรทัดแรกของผลลัพธ์ และ เพื่อ ให้ได้แถวแรก คุณต้องเรียกใช้เมธอด next()อย่างน้อยหนึ่งครั้ง
หากคุณเรียก เมธอด next() ใน แถวสุดท้ายคุณจะย้ายไปที่บรรทัดหลังเมธอดสุดท้าย คุณไม่สามารถอ่านข้อมูลจากมันได้ แต่จะไม่มีข้อผิดพลาดเกิดขึ้น ที่นี่ เมธอด isAfterLast()จะประกาศผลลัพธ์เป็น true
ตัวอย่าง:
Statement statement = connection.createStatement();
ResultSet results = statement.executeQuery("SELECT * FROM user");
System.out.println( results.getRow() ); // 0
System.out.println( results.isBeforeFirst() ); // true
System.out.println( results.isFirst() ); // false
results.next();
System.out.println( results.getRow() ); // 1
System.out.println( results.isBeforeFirst() ); // false
System.out.println( results.isFirst() ); // true
results.next();
System.out.println( results.getRow() ); // 2
System.out.println( results.isBeforeFirst() ); // false
System.out.println( results.isFirst() ); // false
รับข้อมูลจากแถวปัจจุบัน
คุณได้เรียนรู้ที่จะจัดการบรรทัดปัจจุบันอย่างเชี่ยวชาญ ตอนนี้เรามาดูวิธีการรับข้อมูลจากมัน สำหรับวัตถุนี้ชุดผลลัพธ์มีวิธีการพิเศษที่สามารถอธิบายได้ด้วยเทมเพลตเดียว:
getType(numberColumns)
อย่างไรก็ตาม หากคอลัมน์มีชื่อ คุณยังสามารถได้รับจากชื่อคอลัมน์:
getType(nameColumns)
ตัวอย่าง:
while (results.next()) {
Integer id = results.getInt(“id”);
String name = results.getString(“name”);
System.out.println(results.getRow() + ". " + id + "\t"+ name);
}
ด้านล่างฉันจะให้ตารางที่จะช่วยให้คุณเชื่อมโยงประเภทข้อมูล SQL และเมธอด ResultSet:
ชนิดข้อมูล SQL | getXXX() วิธีการ |
---|---|
ชาร์ | getString() |
วาร์ชาร์ | getString() |
INT | getInt() |
ลอย | รับสองเท่า () |
CLOB | getClob() |
หยด | getBlob() |
วันที่ | รับวันที่ () |
เวลา | รับเวลา () |
ประทับเวลา | รับการประทับเวลา () |
ประเด็นฉันคิดว่าคุณเข้าใจแล้ว
รับข้อมูลที่แตกต่างกันเกี่ยวกับ ResultSet
เราหาวิธีอ่านข้อมูลจากบรรทัดปัจจุบัน: ทั้งตามหมายเลขคอลัมน์และตามชื่อ ฉันจะหาชื่อคอลัมน์ด้วยหมายเลขได้อย่างไร หรือจำนวนคอลัมน์ในผลลัพธ์?
ในแง่หนึ่ง หากคุณเขียนคำขอ ดูเหมือนว่าคุณจะต้องรู้เรื่องนี้ทั้งหมด ในทางกลับกัน เราสามารถเขียนโปรแกรมที่แสดงผลลัพธ์ของแบบสอบถามบนหน้าจอ: แบบสอบถามถูกส่งมาให้เราและเราเพียงต้องการแสดงบนหน้าจอ (ในคอนโซล, หน้าเว็บ) ทุกอย่างที่เซิร์ฟเวอร์ SQL ส่งคืน สำหรับพวกเรา.
JDBC มีออบเจกต์พิเศษสำหรับสิ่งนี้ อินเท อ ร์เฟซ ResultSetMetaData การรับวัตถุประเภทนี้ค่อนข้างง่าย:
Statement statement = connection.createStatement();
ResultSet results = statement.executeQuery("SELECT * FROM user");
ResultSetMetaData resultSetMetaData = results.getMetaData();
อินเทอร์เฟซResultSetMetaDataมีวิธีการที่น่าสนใจบางอย่าง ด้านล่างนี้คือรายการยอดนิยม:
1 | getColumnCount() | ส่งกลับจำนวนคอลัมน์ผลลัพธ์ |
2 | getColumnName (คอลัมน์ int) | ส่งกลับชื่อคอลัมน์ |
3 | getColumnLabel (คอลัมน์ int) | ส่งกลับคำอธิบายของคอลัมน์ |
4 | getColumnType() | ประเภทคอลัมน์ส่งคืน: ตัวเลข (รหัสพิเศษ) |
5 | getColumnTypeName() | ส่งกลับประเภทคอลัมน์: สตริง |
6 | getColumnClassName() | ส่งกลับชื่อคลาส java สำหรับประเภทคอลัมน์ |
7 | getTableName() | ส่งกลับชื่อตาราง |
8 | getCatalogName() | ส่งกลับชื่อไดเร็กทอรีของคอลัมน์ |
9 | getSchemaName() | ส่งกลับชื่อสคีมาของฐานข้อมูล |
10 | isAutoIncrement (คอลัมน์ int) | คอลัมน์รองรับ AUTO INCREMENT หรือไม่ |
สิบเอ็ด | isNullable() | คอลัมน์สามารถมี NULL ได้หรือไม่ |
ลองใช้มันเพื่อเรียนรู้เล็กน้อยเกี่ยวกับตารางของเรา:
ResultSetMetaData metaData = results.getMetaData();
int columnCount = metaData.getColumnCount();
for (int column = 1; column <= columnCount; column++)
{
String name = metaData.getColumnName(column);
String className = metaData.getColumnClassName(column);
String typeName = metaData.getColumnTypeName(column);
int type = metaData.getColumnType(column);
System.out.println(name + "\t" + className + "\t" + typeName + "\t" + type);
}
สำคัญ! โปรดทราบว่าคอลัมน์มีหมายเลขตั้งแต่ 1 แถวก็เช่นกัน มันไม่ธรรมดาขนาดนั้นเลยเหรอ?
และนี่คือผลลัพธ์ที่ฉันได้รับหลังจากรันโปรแกรม:
"C:\Program Files\Java\jdk-17.0.3.1\bin\java.exe... | |||
รหัส | java.lang.จำนวนเต็ม | INT | 4 |
ชื่อ | java.lang.string | วาร์ชาร์ | 12 |
ระดับ | java.lang.จำนวนเต็ม | INT | 4 |
วันที่สร้าง | java.sql.date | วันที่ | 91 |
กระบวนการเสร็จสิ้นด้วยรหัสออก 0 |