úterý 8. srpna 2006

JDBC 4.0 - příjemné novinky

Připravovaná Java 6.0 sebou kromě jiného přinese i JDBC 4.0. Na co se tedy můžeme těšit?

Automatické nahrávání JDBC driveru
V předchozích verzích JDBC bylo nutné zavést třídu driveru manuálně pomocí volání Class.forName(). Od Javy 6.0 je podporováno automatické natažení driveru a to pomocí nadeklarování třídy driveru v Jar manifestu (META-INF/services/java.sql.Driver) daného dodavatele driveru.
Connection management
Podpora pro správu Statement a Connection objektů, pokud jsou sdílené. Podpora metadat, které umožňují získat informaci o stavu Connection.
RowId
Bylo přidáno nové rozhraní RowId. ROWID jednoznačně identifikuje vrácený/modifikovaný záznam v DB, jedná se o systémovou věc databáze a proto ne všechny databáze jej podporují. RowId je možné získat při procházení ResultSet objektem a nebo nastavit při práci s objektem PreparedStatement
SQL dotazy jako anotace metod
Bude možné napsat SQL jako anotaci a využít nového parametrizovaného typu DataSet, který bude prezentovat vrácená data. DataSet (potomek java.util.List) je parametrizován JavaBeanou, která představuje vrácený řádek. Nejlépe vše ilustruje následující ukázka.
      
  public class Osoba{
    private id;
    private jmeno;
    private prijmeni;
    
    //gettry a settry 
  }
  
  public interface SQLDotazy extends BaseQuery {    
    @Select("select id, jmeno, prijmeni from osoba")
    DataSet<Osoba> getOsoby();
  }

  Connection con = DriverManager.getConnection(jdbcUrl, jdbcUser, jdbcPassword);
  SQLDotazy dotazy = con.createQueryObject(SQLDotazy.class);
  DataSet<Osoba> rows = dotazy.getOsoby();

  for (Osoba osoba: rows) {
     System.out.println("Jméno = " + osoba.getJmeno();
     ...
  }
      
     
Vylepšený exception handling
Jako potomci SQLException vznikly dvě nové třídy SQLTransientException a SQLNonTransientException a od nich odvozené hierarchie. SQLTransientException a její potomkové slouží pro výjimky, které mají přechodný charakter např. timeout. SQLNonTransientException slouží pro výjimky s nepřechodným charakterem např. kolize integrity dat nebo špatná syntaxe SQL. Navíc každá výjímka obsahuje metody getSQLState (vrací SQLstate podle specifikace SQL 2003), getNextException() (umožňuje získat zřetězenou výjimku) a implementuje rozhraní Iterable což umožňuje využití rozšířeného for příkazu.
Změny v API
Byla přidána podpora pro BLOBy a CLOBy a datové typy NCHAR, NVARCHAR, LONGNVARCHAR, a NCLOB (rozšířené typy respektující National Character Set)

Všechny výše popsané novinky jsou detailněji popsány v článku Srini Penchikala JDBC 4.0 Enhancements in Java SE 6. Pokud si novinky chcete vyzkoušet, budete potřebovat Javvu 6.0. Součástí SDK 6.0 by měla být i databáze Apache Derby, jejíchž driver zároveň slouží jako referenční implementace JDBC 4.0.