Java >> Java tutorial >  >> Tag >> Jdbc

Introduktion til JDBC RowSet Interface i Java

1. Oversigt

I denne artikel gennemgår vi JDBC RowSet grænseflade. Et JDBC RowSet objektet indeholder tabeldata i en stil, der gør det mere fleksibelt og enklere at bruge end et resultatsæt.

Oracle har defineret fem RowSet grænseflader til den hyppigste brug af et RowSet:

  • JdbcRowSet
  • CachedRowSet
  • WebRowSet
  • Deltag i RowSet
  • Filtered RowSet

I dette selvstudie gennemgår vi, hvordan du bruger disse RowSet grænseflader.

2. JdbcRowSet

Lad os starte med JdbcRowSet – vi opretter simpelthen en ved at sende en forbindelse gøre indsigelse mod 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));
}

I ovenstående eksempel,jdbcRs indeholdt ingen data, før vi definerede SQL-sætningen med metoden setCommand og derefter kørte metoden execute .

Bemærk også, hvordan vi tilføjede en RowSetListener for at kunne udføre hændelseshåndtering ind i JdbcRowSet.

JdbcRowSet er anderledes end de andre fire RowSet implementeringer – fordi den altid er forbundet med databasen og på grund af dette minder det mest om ResultSet objekt.

3. CachedRowSet

Et CachedRowSet objektet er unikt, fordi det kan fungere uden at være forbundet til dets datakilde. Vi kalder dette et "afbrudt RowSet objekt”.

CachedRowSet får sit navn på grund af det faktum, at den cacher sine data i hukommelsen, så den kan operere på sine egne data i stedet for de data, der er gemt i en database.

Som CachedRowSet interface er supergrænsefladen for alle afbrudte RowSet-objekter , koden, vi gennemgår nedenfor, gælder også for en WebRowSe t, Join RowSet eller FilteredRowSe t lige så godt:

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

Lad os derefter tage et kig på WebRowSet .

Dette er også unikt, fordi det ud over at tilbyde funktionerne i et CachedRowSet objekt, det kan skrive sig selv til et XML-dokument t og kan også læse det XML-dokument for at konvertere sig selv tilbage til et 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);

Brug af writeXml metode, skriver vi den aktuelle tilstand af et WebRowSet gøre indsigelse mod et XML-dokument.

Ved at videregive writeXml metode en OutputStream objekt, skriver vi i bytes i stedet for tegn, hvilket kan være ret nyttigt til at håndtere alle former for data.

5. Deltag i RowSet

Deltag i RowSet lader os oprette en SQL JOIN mellem RowSet genstande, når disse er i hukommelsen. Dette er vigtigt, fordi det sparer os for omkostningerne ved at skulle oprette en eller flere forbindelser:

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);

Fordi hvert RowSet objekt føjet til et JoinRowSet objektet har brug for en match-kolonne, den kolonne, hvor SQL'en JOIN er baseret, angiver vi "id" i addRowSet metode.

Bemærk, at vi i stedet for at bruge kolonnenavnet også kunne have brugt kolonnenummeret.

6. Filtered RowSet

Til sidst, FilteredRowSet lader os skære ned på antallet af rækker, der er synlige i et RowSet objekt, så vi kun kan arbejde med de data, der er relevante for det, vi laver.

Vi beslutter, hvordan vi vil "filtrere" dataene ved hjælp af en implementering af prædikatet grænseflade:

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
}

Nu anvender vi dette filter på et Filtered RowSet objekt:

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. Konklusion

Denne hurtige vejledning dækkede de fem standardimplementeringer af RowSet interface tilgængelig i JDK.

Vi diskuterede konfigurationen af ​​hver implementering og nævnte forskellene mellem dem.

Som vi påpegede, er der kun én af RowSet implementeringer er et tilsluttet RowSet objekt – JdbcRowSet . De andre fire er afbrudt RowSet genstande.

Og som altid kan den fulde kode til denne artikel findes på Github.


Java tag