Pengenalan kepada JDBC RowSet Interface di Java

Java Teratas

Saya baru sahaja mengumumkan kursus Learn Spring yang baru , yang berfokus pada asas-asas Spring 5 dan Spring Boot 2:

>> SEMAK KURSUS

1. Gambaran keseluruhan

Dalam artikel ini, kami mengkaji antara muka JDBC RowSet . Objek JDBC RowSet menyimpan data tabel dalam gaya yang menjadikannya lebih mudah disesuaikan dan lebih mudah digunakan daripada set hasil.

Oracle telah menentukan lima antara muka RowSet untuk penggunaan RowSet yang paling kerap :

  • JdbcRowSet
  • CachedRowSet
  • Set WebRow
  • SertailahRowSet
  • FilteredRowSet

Dalam tutorial ini, kita akan mengkaji cara menggunakan antara muka RowSet ini .

2. JdbcRowSet

Mari kita mulakan dengan JdbcRowSet - kita hanya akan membuatnya dengan meneruskan objek Connection ke JdbcRowSetImpl :

JdbcRowSet jdbcRS = new JdbcRowSetImpl(conn); jdbcRS.setType(ResultSet.TYPE_SCROLL_INSENSITIVE); String sql = "SELECT * FROM customers"; jdbcRS.setCommand(sql); jdbcRS.execute(); jdbcRS.addRowSetListener(new ExampleListener()); while (jdbcRS.next()) { // each call to next, generates a cursorMoved event System.out.println("id = " + jdbcRS.getString(1)); System.out.println("name = " + jdbcRS.getString(2)); }

Dalam contoh di atas, jdbcRs tidak berisi data sehingga kita menentukan pernyataan SQL dengan metode setCommand dan kemudian menjalankan kaedah yang dijalankan .

Perhatikan juga bagaimana, untuk melakukan pengendalian acara, kami menambahkan RowSetListener ke dalam JdbcRowSet.

JdbcRowSet berbeza daripada empat implementasi RowSet yang lain - kerana selalu disambungkan ke pangkalan data dan kerana ini paling serupa dengan objek ResultSet .

3. CachedRowSet

A CachedRowSet objek adalah unik kerana ia boleh beroperasi tanpa disambungkan kepada sumber data. Kami menyebutnya sebagai " objek RowSet yang terputus ".

CachedRowSet mendapat namanya kerana ia menyimpan data dalam memori sehingga dapat beroperasi pada data sendiri dan bukannya data yang disimpan dalam pangkalan data.

Oleh kerana antara muka CachedRowSet adalah antara muka super untuk semua objek RowSet yang terputus , kod yang kami tinjau di bawah ini juga berlaku untuk WebRowSe t, JoinRowSet , atau FilteredRowSe t sama seperti:

CachedRowSet crs = new CachedRowSetImpl(); crs.setUsername(username); crs.setPassword(password); crs.setUrl(url); crs.setCommand(sql); crs.execute(); crs.addRowSetListener(new ExampleListener()); while (crs.next()) { if (crs.getInt("id") == 1) { System.out.println("CRS found customer1 and will remove the record."); crs.deleteRow(); break; } }

4. WebRowSet

Seterusnya, mari kita lihat di WebRowSet .

Ini juga unik kerana, selain menawarkan kemampuan objek CachedRowSet , ia dapat menuliskan dirinya ke dokumen XML t dan juga dapat membaca dokumen XML itu untuk mengubahnya kembali ke WebRowSet :

WebRowSet wrs = new WebRowSetImpl(); wrs.setUsername(username); wrs.setPassword(password); wrs.setUrl(url); wrs.setCommand(sql); wrs.execute(); FileOutputStream ostream = new FileOutputStream("customers.xml"); wrs.writeXml(ostream);

Dengan menggunakan kaedah writeXml , kami menulis keadaan semasa objek WebRowSet ke dokumen XML.

Dengan melewati kaedah writeXml sebagai objek OutputStream , kami menulis dalam bait dan bukannya watak, yang dapat membantu menangani semua bentuk data.

5. JoinRowSet

JoinRowSet membolehkan kita membuat SQL JOIN antara objek RowSet ketika berada dalam memori. Ini penting kerana ini dapat menjimatkan kita untuk membuat satu atau lebih sambungan:

CachedRowSetImpl customers = new CachedRowSetImpl(); // configuration of settings for CachedRowSet CachedRowSetImpl associates = new CachedRowSetImpl(); // configuration of settings for this CachedRowSet JoinRowSet jrs = new JoinRowSetImpl(); jrs.addRowSet(customers,ID); jrs.addRowSet(associates,ID);

Kerana setiap objek RowSet yang ditambahkan ke objek JoinRowSet memerlukan kolom pencocokan , lajur di mana SQL JOIN didasarkan, kami menentukan "id" dalam metode addRowSet .

Perhatikan bahawa, daripada menggunakan nama lajur, kita mungkin juga menggunakan nombor lajur.

6. TapisRowSet

Akhirnya, FilteredRowSet memungkinkan kita mengurangkan bilangan baris yang dapat dilihat dalam objek RowSet sehingga kita dapat bekerja hanya dengan data yang relevan dengan apa yang kita lakukan.

Kami memutuskan bagaimana kami ingin "menyaring" data menggunakan pelaksanaan antarmuka Predicate :

public class FilterExample implements Predicate { private Pattern pattern; public FilterExample(String regexQuery) { if (regexQuery != null && !regexQuery.isEmpty()) { pattern = Pattern.compile(regexQuery); } } public boolean evaluate(RowSet rs) { try { if (!rs.isAfterLast()) { String name = rs.getString("name"); System.out.println(String.format( "Searching for pattern '%s' in %s", pattern.toString(), name)); Matcher matcher = pattern.matcher(name); return matcher.matches(); } else return false; } catch (Exception e) { e.printStackTrace(); return false; } } // methods for handling errors }

Sekarang kita menerapkan penapis itu ke objek FilteredRowSet :

RowSetFactory rsf = RowSetProvider.newFactory(); FilteredRowSet frs = rsf.createFilteredRowSet(); frs.setCommand("select * from customers"); frs.execute(conn); frs.setFilter(new FilterExample("^[A-C].*")); ResultSetMetaData rsmd = frs.getMetaData(); int columncount = rsmd.getColumnCount(); while (frs.next()) { for (int i = 1; i <= columncount; i++) { System.out.println( rsmd.getColumnLabel(i) + " = " + frs.getObject(i) + " "); } }

7. Kesimpulannya

Tutorial ringkas ini merangkumi lima pelaksanaan standard antara muka RowSet yang terdapat di JDK.

Kami membincangkan konfigurasi setiap pelaksanaan dan menyebut perbezaan di antara mereka.

Seperti yang kami tunjukkan , hanya salah satu implementasi RowSet adalah objek RowSet yang terhubung - JdbcRowSet . Empat yang lain adalah objek RowSet yang terputus .

Dan, seperti biasa, kod lengkap untuk artikel ini terdapat di Github.

Bahagian bawah Java

Saya baru sahaja mengumumkan kursus Learn Spring yang baru , yang berfokus pada asas-asas Spring 5 dan Spring Boot 2:

>> SEMAK KURSUS