background image

Tworzenie warstwy 

trwałości danych - 

wprowadzenie

Rafał Kasprzyk

background image

Rafał Kasprzyk

Technologie warstwy integracji

Java I/O API

JDBC (ang. Java Database 

Connectivity)

SQLJ

JSTL SQL

EJB (ang. Enterprise Java Beans)

JDO (ang. Java Data Objects)

iBATIS SqlMaps

Oracle TopLink

Hibernate

Inne 

background image

Rafał Kasprzyk

Java I/O

Rysunek przedstawia fragment 

hierarchii klas umożliwiających 

operacje I/O

API zawiera:

Strumienie „połączeniowe”

reprezentują połączenie ze źródłami i 

miejscami docelowymi takimi jak pliki lub 

gniazda sieciowe

Strumienie „łańcuchowe”

funkcjonują jedynie w połączeniu z 

innymi strumieniami

Programowanie operacji I/O opiera 

się na korzystaniu z wzorca 

Decorator

Możliwość wykonania przydatnej 

operacji uzyskujemy dopiero po 

połączeniu co najmniej dwóch strumieni, 

z których pierwszy obsługuje połączenie, 

a drugi udostępnia metody, z których 

chcemy skorzystać

Łączenie różnych strumieni 

„połączeniowych” i „łańcuchowych” 

zapewnia ogromną elastyczność

background image

Rafał Kasprzyk

Serializacja

Mechanizm serializacji 

umożliwia utrwalanie i 

odczyt obiektów na/z dysku i 

po sieci

 Serializacja wymusza 

wykorzystanie:

Interfejsu Serializable

Strumieni ObjectInputStream 

i ObjectOutputStream

background image

Rafał Kasprzyk

Serializacja – przykład

Serializacja

FileOutputStream fos = new FileOutputStream("plik.ser");
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(ob1);
oos.writeObject(ob2);
oos.close();

Deserializacja

FileInputStream fis = new  FileInputStream("plik.ser");
ObjectInputStream ois = new ObjectInputStream(fis);
Object ob1 = ois.readObject();
Object ob2 = ois.readObject();
MyClass elf = (Bohater) ob1;
MyClass trol = (Bohater) ob2;
oos.close();

background image

Rafał Kasprzyk

Architektura JDBC

API przeznaczone dla języka Java, 

umożliwiające dostęp do większości 

systemów bazodanowych

NATIVE

BRIDGE

PURE

MIDDLEWARE

background image

Rafał Kasprzyk

Typy sterowników JDBC

”BRIDGE”

 (JDBC-ODBC bridge + 

ODBC driver)

Mosty JDBC-ODBC wykorzystują 

sterownik ODBC do komunikacji z bazą 

danych. Sterownik ODBC musi być 

zainstalowany i skonfigurowany na 

każdej stacji klienckiej.

”NATIVE”

 (Native-API partly-Java 

driver)

Program komunikuje się z interfejsem 

bazy danych, który musi być 

zainstalowany, podobnie jak sterownik 

ODBC, na każdej stacji klienckiej. 

background image

Rafał Kasprzyk

Typy sterowników JDBC

”MIDDLEWARE”

 (JDBC-Net pure Java 

driver)

Sterownik JDBC komunikuje się z serwerem 

pośredniczącym, za pomocą protokołu 

niezależnego od bazy danych. Następnie 

serwer tłumaczy polecenia na postać zgodna 

z protokołem konkretnej bazy danych. 

Rozwiązanie stosowane, gdy konieczny jest 

dostęp do baz danych różnych producentów

”PURE”

 (Native-protocol pure Java driver)

Sterownik JDBC komunikuje się bezpośrednio 

z bazą danych przy pomocy jej protokołu. 

Rozwiązanie najczęściej spotykane.

background image

Rafał Kasprzyk

JDBC 1.x

JDBC 1.0 pojawiła się w specyfikacji JDK 1.1

JDBC w tej wersji oferował minimum funkcjonalności. 

W pakiecie java.sql znalazły się następujące 

interfejsy:

Connection

DatabaseMetaData

Driver

DriverManager,

ResultSet

ResultSetMetaData

Statement

CallableStatement

PreparedStatement

Types

background image

Rafał Kasprzyk

JDBC 2.x

JDBC 2.0 pojawiło się w specyfikacji JDK 

1.2

Powstanie związane było z promowaniem 

przez Sun nowych technologii:

