การจัดการบรรทัดปัจจุบัน

เราเขียนโปรแกรมแรกและทำงานได้อย่างสมบูรณ์ เราเขียนคิวรี ดำเนินการ และผลลัพธ์คือ เมธอด 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