6.1 รู้เบื้องต้นเกี่ยวกับชุดแถว

ดังที่คุณทราบแล้วว่ามาตรฐาน JDBC นั้นมีอายุเกือบ 20 ปีและล้าสมัยไปเล็กน้อย ประเภทใหม่และคลาสใหม่กำลังถูกเพิ่มเข้ามาอย่างช้าๆ แต่ก็ไม่สามารถทำได้อย่างสวยงามทุกที่ และหนึ่งในนั้นคือResultsSet

ฐานข้อมูลสามารถทำให้มีประสิทธิภาพมากขึ้น แต่ อินเทอร์เฟซของ ResultSetไม่เหมาะสม นอกจากนี้ เราไม่ได้สร้างอ็อบเจกต์ของมันอย่างชัดเจนในทุกที่ แต่พวกมันจะถูกส่งกลับมาให้เราโดยexecuteQuery().

ผู้สร้าง JDBC ไม่ได้คิดนานและสร้างกลไกที่ขนานไปกับทุกสิ่งที่เคยมีมา และกลายเป็นที่รู้จักในชื่อRowSet

นี่คือประโยชน์หลัก:

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

ประเภทชุดแถว:

  • CachedRowSet
  • ชุดแถวที่กรองแล้ว
  • JdbcRowSet
  • เข้าร่วมชุดแถว
  • WebRowSet

6.2 การสร้างวัตถุ RowSet

มีสามวิธีที่แตกต่างกันในการรับวัตถุงาน

ประการแรก สามารถเติมข้อมูลจากชุดผลลัพธ์ที่ได้รับด้วยวิธีดั้งเดิม

ตัวอย่างเช่น เราสามารถแคช ข้อมูล ResultSetโดยใช้CachedRowSet :


Statement statement = connection.createStatement();
ResultSet results = statement.executeQuery("SELECT * FROM user");
 
RowSetFactory factory = RowSetProvider.newFactory();
CachedRowSet crs = factory.createCachedRowSet();
crs.populate(results);		// Use ResultSet to populate

ประการที่สอง คุณสามารถสร้าง ออบเจกต์ RowSet ที่สมบูรณ์ในตัวเองได้ โดยสร้างการเชื่อมต่อฐานข้อมูลของคุณเอง:


JdbcRowSet rowSet = RowSetProvider.newFactory().createJdbcRowSet();
rowSet.setUrl("jdbc:mysql://localhost:3306/test");
rowSet.setUsername("root");
rowSet.setPassword("secret");
 
rowSet.setCommand("SELECT * FROM user");
rowSet.execute();

และประการที่สาม คุณสามารถเชื่อมต่อ RowSet กับการเชื่อมต่อที่มีอยู่แล้ว:

Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "root");
JdbcRowSet rowSet = new JdbcRowSetImpl(con);

rowSet.setCommand("SELECT * FROM user");
rowSet.execute();

6.3 ตัวอย่างการทำงานกับ RowSet

ตัวอย่างที่หนึ่ง: แคช

มาเขียนโค้ดที่เราใช้CachedRowSetเพื่อแคชข้อมูลทั้งหมดและอ่านจากการเชื่อมต่อที่ปิดไปแล้ว:

Statement statement = connection.createStatement();
ResultSet results = statement.executeQuery("SELECT * FROM user");

RowSetFactory factory = RowSetProvider.newFactory();
CachedRowSet crs = factory.createCachedRowSet();
crs.populate(results);	// Use ResultSet to populate

connection.close();		// Close the connection

// Cache data is still available
while(crs.next()) {
  	System.out.println(crs.getString(1)+"\t"+ crs.getString(2)+"\t"+ crs.getString(3));
}

ตัวอย่างที่สอง: การเปลี่ยนแถวผ่าน RowSet :

// Connect to the database
 CachedRowSet crs = rsf.createCachedRowSet();
 crs.setUrl("jdbc:mysql://localhost/test");
 crs.setUsername("root");
 crs.setPassword("root");
 crs.setCommand("SELECT * FROM user");
 crs.execute();

// This type of operation can only change standalone RowSet
// First, move the pointer to an empty (new) string, the current position is remembered
 crs.moveToInsertRow();
 crs.updateString(1, Random.nextInt());
 crs.updateString(2, "Clone" + System.currentTimeMillis());
 crs.updateString(3, "Female");
 crs.insertRow();  // Add the current (new) line to the rest of the lines
 crs.moveToCurrentRow(); // Return a pointer to the line where it was before insertion

 crs.beforeFirst();
 while(crs.next()) {
 	System.out.println(crs.getString(1) + "," + crs.getString(2) + "," + crs.getString(3));
}

// And now we can upload all our changes to the database
Connection con = DriverManager.getConnection("jdbc:mysql://localhost/dbtest", "root", "root");
con.setAutoCommit(false); // Needed for synchronization
crs.acceptChanges(con);// Synchronize data to database

หากคุณสนใจวิธีการทำงาน คุณสามารถอ่านหัวข้อได้ในเอกสารอย่างเป็นทางการ งานของฉันในตอนนี้คือแค่บอกว่ามันคืออะไร