JTS (ang. Java Transaction Services)

JNDI (ang. Java Naming and Direcory Interface)

JavaBeans, jak również EJB (ang. Enterprise 

JavaBeans)

Wprowadzono wiele zmian ułatwiających i 

przyśpieszających pracę m.in.:

Przewijane zbiory wyników zapytań (ang. 

scrollable ResultSets)

Aktualizacja grupowa danych (ang. batch 

updates)

Programowe operacje CRUD

CRUD (ang. Create Read Update Delete)

możliwość zastąpienia języka SQL przez JDBC API (ang. 

programmatic inserts/deletes/updates)

Zaawansowane typy danych zgodne z SQL3 

(alias SQL99): 

BLOB, CLOB, REF, ARRAY, …

background image

Rafał Kasprzyk

JDBC 2.x

JDBC 2.0 podzielony jest na dwa pakiety

JDBC 2.0 core API (client-side API) – zawarty w 

pakiecie java.sql – pełen zestaw mechanizmów 

dostępu do baz danych

JDBC 1.2 uzupełniony o szereg nowych funkcji.

JDBC 2.0 Optional Package (server-side API) – 

zawarty w pakiecie javax.sql – funkcjonalne 

uzupełnienie mechanizmów JDBC core API 

rozszerzające interfejs strony serwera. Jest 

integralną składową platformy J2EE.

Umożliwia korzystanie ze źródeł danych (ang. data 

sources) zapewniających funkcje podłączenie do 

dowolnej bazy, w tym bazy opartej na plikach, czy 

arkuszach Excela

Wprowadzono tzw. zbiory wierszy  (ang. RowSets) – 

obiektami JavaBeans umożliwiającymi manipulowanie 

zbiorem wyników niezależnie od istnienia połączenia z 

bazą danych

Dodany został mechanizm puli połączeń

background image

Rafał Kasprzyk

JDBC 3.x

JDBC 3.0 pojawiło się wraz z JDK 1.4:

Zawiera JDBC core API oraz JDBC 

Optional Package

Wprowadzono mechanizm konektorów 

(ang. connectors) pozwalający w 

zunifikowany sposób łączyć się z 

różnymi źródłami danych, w tym 

systemami EIS (ang. Enterprise 

Information System) i  bazami 

sieciowymi

Trzy implementacje zbioru wierszy:

JDBCRowSet

CachedRowSet

WebRowSet

background image

Rafał Kasprzyk

JDBC 3.x

Pozostałe ważne zmiany wprowadzone w nowej 

wersji:

Punkty zapisu (ang. SavePoints), pozwalające na powrót (ang. 

rollback) transakcji do określonego momentu

Powtórne użycie prekompilowanych wyrażeń

Konfiguracja puli połączeń

Sposób grupowania źródeł danych i rozmiaru puli

Możliwość wykorzystania metadanych prekompilowanych 

wyrażeń

Informacje o liczbie i typie parametrów w takim wyrażeniu

Uzyskiwanie informacji o wartościach w kolumnach, w 

których wartości generowane są automatycznie przez bazę 

danych np. ROWID

Otwierania wielu zbiorów wyników na jednym połączeniu 

JDBC

Nowe typy danych: 

BOOLEAN, DATALINK

 (referencja do 

zewnętrznych danych)

Modyfikowalne typy: 

BLOB, CLOB, REF, ARRAY

W przypadku przechowywania w bazie typów strukturalnych 

istnieje możliwość skorzystania z metadanych, które będą 

zawierały informacje o hierarchii typów

background image

Rafał Kasprzyk

JDBC – przykład

Kolejne etapy obsługi bazy danych przedstawione zostały 

na przykładzie lokalnego połączenia z bazą danych 

zarządzaną przez ODBC

Zainicjowanie sterownika

Class.forName(”sun.jdbc.odbc.JdbcOdbcDriver”);

Połączenie z bazą danych

Connection connect = 

DriverManager.getConnection(jdbc.odbc.TestDB);

Wykonanie polecenia SQL

Statement statement = connect.createStatement();

ResultSet rs = 

statement.executeQuery(”select * from Osoba”);

Odbiór i obróbka wyników

String id, imie, nazwisko, wiek, wzrost;

while(rs.next()) {

id = rs.getString(1);

imie = rs.getString(2);

nazwisko = rs.getString(3);

wiek = rs. getString(4);

wzrost = rs.getString(5);

System.out.println(”|”+id+”|”+imie+”|”+nazwisko+ 

”|”+wiek+”|”+wzrost+”|”);

}

Zamknięcie połączenia z bazą danych

statement.close();

connect.close();

background image

Rafał Kasprzyk

SQLJ

Umożliwia zagnieżdżanie instrukcji SQL w kodzie 

Java

Stanowi alternatywę dla bezpośredniego 

korzystania z interfejsu JDBC

Pozwala na pisanie bardziej zwartych i czytelniejszych 

programów

Zapewnie kontrolę poprawności odwołań do obiektów 

baz danych i weryfikację składni instrukcji SQL na etapie 

kompilacji

W standardzie SQLJ instrukcje SQL mają charakter 

statyczny, co niekiedy jest istotnym ograniczeniem

Istnieją rozszerzenia SQLJ (np. w Oracle9i) wspierające 

dynamiczne zapytania

Niestety zupełnie ”martwy standard”

String name = “Jan”;
String surname = “Kowalski”; 

#sql {

INSERT INTO User (name, surname)

     VALUES (:name, :surname)

};

background image

Rafał Kasprzyk

JSTL SQL

Wygodna biblioteka znaczników wykorzystywana 

w prostych aplikacjach opartych na stronach JSP

Wykorzystanie JSTL SQL narusza model MVC           

              (ang. Model-View-Control)

Warstwę prezentacji zawiera kod związany z logikę 

biznesową

   …
   <sql:query var="Users">
   SELECT * FROM User
   </sql:query>
   <table border="1">

   <c:forEach var="columnName" items="${Users.columnNames}">
   <th><c:out value="${columnName}"/></th>
   </c:forEach>
   <c:forEach var="row" items="${Users.rows}">
   <tr>
   <c:forEach var="column" items="${row}">
<td><c:out value="${column.value}"/></td>
   </c:forEach>
   </tr>
   </c:forEach>

   </table>

background image

Rafał Kasprzyk

Rodzaje komponentów EJB

Platforma J2EE wyróżnia trzy rodzaje komponentów 

EJB (ang. Enterprise Java Beans):

Session Beans to komponenty realizujące logikę aplikacji. 

Stateful Session Bean – przechowują stan dialogu z klientem

Stateless Session Bean – nie przechowują stanu dialogu z 

klientem

Entity Beans reprezentują obiekt biznesowy z systemu 

przechowywania danych. Komponenty Entity Beans są 

współdzielone pomiędzy klientami, a dzięki systemowi 

identyfikacji obiektów, kontener nie dopuszcza do 

powstania dwóch komponentów reprezentujących te 

same dane. 

CMP (ang. Container Managed Persistence) – odpowiedzialność za 

synchronizację stanu komponentu z bazą danych spoczywa na 

kontenerze EJB

BMP (ang. Bean Managed Persistence) – programista musi 

zapewnić właściwe odwzorowanie danych z bazy na komponenty 

EJB i odwrotnie.

Message-Driven Beans to komponenty implementujące 

logikę związaną z reakcją na komunikaty pochodzące z 

warstwy pośredniej (ang. Message-Oriented Middleware).

background image

Rafał Kasprzyk

Entity Beans

Każdy encyjny komponent EJB jest oparty o tabelę 

w relacyjnej bazie danych, a każda instancja 

komponentu encyjnego reprezentuje wiersz w 

tabeli

Cechy encyjnych komponentów EJB

Trwałość

Typowo składowane w relacyjnej bazie danych

Odporne na awarie aplikacji, serwera aplikacji, serwera BD

Trwałość zarządzana przez kontener (CMP) lub komponent (BMP)

Współdzielenie

Możliwość współdzielenia instancji komponentu przez kilku 

klientów lub korzystanie z różnych instancji reprezentujących te 

same dane

Unikalny identyfikator (ang. primary key)

Podstawowe kryterium wyszukiwania obiektów

Związki

Umożliwiają tworzenie powiązań pomiędzy komponentami 

encyjnymi

Analogia do związków między tabelami w relacyjnej bazie 

danych

background image

Rafał Kasprzyk

CMP

Kontener EJB obsługuje wszystkie 

operacje na bazie danych, których 

wymaga komponent

Kod komponentu nie zawiera żadnych 

instrukcji SQL

Przenaszalność komponentu

Niezależności od schematu bazy i dialektu 

SQL wykorzystywanego przez konkretny 

serwer bazy danych

Kontener generuje odwołania do bazy 

danych w oparciu o abstrakcyjny 

schemat podany w deskryptorach 

instalacji

Kontener EJB obsługuje również związki 

między komponentami encyjnymi

background image

Rafał Kasprzyk

BMP

Programista komponentu dostarcza 

kodu zarządzającego trwałością 

komponentu

Należy zaimplementować metody do 

odczytu, zapisu, manipulacji danymi oraz 

zarządzania związkami

ejbLoad(), ejbStore(), ejbCreate(), 

ejbPostCreate(), ejbRemove(), ejbFindXXX()

Kod komponentu zawiera wywołania JDBC i 

SQLJ

Znacznie ograniczona przenaszalność

Kod odwołuje się do konkretnego schematu 

bazy danych

Elastyczność

Twórca komponentu w pełni zarządza jego 

trwałością

background image

Rafał Kasprzyk

Tworzenie EJB

Interfejs domowy (Home/LocalHome)

Wykorzystywany przez klientów do tworzenia, 

usuwania i wyszukiwania komponentów encyjnych

Interfejs komponentowy (Remote/Local)

Zawiera deklaracje metod biznesowych 

komponentu, udostępnianych klientom

Klasa komponentu

Reprezentuje dane biznesowe

Zawiera metody dostępu do danych i manipulacji 

danymi

Może zawierać kod walidujący dane

Klasa klucza głównego

Wykorzystywana do identyfikacji instancji 

komponentu

Deskryptor instalacji (ang. deployment 

descriptor)

Plik XML z danymi konfiguracyjnymi 

wykorzystywanymi przez kontener

background image

Rafał Kasprzyk

Wady EJB

Bardzo złożona technologia

Duży nakład pracy konieczny do 

stworzenia komponentu i jego 

konfiguracji

failed technology

Mała elastyczność i wydajność w 

zakresie komunikacji z bazą danych

Mało funkcjonalny język zapytań EJB-QL

Nie pozwalają na wykorzystanie 

podstawowych zalet obiektowego 

podejścia do tworzenia aplikacji 

Dziedziczenie

Polimorfizm

background image

Rafał Kasprzyk

Wady EJB

Brak możliwości testowania 

komponentów EJB poza 

środowiskiem kontenera

Trudności w przeprowadzaniu testów 

jednostkowych

Trudności w migracji aplikacji 

pomiędzy serwerami różnych 

producentów związane z 

komponentami EJB

Każdy serwer ma własne pliki 

konfiguracyjne         (ejb-jar.xml)

background image

Rafał Kasprzyk

EJB 3.0 – istotne zmiany

Plik konfiguracyjny ejb-jar.xml nie 

jest potrzebny

Cała konfiguracja przeprowadzana jest 

z wykorzystaniem mechanizmu 

annotations (@Stateless, @Entity, 

…)

Znacząco uproszczony sposób 

tworzenia

Komponenty nie muszą implementować 

żadnych zewnętrznych interfejsów

Aplikacja bazuje na tzw. zwyczajnych, 

starych obiektach Java – POJO (ang. 

Plain Old Java Objects)

background image

Rafał Kasprzyk

EJB 3.0 – istotne zmiany

Rozbudowany język zapytań EJB-QL

Możliwość wykorzystania zalet 

obiektowego podejścia do tworzenia 

aplikacji

Dziedziczenie

Polimorfizm

Komponenty encyjne mogą być 

wykorzystywane poza środowiskiem 

serwera aplikacji

background image

Rafał Kasprzyk

JDO

JDO to specyfikacja do utrwalania obiektów Java 

stworzona przez Sun, w składnicy danych, którą 

możą być

Relacyjny DBMS

Obiektowy DBMS

Pliki XML, pliki tekstowe

JDO ma wiele implementcji

Komercyjne

JDO Genie, JPower Map, JCredo, ObjectDB, XCalia, JORM

Open source

JDO Instruments, JDOMax, Speedo, Jakarta OJB, JPOX

JPOX to darmowa implementacja standardów 

JDO 1.0 i JDO2.0

Obecnie prawdopodobnie najbardziej popularna

Wsparcie dla większości relacyjnych DBMS

MySQL, Firebird, Informix, Oracle, Sybase, DB2, 

SAPDB/MaxDB

Bardzo dobrze udokumentowana

background image

Rafał Kasprzyk

Klasy JDO

Zdolne do trwałości (ang. persistence 

capable

Klasa, której obiekty mają być utrwalane musi 

być ulepszona (ang. JDO enhanced )na 

podstawie metadanych. 

Dla tych klas muszą istnieć metadane

pliki *.jdo (deskryptory)

Świadome trwałości (ang. persistence 

aware)

Klasy manipulujące instancjami klas zdolnych 

do trwałości. Klasy te są automatycznie 

ulepszane

Zwyczajne (ang. normal)

Klasy nie mające nic wspólnego z JDO. Nie są 

opisywane za pomocą metadanych i nie są 

ulepszane

background image

Rafał Kasprzyk

Menedżer utrwalania obiektów

Properties props=new Properties(); 

props.put("javax.jdo.PersistenceManagerFactoryClass",

"org.jpox.PersistenceManagerFactoryImpl"); 

props.put("javax.jdo.option.ConnectionDriverName",

"com.mysql.jdbc.driver"); 

props.put("javax.jdo.option.ConnectionURL",

"jdbc:mysql://localhost/jpox"); 

props.put("javax.jdo.option.ConnectionUserName",

"mysql"); 

props.put("javax.jdo.option.ConnectionPassword","");

PersistenceManagerFactory 

pmf=JDOHelper.getPersistenceManagerFactory(props);

PersistenceManager pm=pmf.getPersistenceManager(); 

PersistenceManagerFactory

Klasa służąca do uzyskania dostępu do zarządcy 

trwałości

Inicjalizacja na poziomie aplikacji (jak w przykładzie)

Inicjalizacja za pomocą pliku properties lub JNDI

PersitenceManager

Klasa odpowiedzialna za utrwalanie obiektów, 

odczytywanie trwałych obiektów ze składnicy danych i 

usuwanie obiektów

background image

Rafał Kasprzyk

Rodzaje obiektów w JDO 

(nomenklatura)

background image

Rafał Kasprzyk

Zapis nowego obiektu do bazy

Transaction tx=pm.currentTransaction(); 
try { 

tx.begin(); 
Product product = new Product("T20MT",

 "A standard mp3 player from iRiver", 

 99.99);

pm.makePersistent(product);
tx.commit();


finally { 

if (tx.isActive()) {
  tx.rollback(); 

}

background image

Rafał Kasprzyk

Aktualizacja wpisu w bazie

Transaction tx=pm.currentTransaction();

try { 

tx.begin(); 

String product_name = product.getName();

 ... 

product.setPrice(89.99);

tx.commit(); 

finally { 

if (tx.isActive()) {

  tx.rollback(); 

  } 

background image

Rafał Kasprzyk

Usunięcie obiektu z bazy

Transaction tx=pm.currentTransaction();

try {

  tx.begin(); 

String product_name = product.getName();

 ... 

pm.deletePersistent(product);

tx.commit();

finally { 

if (tx.isActive()) {

  tx.rollback(); 

  } 

background image

Rafał Kasprzyk

Modyfikacja obiektu poza 

transakcją

Działanie na obiekcie poza 

transakcją pozwala dowolnie 

modyfikować obiekt bez 

jakichkolwiek zmian w bazie danych. 

W tym celu należy:

Przenieść obiekt w stan Transient

makeTransient()

Odłączyć obiekt

detachCopy()

Wykorzystać poza transakcyjne 

czytanie/pisanie

nonTransactional[Read/Write]()

background image

Rafał Kasprzyk

Wczytanie obiektu z bazy

Wykorzystanie tożsamości obiektu

Object identity = pm.getObjectId(obj);
Object obj = pm.getObjectById(identity);

Użycie JDOQL (ang. JDO Query Language)

Query query = pm.newQuery(Product.class, 

„price < value"); 

query.declareParameters(„float value"); 
List results = query.execute(100);
Iterator iter = results.iterator(); 
while (iter.hasNext()) 

Product product = (Product)iter.next();

}

Extent jako brutalna alternatywa dla 

JDOQL

Extent e = pm.getExtent(Product.class, true);

background image

Rafał Kasprzyk

JDO - metadane

package pl.isolution.jdo

public class Product {

String pname;

String description;

float price;

}

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE jdo PUBLIC

"-//Sun Microsystems, Inc.//DTD Java Data Objects Metadata 

2.0//EN"

"http://java.sun.com/dtd/jdo_2_0.dtd">

<jdo>

    <package name="pl.isolution.jdo">

        <class name= "Product" identity-type="datastore">

  <field name= "pname"/>

  <field name= "description"/>

  <field name= "price"/>

        </class>

    </package>

</jdo>

background image

Rafał Kasprzyk

Zalety JDO

Można zmienić silnik bazy danych, a 

nawet typ bazy bez zmian w kodzie

Nie trzeba tworzyć struktury bazy 

danych od nowa

Możliwość wykorzystania istniejącego 

schematu

Możliwość automatycznej generacji 

schematu

Koniec z normalizacją ;)

Klasy trwałe nie musza implementować 

żadnych specjalnych interfejsów

Aplikacja bazuje na tzw. zwyczajnych, 

starych obiektach Java – POJO (ang. Plain 

Old Java Objects)

background image

Rafał Kasprzyk

iBATIS SqlMaps

Biblioteka zapewniająca niewątpliwe 

korzyści jakie daje zastosowanie 

mechanizmu odwzorowań obiektowo-

relacyjnych, a jednocześnie

Zmniejsza zagrożenia związane z ich 

nieuzasadnionym stosowaniem

Nie zmusza do stosowania rozwiązań 

znacznie wykraczających poza potrzeby

Biblioteka należy do klasy tzw. lekkich 

ORM’ów

Świetna współpraca ze Spring 

Framework

Spring to obecnie prawdopodobnie 

najpopularniejsze środowiskiem rozwoju 

aplikacji J2EE

background image

Rafał Kasprzyk

Person.java Person.sql

package domain;

public class Person {

private int id;

private String firstName;

private String lastName;

private Date birthDate;

private double weight;

private double height;

public int getId () {

return id;

}

public void setId (int id) {

this.id = id;

}

}

CREATE TABLE PERSON(

ID

NUMBER (5, 0) NOT NULL,

FIRST_NAME 

VARCHAR (40) NOT NULL,

LAST_NAME 

VARCHAR (40) NOT NULL,

BIRTH_DATE 

DATETIME ,

WEIGHT 

NUMBER (4, 2) NOT NULL,

HEIGHT 

NUMBER (4, 2) NOT NULL,

PRIMARY KEY (ID)

)

background image

Rafał Kasprzyk

sqlMap-config.[xml/properties]

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE sqlMapConfig

PUBLIC "-//iBATIS.com//DTD SQL Map Config 2.0//EN" 

"http://www.ibatis.com/dtd/sql-map-config-2.dtd">

<sqlMapConfig>

<properties resource="sqlmap/maps/SqlMapConfig.properties" />

<settings

cacheModelsEnabled="true"

enhancementEnabled="true"

lazyLoadingEnabled="true"

maxRequests="32"

maxSessions="10"

maxTransactions="5"

useStatementNamespaces="false" />

<typeAlias alias="order" type="domain.Order"/>

<transactionManager type="JDBC" >

<dataSource type="SIMPLE">

<property name="JDBC.Driver" value="${driver}"/>

<property name="JDBC.ConnectionURL" value="${url}"/>

<property name="JDBC.Username" value="${username}"/>

<property name="JDBC.Password" value="${password}"/>

</dataSource>

</transactionManager>

<sqlMap resource="examples/sqlmap/maps/Person.xml" />

</sqlMapConfig>

driver = com.mysql.jdbc.Driver

url = jdbc:mysql://localhost/testDB

username = smith

password = 3w$#kr8u

background image

Rafał Kasprzyk

Person.xml

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE sqlMap

PUBLIC "-//iBATIS.com//DTD SQL Map 2.0//EN"

"http://www.ibatis.com/dtd/sql-map-2.dtd">

<sqlMap namespace="Person">

<select id="getPerson" parameterClass=”int” 

resultClass="domain.Person">

SELECT ID as id, FIRST_NAME as firstName, LAST_NAME as 

lastName, 

BIRTH_DATE as birthDate, WEIGHT as weight, HEIGHT 

as height FROM 

PERSON WHERE ID = #value#

</select>

<insert id="insertPerson" parameterClass="domain.Person">

INSERT INTO PERSON (ID, FIRST_NAME, LAST_NAME, 

BIRTH_DATE, WEIGHT, HEIGHT) VALUES (#id#, #firstName#, 

#lastName#, #birthDate#, #weight#, #height#)

</insert>

<update id="updatePerson" parameterClass="domain.Person">

UPDATE PERSON SET FIRST_NAME = #firstName#, LAST_NAME = 

#lastName#, BIRTH_DATE = #birthDate#, WEIGHT = #weight#, 

HEIGHT = #height# WHERE ID = #id#

</update>

<delete id="deletePerson" parameterClass="domain.Person">

DELETE PERSON WHERE ID = #id#

</delete>

</sqlMap>

background image

Rafał Kasprzyk

MyAppSqlConfig.java

public MyAppSqlConfig {

  private static final SqlMapClient sqlMap;

        

    static {

      try {

        String resource = 

"sqlmap/maps/sqlMap-config.xml ";

   Reader reader = 

Resources.getResourceAsReader(resource);

   sqlMap = 

SqlMapClientBuilder.buildSqlMapClient(reader);

      }catch (Exception e) {

    e.printStackTrace();

      }

    }

    public static getSqlMapInstance () {

        return sqlMap;

    }

}

background image

Rafał Kasprzyk

Przykład wykorzystania iBATIS

SqlMapClient sqlMap = MyAppSqlMapConfig.getSqlMapInstance(); 

Integer personPk = new Integer(5);

Person person = 

(Person) sqlMap.queryForObject (“getPerson”, personPk);

person.setHeight(1.83); 

person.setWeight(86.36);

sqlMap.update(“updatePerson”, person);

sqlMap.delete (“deletePerson”, person);

Person nPerson = new Person();

nPerson.setId(11);

nPerson.setFirstName(“Jan”);

nPerson.setLastName(“Kowalski”);

nPerson.setBirthDate (null);

nPerson.setHeight(1.83);

nPerson.setWeight(86.36);

sqlMap.insert (“insertPerson”, nPerson);

background image

Rafał Kasprzyk

Zalety iBATIS SQLMaps

iBATIS SQLMaps pozwala

Kojarzyć kolumny i polecenia SQL ze 

słowami kluczowymi

Korzystać z pełnych możliwości SQL 

bez uciążliwości stosowania JDBC

Usunąć wszelkie polecenia SQL z kodu 

aplikacji

Klasy trwałe nie musza 

implementować żadnych 

specjalnych interfejsów

Aplikacja bazuje na tzw. zwyczajnych, 

starych obiektach Java – POJO (ang. 

Plain Old Java Objects)

background image

Rafał Kasprzyk

Oracle TopLink

Kolejna ciekawa technologia warstwy 

integracji oparta na idei mapowania 

obiektowo-relacyjnego

Wykorzystywana w aplikacjach pisanych 

w języku Java i opartych o relacyjne 

bazy danych

Zasada działania podobna do innych 

bibliotek opartych na idei ORM

Programista definiuje w języku XML 

zasady odwzorowań obiektów Java na 

tabele w relacyjnej bazie danych 

(metadane)

TopLink został włączony do systemu 

zarządzania bazą danych Oralce9i

background image

Rafał Kasprzyk

Rozwój aplikacji w oparciu o 

TopLink

Projektowanie modelu danych dla relacyjnej 

bazy danych i jego implementacja w wybranym 

RDBMS

Projektowanie obiektowego modelu danych i 

jego implementacja w języku Java

Definiowanie metadanych

Implementacja kodu przetwarzania danych w 

języku Java

Wykorzystane narzędzia

JDeveloper 10g R3

Zawiera kreatory i edytory odwzorowań

TopLink Workbench

Samodzielna aplikacja ułatwiająca definiowanie odwzorowań

Jedynie biblioteka TopLink API

Brak wsparcia do automatyzacji definiowania odwzorowań

background image

Rafał Kasprzyk

TopLink – podstawowe pojęcia

Deskryptor (ang. descriptor)

Opisuje powiązanie pomiędzy klasą 

Javy, a tabelą w relacyjnej bazie 

danych

Odwzorowanie (ang. mappings)

Opisuje powiązanie pomiędzy 

atrybutem klasy, a kolumną tabeli

Projekt (ang. project)

Gromadzi wszystkie deskryptory i 

odwzorowania dla całej aplikacji

background image

Rafał Kasprzyk

Podsumowanie

Technologie warstwy integracji

Wykorzystania SQL na JDBC vs. SQLJ 

SQL w warstwie prezentacji – JSTL

EJB – wady i zalety

Wykorzystanie mapowania ORM

EJB

JDO

iBATIS SQLMaps

Oracle TopLink

Hibernate – to dopiero przed nami ;)


Document Outline