zastosowanie obiektowych baz danych na przykładzie db4o

52
Wstęp Informacje o db4o Podstawy db4o Cykl życia obiektów Db4oUtil Zapytania Podsumowanie Zastosowanie obiektowych baz danych na przykladzie db4o. Marcin Stachniuk [email protected] 15 marca 2010 Marcin Stachniuk Zastosowanie obiektowych baz danych na przykladzie db4o. 1/51

Upload: marcinstachniuk

Post on 21-Jan-2018

480 views

Category:

Technology


2 download

TRANSCRIPT

  • Wstp Informacje o db4o Podstawy db4o Cykl ycia obiektw Db4oUtil Zapytania Podsumowanie

    Zastosowanie obiektowych baz danych naprzykadzie db4o.

    Marcin [email protected]

    15 marca 2010

    Marcin Stachniuk Zastosowanie obiektowych baz danych na przykadzie db4o. 1/51

  • Wstp Informacje o db4o Podstawy db4o Cykl ycia obiektw Db4oUtil Zapytania Podsumowanie

    Plan prezentacji

    1 Wstp

    2 Informacje o db4o

    3 Podstawy db4o

    4 Cykl ycia obiektw

    5 Db4oUtil

    6 Zapytania

    7 Podsumowanie

    Marcin Stachniuk Zastosowanie obiektowych baz danych na przykadzie db4o. 2/51

  • Wstp Informacje o db4o Podstawy db4o Cykl ycia obiektw Db4oUtil Zapytania Podsumowanie

    Plan prezentacji

    1 Wstp

    2 Informacje o db4o

    3 Podstawy db4o

    4 Cykl ycia obiektw

    5 Db4oUtil

    6 Zapytania

    7 Podsumowanie

    Marcin Stachniuk Zastosowanie obiektowych baz danych na przykadzie db4o. 3/51

  • Wstp Informacje o db4o Podstawy db4o Cykl ycia obiektw Db4oUtil Zapytania Podsumowanie

    Troch historii

    Troch historii...

    Marcin Stachniuk Zastosowanie obiektowych baz danych na przykadzie db4o. 4/51

  • Wstp Informacje o db4o Podstawy db4o Cykl ycia obiektw Db4oUtil Zapytania Podsumowanie

    Zalety relacyjnych baz danych

    Popularno

    Szeroko stosowane w rozwizaniach komercyjnych

    Niezaleno od wykorzystywanego jzyka programowania

    Moliwoci optymalizacji

    atwo projektowania

    Autoryzacja dostpu

    Marcin Stachniuk Zastosowanie obiektowych baz danych na przykadzie db4o. 5/51

  • Wstp Informacje o db4o Podstawy db4o Cykl ycia obiektw Db4oUtil Zapytania Podsumowanie

    Wady relacyjnych baz danych

    Niezgodno impedancji

    Schemat struktury danych gubi znaczn cz semantykidanych

    Konieczno budowania skomplikowanych zapyta SQL

    Konieczno zatrudniania administratora bazy danych

    Brak zoonych obiektw

    Rozproszenie danych w wielu tablicach

    Nietrzymanie si standardw

    Konieczno mapowania obiektowo-relacyjnego

    Marcin Stachniuk Zastosowanie obiektowych baz danych na przykadzie db4o. 6/51

  • Wstp Informacje o db4o Podstawy db4o Cykl ycia obiektw Db4oUtil Zapytania Podsumowanie

    Problem mapowania obiektowo relacyjnego (ORM)

    Architektura wielowarstwowa

    Marcin Stachniuk Zastosowanie obiektowych baz danych na przykadzie db4o. 7/51

  • Wstp Informacje o db4o Podstawy db4o Cykl ycia obiektw Db4oUtil Zapytania Podsumowanie

    Problem mapowania obiektowo relacyjnego (ORM)

    Architektura wielowarstwowa

    Marcin Stachniuk Zastosowanie obiektowych baz danych na przykadzie db4o. 8/51

  • Wstp Informacje o db4o Podstawy db4o Cykl ycia obiektw Db4oUtil Zapytania Podsumowanie

    Problem mapowania obiektowo relacyjnego (ORM)

    Marcin Stachniuk Zastosowanie obiektowych baz danych na przykadzie db4o. 9/51

  • Wstp Informacje o db4o Podstawy db4o Cykl ycia obiektw Db4oUtil Zapytania Podsumowanie

    Rozwizanie problemu

    Jak uatwi sobie ycie?

    Wykorzysta obiektow baz danych!

    Marcin Stachniuk Zastosowanie obiektowych baz danych na przykadzie db4o. 10/51

  • Wstp Informacje o db4o Podstawy db4o Cykl ycia obiektw Db4oUtil Zapytania Podsumowanie

    Rozwizanie problemu

    Jak uatwi sobie ycie?

    Wykorzysta obiektow baz danych!

    Marcin Stachniuk Zastosowanie obiektowych baz danych na przykadzie db4o. 10/51

  • Wstp Informacje o db4o Podstawy db4o Cykl ycia obiektw Db4oUtil Zapytania Podsumowanie

    Plan prezentacji

    1 Wstp

    2 Informacje o db4o

    3 Podstawy db4o

    4 Cykl ycia obiektw

    5 Db4oUtil

    6 Zapytania

    7 Podsumowanie

    Marcin Stachniuk Zastosowanie obiektowych baz danych na przykadzie db4o. 11/51

  • Wstp Informacje o db4o Podstawy db4o Cykl ycia obiektw Db4oUtil Zapytania Podsumowanie

    Podstawy db4o

    www.db4o.com

    Marcin Stachniuk Zastosowanie obiektowych baz danych na przykadzie db4o. 12/51

  • Wstp Informacje o db4o Podstawy db4o Cykl ycia obiektw Db4oUtil Zapytania Podsumowanie

    Charakterystyka db4o

    Czym jest db4o?

    Obiektowa baza danych open-source

    Dwie licencje: darmowa i komercyjna

    Natywna implementacja dla jzykw Java i .NET

    Dua spoeczno (60000 zarejestrowanych developerw)

    Ponad milion cigni

    Marcin Stachniuk Zastosowanie obiektowych baz danych na przykadzie db4o. 13/51

  • Wstp Informacje o db4o Podstawy db4o Cykl ycia obiektw Db4oUtil Zapytania Podsumowanie

    Charakterystyka db4o

    Firmy korzystajce z db4o:

    BMW BoeingBosch IBMIntel RicohSeagate INDRA SistemasMerrill Lynch PostbankMacrix Software Mandala ITEastern Data Riege Software InternationalDie Mobilanten ITAnyplacePragmatyxs ElectrabelJuvander TradeWeaponLong Island Housing Services MR ControlsNovator Clarity MedicalSyft Technologies Arum Systems

    Marcin Stachniuk Zastosowanie obiektowych baz danych na przykadzie db4o. 14/51

  • Wstp Informacje o db4o Podstawy db4o Cykl ycia obiektw Db4oUtil Zapytania Podsumowanie

    Charakterystyka db4o

    Dla kogo db4o?

    Mae i rednie projekty (studenckie projekty!!!)

    Nowe niskobudetowe projekty

    Gdzie nie ma narzuconej technologii wykorzystywanej bazydanych

    Baza moe dziaa na pliku dyskowym (podobnie jak: SQLite)

    Brak koniecznoci stawiania osobnego serwera bazodanowego(ale oczywicie mona)

    wietnie si nadaje do aplikacji typu standalone

    Marcin Stachniuk Zastosowanie obiektowych baz danych na przykadzie db4o. 15/51

  • Wstp Informacje o db4o Podstawy db4o Cykl ycia obiektw Db4oUtil Zapytania Podsumowanie

    Plan prezentacji

    1 Wstp

    2 Informacje o db4o

    3 Podstawy db4o

    4 Cykl ycia obiektw

    5 Db4oUtil

    6 Zapytania

    7 Podsumowanie

    Marcin Stachniuk Zastosowanie obiektowych baz danych na przykadzie db4o. 16/51

  • Wstp Informacje o db4o Podstawy db4o Cykl ycia obiektw Db4oUtil Zapytania Podsumowanie

    Pierwsze kroki

    Zanim zaczniemy programowa:

    cignicie db4o

    Podpicie JARa do projektu

    Marcin Stachniuk Zastosowanie obiektowych baz danych na przykadzie db4o. 17/51

  • Wstp Informacje o db4o Podstawy db4o Cykl ycia obiektw Db4oUtil Zapytania Podsumowanie

    Pierwsza klasa cz.1

    1 public class User {23 private String name;4 private String surname;56 public String getName() {7 return name;8 }910 public void setName(String name) {11 this.name = name;12 }

    Marcin Stachniuk Zastosowanie obiektowych baz danych na przykadzie db4o. 18/51

  • Wstp Informacje o db4o Podstawy db4o Cykl ycia obiektw Db4oUtil Zapytania Podsumowanie

    Pierwsza klasa cz.2

    1 public String getSurname() {2 return surname;3 }45 public void setSurname(String surname) {6 this.surname = surname;7 }89 @Override10 public String toString() {11 return name + + surname;12 }

    Marcin Stachniuk Zastosowanie obiektowych baz danych na przykadzie db4o. 19/51

  • Wstp Informacje o db4o Podstawy db4o Cykl ycia obiektw Db4oUtil Zapytania Podsumowanie

    Zapisywanie obiektu w bazie danych

    1 public void save() {2 // Otwarcie poczenia z baz3 ObjectContainer db = Db4o.openFile(baza.yap);4 try {5 // zapis6 db.store(this);7 System.out.println(Zapisano: +this.toString());8 } finally {9 // zamknicie poczenia10 db.close();11 }12 }1314 public static void main(String [] args) {15 User user = new User();16 user.setName(Jan);17 user.setSurname(Kowalski);18 user.save();19 }

    User.java (wersja 1)Marcin Stachniuk Zastosowanie obiektowych baz danych na przykadzie db4o. 20/51

    Userv1.java/*

    *Tochangethistemplate,chooseTools|Templates

    *andopenthetemplateintheeditor.

    */

    packagedb4otutorial;

    importcom.db4o.Db4o;

    importcom.db4o.ObjectContainer;

    /**

    *

    *@authorStaszek

    */

    publicclassUser{

    privateStringname;

    privateStringsurname;

    publicStringgetName(){

    returnname;

    }

    publicvoidsetName(Stringname){

    this.name=name;

    }

    publicStringgetSurname(){

    returnsurname;

    }

    publicvoidsetSurname(Stringsurname){

    this.surname=surname;

    }

    @Override

    publicStringtoString(){

    returnname+""+surname;

    }

    publicvoidsave(){

    //Otwarciepoczeniazbaz

    ObjectContainerdb=Db4o.openFile("baza.yap");

    try{

    db.store(this);//zapis

    System.out.println("Zapisano:"+this.toString());

    }finally{

    db.close();//zamkniciepoczenia

    }

    }

    publicstaticvoidmain(String[]args){

    Useruser=newUser();

    user.setName("Jan");

    user.setSurname("Kowalski");

    user.save();

    }

    }//endofclassUser

    Klasa User i zapisywanie w bazie danych

  • Wstp Informacje o db4o Podstawy db4o Cykl ycia obiektw Db4oUtil Zapytania Podsumowanie

    Wywietlanie wszystkich obiektw z bazy danych

    1 public static void showAllUsers() {2 ObjectContainer db = Db4o.openFile(baza.yap);3 try {4 ObjectSet userSet = db.queryByExample(User.class);5 //ObjectSet userSet = db.query(User.class);6 for(User u : userSet) {7 System.out.println(Odczytano: +u);8 }9 } finally {10 db.close();11 }12 }

    User.java (wersja 2)

    Marcin Stachniuk Zastosowanie obiektowych baz danych na przykadzie db4o. 21/51

    Userv2.java/*

    *Tochangethistemplate,chooseTools|Templates

    *andopenthetemplateintheeditor.

    */

    packagedb4otutorial;

    importcom.db4o.Db4o;

    importcom.db4o.ObjectContainer;

    importcom.db4o.ObjectSet;

    /**

    *

    *@authorStaszek

    */

    publicclassUser{

    privateStringname;

    privateStringsurname;

    publicStringgetName(){

    returnname;

    }

    publicvoidsetName(Stringname){

    this.name=name;

    }

    publicStringgetSurname(){

    returnsurname;

    }

    publicvoidsetSurname(Stringsurname){

    this.surname=surname;

    }

    @Override

    publicStringtoString(){

    returnname+""+surname;

    }

    publicvoidsave(){

    //Otwarciepoczeniazbaz

    ObjectContainerdb=Db4o.openFile("baza.yap");

    try{

    db.store(this);//zapis

    System.out.println("Zapisano:"+this.toString());

    }finally{

    db.close();//zamkniciepoczenia

    }

    }

    publicstaticvoidshowAllUsers(){

    ObjectContainerdb=Db4o.openFile("baza.yap");

    try{

    ObjectSetuserSet=db.queryByExample(User.class);

    //ObjectSetuserSet=db.query(User.class);

    for(Useru:userSet){

    System.out.println("Odczytano:"+u);

    }

    }finally{

    db.close();

    }

    }

    publicstaticvoidmain(String[]args){

    //Useruser=newUser();

    //user.setName("Jan");

    //user.setSurname("Kowalski");

    //user.save();

    User.showAllUsers();

    }

    }//endofclassUser

    Klasa User i wyswietlanie wszystkich rekordw z bazy danych

  • Wstp Informacje o db4o Podstawy db4o Cykl ycia obiektw Db4oUtil Zapytania Podsumowanie

    Zapytania poprzez QueryByExample

    1 public static void showAllByName(String name) {2 ObjectContainer db = Db4o.openFile(baza.yap);3 try {4 User user = new User();5 user.setName(name);6 ObjectSet userSet = db.queryByExample(user);7 for(User u : userSet) {8 System.out.println(Znaleziono: +u);9 }10 } finally {11 db.close();12 }13 }

    User.java (wersja 3)

    Marcin Stachniuk Zastosowanie obiektowych baz danych na przykadzie db4o. 22/51

    Userv3.java/*

    *Tochangethistemplate,chooseTools|Templates

    *andopenthetemplateintheeditor.

    */

    packagedb4otutorial;

    importcom.db4o.Db4o;

    importcom.db4o.ObjectContainer;

    importcom.db4o.ObjectSet;

    /**

    *

    *@authorStaszek

    */

    publicclassUser{

    privateStringname;

    privateStringsurname;

    publicStringgetName(){

    returnname;

    }

    publicvoidsetName(Stringname){

    this.name=name;

    }

    publicStringgetSurname(){

    returnsurname;

    }

    publicvoidsetSurname(Stringsurname){

    this.surname=surname;

    }

    @Override

    publicStringtoString(){

    returnname+""+surname;

    }

    publicvoidsave(){

    //Otwarciepoczeniazbaz

    ObjectContainerdb=Db4o.openFile("baza.yap");

    try{

    db.store(this);//zapis

    System.out.println("Zapisano:"+this.toString());

    }finally{

    db.close();

    }

    }

    publicstaticvoidshowAllUsers(){

    ObjectContainerdb=Db4o.openFile("baza.yap");

    try{

    ObjectSetuserSet=db.queryByExample(User.class);

    //ObjectSetuserSet=db.query(User.class);

    for(Useru:userSet){

    System.out.println("Odczytano:"+u);

    }

    }finally{

    db.close();

    }

    }

    publicstaticvoidshowAllByName(Stringname){

    ObjectContainerdb=Db4o.openFile("baza.yap");

    try{

    Useruser=newUser();

    user.setName(name);

    ObjectSetuserSet=db.queryByExample(user);

    for(Useru:userSet){

    System.out.println("Znaleziono:"+u);

    }

    }finally{

    db.close();

    }

    }

    publicstaticvoidmain(String[]args){

    System.out.println("PoszukajmyJana:");

    showAllByName("Jan");

    System.out.println("Wszyscy:");

    showAllUsers();

    }

    }//endofclassUser

    Klasa User i przykadow zapytanie poprzez QueryByExample

  • Wstp Informacje o db4o Podstawy db4o Cykl ycia obiektw Db4oUtil Zapytania Podsumowanie

    Zapytania poprzez QueryByExample

    Jak dziaa QueryByExample?

    Wyszukuje obiekty, ktre maj te same pola co ustawionyprzykad

    Dla pl ustawionych na null dopasowuje dowolne wartoci

    Zwraca ObjectSet poszukiwanych obiektw

    Marcin Stachniuk Zastosowanie obiektowych baz danych na przykadzie db4o. 23/51

  • Wstp Informacje o db4o Podstawy db4o Cykl ycia obiektw Db4oUtil Zapytania Podsumowanie

    Modyfikacja obiektw

    1 public static void changeAllNames(String oldName, String newName) {2 ObjectContainer db = Db4o.openFile(baza.yap);3 try {4 User user = new User();5 user.setName(oldName);6 ObjectSet userSet = db.queryByExample(user);7 for(User u : userSet) {8 u.setName(newName);9 db.store(u);10 }11 } finally {12 db.close();13 }14 }

    User.java (wersja 4)

    Marcin Stachniuk Zastosowanie obiektowych baz danych na przykadzie db4o. 24/51

    Userv4.java/*

    *Tochangethistemplate,chooseTools|Templates

    *andopenthetemplateintheeditor.

    */

    packagedb4otutorial;

    importcom.db4o.Db4o;

    importcom.db4o.ObjectContainer;

    importcom.db4o.ObjectSet;

    /**

    *

    *@authorStaszek

    */

    publicclassUser{

    privateStringname;

    privateStringsurname;

    publicStringgetName(){

    returnname;

    }

    publicvoidsetName(Stringname){

    this.name=name;

    }

    publicStringgetSurname(){

    returnsurname;

    }

    publicvoidsetSurname(Stringsurname){

    this.surname=surname;

    }

    @Override

    publicStringtoString(){

    returnname+""+surname;

    }

    publicvoidsave(){

    //Otwarciepoczeniazbaz

    ObjectContainerdb=Db4o.openFile("baza.yap");

    try{

    db.store(this);//zapis

    System.out.println("Zapisano:"+this.toString());

    }finally{

    db.close();

    }

    }

    publicstaticvoidshowAllUsers(){

    ObjectContainerdb=Db4o.openFile("baza.yap");

    try{

    ObjectSetuserSet=db.queryByExample(User.class);

    //ObjectSetuserSet=db.query(User.class);

    for(Useru:userSet){

    System.out.println("Odczytano:"+u);

    }

    }finally{

    db.close();

    }

    }

    publicstaticvoidshowAllByName(Stringname){

    ObjectContainerdb=Db4o.openFile("baza.yap");

    try{

    Useruser=newUser();

    user.setName(name);

    ObjectSetuserSet=db.queryByExample(user);

    for(Useru:userSet){

    System.out.println("Znaleziono:"+u);

    }

    }finally{

    db.close();

    }

    }

    publicstaticvoidchangeAllNames(StringoldName,StringnewName){

    ObjectContainerdb=Db4o.openFile("baza.yap");

    try{

    Useruser=newUser();

    user.setName(oldName);

    ObjectSetuserSet=db.queryByExample(user);

    for(Useru:userSet){

    u.setName(newName);

    db.store(u);

    }

    }finally{

    db.close();

    }

    }

    publicstaticvoidmain(String[]args){

    System.out.println("Przedzmianimion:");

    showAllUsers();

    System.out.println("Zmiana");

    changeAllNames("Jan","Piotr");

    System.out.println("Wszyscy:");

    showAllUsers();

    }

    }//endofclassUser

    Klasa User i modyfikacja obiektw w bazie danych

  • Wstp Informacje o db4o Podstawy db4o Cykl ycia obiektw Db4oUtil Zapytania Podsumowanie

    Usuwanie obiektw

    1 public static void deleteAllByNames(String name) {2 ObjectContainer db = Db4o.openFile(baza.yap);3 try {4 User user = new User();5 user.setName(name);6 ObjectSet userSet = db.queryByExample(user);7 for(User u : userSet) {8 db.delete(u);9 }10 } finally {11 db.close();12 }13 }

    User.java (wersja 5)

    Marcin Stachniuk Zastosowanie obiektowych baz danych na przykadzie db4o. 25/51

    Userv5.java/*

    *Tochangethistemplate,chooseTools|Templates

    *andopenthetemplateintheeditor.

    */

    packagedb4otutorial;

    importcom.db4o.Db4o;

    importcom.db4o.ObjectContainer;

    importcom.db4o.ObjectSet;

    /**

    *

    *@authorStaszek

    */

    publicclassUser{

    privateStringname;

    privateStringsurname;

    publicStringgetName(){

    returnname;

    }

    publicvoidsetName(Stringname){

    this.name=name;

    }

    publicStringgetSurname(){

    returnsurname;

    }

    publicvoidsetSurname(Stringsurname){

    this.surname=surname;

    }

    @Override

    publicStringtoString(){

    returnname+""+surname;

    }

    publicvoidsave(){

    //Otwarciepoczeniazbaz

    ObjectContainerdb=Db4o.openFile("baza.yap");

    try{

    db.store(this);//zapis

    System.out.println("Zapisano:"+this.toString());

    }finally{

    db.close();

    }

    }

    publicstaticvoidshowAllUsers(){

    ObjectContainerdb=Db4o.openFile("baza.yap");

    try{

    ObjectSetuserSet=db.queryByExample(User.class);

    //ObjectSetuserSet=db.query(User.class);

    for(Useru:userSet){

    System.out.println("Odczytano:"+u);

    }

    }finally{

    db.close();

    }

    }

    publicstaticvoidshowAllByName(Stringname){

    ObjectContainerdb=Db4o.openFile("baza.yap");

    try{

    Useruser=newUser();

    user.setName(name);

    ObjectSetuserSet=db.queryByExample(user);

    for(Useru:userSet){

    System.out.println("Znaleziono:"+u);

    }

    }finally{

    db.close();

    }

    }

    publicstaticvoidchangeAllNames(StringoldName,StringnewName){

    ObjectContainerdb=Db4o.openFile("baza.yap");

    try{

    Useruser=newUser();

    user.setName(oldName);

    ObjectSetuserSet=db.queryByExample(user);

    for(Useru:userSet){

    u.setName(newName);

    db.store(u);

    }

    }finally{

    db.close();

    }

    }

    publicstaticvoiddeleteAllByNames(Stringname){

    ObjectContainerdb=Db4o.openFile("baza.yap");

    try{

    Useruser=newUser();

    user.setName(name);

    ObjectSetuserSet=db.queryByExample(user);

    for(Useru:userSet){

    db.delete(u);

    }

    }finally{

    db.close();

    }

    }

    publicstaticvoidmain(String[]args){

    System.out.println("Napocztku:");

    showAllUsers();

    System.out.println("UsuwamyPiotrw");

    deleteAllByNames("Piotr");

    System.out.println("Po:");

    showAllUsers();

    }

    }//endofclassUser

    Klasa User i usuwanie obiektw z bazy danych

  • Wstp Informacje o db4o Podstawy db4o Cykl ycia obiektw Db4oUtil Zapytania Podsumowanie

    Plan prezentacji

    1 Wstp

    2 Informacje o db4o

    3 Podstawy db4o

    4 Cykl ycia obiektw

    5 Db4oUtil

    6 Zapytania

    7 Podsumowanie

    Marcin Stachniuk Zastosowanie obiektowych baz danych na przykadzie db4o. 26/51

  • Wstp Informacje o db4o Podstawy db4o Cykl ycia obiektw Db4oUtil Zapytania Podsumowanie

    Cykl ycia obiektw

    Marcin Stachniuk Zastosowanie obiektowych baz danych na przykadzie db4o. 27/51

  • Wstp Informacje o db4o Podstawy db4o Cykl ycia obiektw Db4oUtil Zapytania Podsumowanie

    Cykl ycia obiektw

    Marcin Stachniuk Zastosowanie obiektowych baz danych na przykadzie db4o. 28/51

  • Wstp Informacje o db4o Podstawy db4o Cykl ycia obiektw Db4oUtil Zapytania Podsumowanie

    Cykl ycia obiektw

    Marcin Stachniuk Zastosowanie obiektowych baz danych na przykadzie db4o. 29/51

  • Wstp Informacje o db4o Podstawy db4o Cykl ycia obiektw Db4oUtil Zapytania Podsumowanie

    Cykl ycia obiektw

    Marcin Stachniuk Zastosowanie obiektowych baz danych na przykadzie db4o. 30/51

  • Wstp Informacje o db4o Podstawy db4o Cykl ycia obiektw Db4oUtil Zapytania Podsumowanie

    Cykl ycia obiektw

    Marcin Stachniuk Zastosowanie obiektowych baz danych na przykadzie db4o. 31/51

  • Wstp Informacje o db4o Podstawy db4o Cykl ycia obiektw Db4oUtil Zapytania Podsumowanie

    Cykl ycia obiektw

    Marcin Stachniuk Zastosowanie obiektowych baz danych na przykadzie db4o. 32/51

  • Wstp Informacje o db4o Podstawy db4o Cykl ycia obiektw Db4oUtil Zapytania Podsumowanie

    Problem zerwanego poczenia

    Aby zmodyfikowa obiekt, naley pobra go z bazy, zmodyfikowa izachowa, a wszystko to w ramach jednego poczenia z baz.Warto wic podtrzymywa poczenie (przynajmniej przez jakiczas).

    Rozwizanie: Wykorzysta Db4oUtil.

    Db4oUtil.java

    Marcin Stachniuk Zastosowanie obiektowych baz danych na przykadzie db4o. 33/51

    Db4oUtil.java

    packagedb4otutorial;

    importcom.db4o.Db4o;

    importcom.db4o.ObjectContainer;

    importcom.db4o.ObjectServer;

    publicclassDb4oUtil{

    privatestaticStringdatabaseFilename="db4o.yap";

    privatestaticfinalintPORT=0;

    privatestaticObjectServerobjectServer;

    privatestaticfinalThreadLocaldbThreadLocal=newThreadLocal();

    publicstaticObjectContainergetObjectContainer(){

    ObjectContaineroc=(ObjectContainer)dbThreadLocal.get();

    if(oc==null||oc.ext().isClosed()){

    oc=getObjectServer().openClient();

    dbThreadLocal.set(oc);

    }

    returnoc;

    }

    publicstaticvoidcloseObjectContainer(){

    ObjectContaineroc=(ObjectContainer)dbThreadLocal.get();

    dbThreadLocal.set(null);

    if(oc!=null)oc.close();

    }

    privatesynchronizedstaticObjectServergetObjectServer(){

    if(objectServer==null){

    objectServer=getObjectServerForFilename(databaseFilename,PORT);

    }

    returnobjectServer;

    }

    publicstaticvoidshutdown(){

    if(objectServer!=null){

    objectServer.close();

    }

    }

    privatestaticObjectServergetObjectServerForFilename(Stringyapfilename,intport){

    ObjectServerobjectServerFromFile=Db4o.openServer(yapfilename,port);

    returnobjectServerFromFile;

    }

    publicstaticStringgetDatabaseFilename(){

    returndatabaseFilename;

    }

    publicstaticvoidsetDatabaseFilename(StringdatabaseFilename){

    Db4oUtil.databaseFilename=databaseFilename;

    }

    }

    Db4oUtil (aka. The Easiest Way to Get Started With Db4o)

  • Wstp Informacje o db4o Podstawy db4o Cykl ycia obiektw Db4oUtil Zapytania Podsumowanie

    Plan prezentacji

    1 Wstp

    2 Informacje o db4o

    3 Podstawy db4o

    4 Cykl ycia obiektw

    5 Db4oUtil

    6 Zapytania

    7 Podsumowanie

    Marcin Stachniuk Zastosowanie obiektowych baz danych na przykadzie db4o. 34/51

  • Wstp Informacje o db4o Podstawy db4o Cykl ycia obiektw Db4oUtil Zapytania Podsumowanie

    Uycie Db4oUtil.java

    Schemat postpowania z Db4oUtil.java:1 // ustawienie nazwy pliku2 Db4oUtil.setDatabaseFilename(baza.yap);34 // pobranie obiektu ObjectContainer5 ObjectContainer db = Db4oUtil.getObjectContainer();67 // Kolejne operacje...89 // Zamknicie ObjectContainer gdy koniec operacji10 Db4oUtil.closeObjectContainer();1112 // zamkniecie wszystkiego, przy koczeniu aplikacji13 Db4oUtil.shutdown();

    User.java (wersja 6)

    Marcin Stachniuk Zastosowanie obiektowych baz danych na przykadzie db4o. 35/51

    Userv6.java/*

    *Tochangethistemplate,chooseTools|Templates

    *andopenthetemplateintheeditor.

    */

    packagedb4otutorial;

    importcom.db4o.Db4o;

    importcom.db4o.ObjectContainer;

    importcom.db4o.ObjectSet;

    importjava.util.List;

    /**

    *

    *@authorStaszek

    */

    publicclassUser{

    privateStringname;

    privateStringsurname;

    publicStringgetName(){

    returnname;

    }

    publicvoidsetName(Stringname){

    this.name=name;

    }

    publicStringgetSurname(){

    returnsurname;

    }

    publicvoidsetSurname(Stringsurname){

    this.surname=surname;

    }

    @Override

    publicStringtoString(){

    returnname+""+surname;

    }

    publicvoidsave(ObjectContainerdb){

    db.store(this);

    }

    privatestaticObjectSetloadAllUsers(ObjectContainerdb){

    returndb.queryByExample(User.class);

    }

    publicvoiddelete(ObjectContainerdb){

    db.delete(this);

    }

    publicstaticvoidshowUsers(Listlist){

    for(Useru:list){

    System.out.println(u);

    }

    }

    publicstaticvoidmain(String[]args){

    //ustawienienazwypliku

    Db4oUtil.setDatabaseFilename("baza.yap");

    //pobranieobiektuObjectContainer

    ObjectContainerdb=Db4oUtil.getObjectContainer();

    System.out.println("Pobraniewszystkichuytkownikw");

    ObjectSetusers=loadAllUsers(db);

    System.out.println("Wyswietlenieuytkownikow:");

    showUsers(users);

    if(users.hasNext()){

    Useru=users.next();

    u.setName("Noweimie");

    u.save(db);

    System.out.println("Zmienionoimi");

    }

    if(users.hasNext()){

    Useru=users.next();

    u.delete(db);

    System.out.println("usunietousera");

    }

    Useruser=newUser();

    user.setName("Piotr");

    user.setSurname("Nowak");

    user.save(db);

    System.out.println("Uytkownicypomodyfikacji");

    showUsers(users);

    //ZamknicieObjectContainergdykoniecoperacji

    Db4oUtil.closeObjectContainer();

    //zamknieciewszystkiego,przykoczeniuaplikacji

    Db4oUtil.shutdown();

    }

    }//endofclassUser

    Klasa User po refactoringu z wykorzystaniem Db4oUtil

  • Wstp Informacje o db4o Podstawy db4o Cykl ycia obiektw Db4oUtil Zapytania Podsumowanie

    Aktualizacja usuwanych obiektw

    Gdy usuwamy obiekty z ObjectSet, to aby zaktualizowa zbir,trzeba ponownie wykona zapytanie, w celu aktualizacji zbioruobiektw.

    Marcin Stachniuk Zastosowanie obiektowych baz danych na przykadzie db4o. 36/51

  • Wstp Informacje o db4o Podstawy db4o Cykl ycia obiektw Db4oUtil Zapytania Podsumowanie

    Plan prezentacji

    1 Wstp

    2 Informacje o db4o

    3 Podstawy db4o

    4 Cykl ycia obiektw

    5 Db4oUtil

    6 Zapytania

    7 Podsumowanie

    Marcin Stachniuk Zastosowanie obiektowych baz danych na przykadzie db4o. 37/51

  • Wstp Informacje o db4o Podstawy db4o Cykl ycia obiektw Db4oUtil Zapytania Podsumowanie

    Zaawansowane zapytania Native Queries

    Zapytania poprzez Native Queries:

    Rozszerzamy klas com.db4o.query.Predicate

    Przeciamy metod: public boolean match(ExtentType et)

    Wywoujemy: db.query(Predicate predicate);

    Marcin Stachniuk Zastosowanie obiektowych baz danych na przykadzie db4o. 38/51

  • Wstp Informacje o db4o Podstawy db4o Cykl ycia obiektw Db4oUtil Zapytania Podsumowanie

    Zaawansowane zapytania Native Queries

    Przykadowa implementacja Predicate:1 public class NamePredicate extends Predicate{23 private String name;45 public NamePredicate(String name) {6 this.name = name.toLowerCase();7 }89 @Override10 public boolean match(User user) {11 if(user.getName() != null) {12 return user.getName().toLowerCase().startsWith(name);13 }14 return false;15 }16 }

    NamePredicate.java

    Marcin Stachniuk Zastosowanie obiektowych baz danych na przykadzie db4o. 39/51

    NamePredicate.java/*

    *Tochangethistemplate,chooseTools|Templates

    *andopenthetemplateintheeditor.

    */

    packagedb4otutorial;

    importcom.db4o.query.Predicate;

    /**

    *

    *@authorStaszek

    */

    publicclassNamePredicateextendsPredicate{

    privateStringname;

    publicNamePredicate(Stringname){

    this.name=name.toLowerCase();

    }

    @Override

    publicbooleanmatch(Useruser){

    if(user.getName()!=null){

    returnuser.getName().toLowerCase().startsWith(name);

    }

    returnfalse;

    }

    }

    Klasa NamePredicate

  • Wstp Informacje o db4o Podstawy db4o Cykl ycia obiektw Db4oUtil Zapytania Podsumowanie

    Zaawansowane zapytania Native Queries

    Uycie predykatu:1 System.out.println(Wyszukuje wszystkich Janw i jankw);2 ObjectSet users = db.query(new NamePredicate(Jan));34 System.out.println(Znaleziono:);5 showUsers(users);

    User.java (wersja 7)

    Marcin Stachniuk Zastosowanie obiektowych baz danych na przykadzie db4o. 40/51

    Userv7.java/*

    *Tochangethistemplate,chooseTools|Templates

    *andopenthetemplateintheeditor.

    */

    packagedb4otutorial;

    importcom.db4o.Db4o;

    importcom.db4o.ObjectContainer;

    importcom.db4o.ObjectSet;

    importjava.util.List;

    /**

    *

    *@authorStaszek

    */

    publicclassUser{

    privateStringname;

    privateStringsurname;

    publicStringgetName(){

    returnname;

    }

    publicvoidsetName(Stringname){

    this.name=name;

    }

    publicStringgetSurname(){

    returnsurname;

    }

    publicvoidsetSurname(Stringsurname){

    this.surname=surname;

    }

    @Override

    publicStringtoString(){

    returnname+""+surname;

    }

    publicvoidsave(ObjectContainerdb){

    db.store(this);

    }

    privatestaticObjectSetloadAllUsers(ObjectContainerdb){

    returndb.queryByExample(User.class);

    }

    publicvoiddelete(ObjectContainerdb){

    db.delete(this);

    }

    publicstaticvoidshowUsers(Listlist){

    for(Useru:list){

    System.out.println(u);

    }

    }

    publicstaticvoidmain(String[]args){

    //ustawienienazwypliku

    Db4oUtil.setDatabaseFilename("baza.yap");

    //pobranieobiektuObjectContainer

    ObjectContainerdb=Db4oUtil.getObjectContainer();

    Useruser=newUser();

    user.setName("Jan");

    user.setSurname("Kowalski");

    user.save(db);

    user=newUser();

    user.setName("janek");

    user.setSurname("Kowalski");

    user.save(db);

    System.out.println("WyszukujewszystkichJanwijankw");

    ObjectSetusers=db.query(newNamePredicate("Jan"));

    System.out.println("Znaklezono:");

    showUsers(users);

    System.out.println("Wszystkierekordywbazie:");

    users=loadAllUsers(db);

    showUsers(users);

    //ZamknicieObjectContainergdykoniecoperacji

    Db4oUtil.closeObjectContainer();

    //zamknieciewszystkiego,przykoczeniuaplikacji

    Db4oUtil.shutdown();

    }

    }//endofclassUser

    Klasa User pokazujaca dziaanie Native Queries

  • Wstp Informacje o db4o Podstawy db4o Cykl ycia obiektw Db4oUtil Zapytania Podsumowanie

    Podsumowanie Native Queries

    Charakterystyka Native Queries:

    atwo implementacji

    Czasochonne i zasoboerne

    Konieczno przejrzenia wszystkich obiektw z bazy danych

    Jedyne jzyk Java i pomysowo programisty ograniczaskomplikowanie zapytania

    Wolniejsze ni SODA

    Marcin Stachniuk Zastosowanie obiektowych baz danych na przykadzie db4o. 41/51

  • Wstp Informacje o db4o Podstawy db4o Cykl ycia obiektw Db4oUtil Zapytania Podsumowanie

    Sortowanie wynikw

    Implementacja Comparator

    Wywoanie: db.query(Predicate predicate, Comparatorcomparator)

    Marcin Stachniuk Zastosowanie obiektowych baz danych na przykadzie db4o. 42/51

  • Wstp Informacje o db4o Podstawy db4o Cykl ycia obiektw Db4oUtil Zapytania Podsumowanie

    Sortowanie wynikw

    Uycie Comparatora cz. 1:1 public class UserComparator implements Comparator{23 public int compare(User u1, User u2) {4 String surname1 = u1.getSurname();5 String surname2 = u2.getSurname();6 if(surname1 == null || surname2 == null) {7 if(surname1 == null && surname2 != null) {8 return -1;9 } else if(surname1 != null && surname2 == null) {10 return 1;11 } else {12 return compareNames(u1, u2);13 }14 } else {15 if(surname1.equalsIgnoreCase(surname2)) {16 return compareNames(u1, u2);17 } else {18 return surname1.compareToIgnoreCase(surname2);19 }20 }21 }

    Marcin Stachniuk Zastosowanie obiektowych baz danych na przykadzie db4o. 43/51

  • Wstp Informacje o db4o Podstawy db4o Cykl ycia obiektw Db4oUtil Zapytania Podsumowanie

    Sortowanie wynikw

    1 private int compareNames(User u1, User u2) {2 String name1 = u1.getName();3 String name2 = u2.getName();4 if(name1 == null || name2 == null) {5 if(name1 == null && name2 != null) {6 return -1;7 } else if(name1 != null && name2 == null) {8 return 1;9 } else {10 return 0;11 }12 } else {13 if(name1.equalsIgnoreCase(name2)) {14 return 0;15 } else {16 return name1.compareToIgnoreCase(name2);17 }18 }19 }

    UserComparator.javaMarcin Stachniuk Zastosowanie obiektowych baz danych na przykadzie db4o. 44/51

    UserComparator.java/*

    *Tochangethistemplate,chooseTools|Templates

    *andopenthetemplateintheeditor.

    */

    packagedb4otutorial;

    importjava.util.Comparator;

    /**

    *

    *@authorStaszek

    */

    publicclassUserComparatorimplementsComparator{

    publicintcompare(Useru1,Useru2){

    Stringsurname1=u1.getSurname();

    Stringsurname2=u2.getSurname();

    if(surname1==null||surname2==null){

    if(surname1==null&&surname2!=null){

    return-1;

    }elseif(surname1!=null&&surname2==null){

    return1;

    }else{

    returncompareNames(u1,u2);

    }

    }else{

    if(surname1.equalsIgnoreCase(surname2)){

    returncompareNames(u1,u2);

    }else{

    returnsurname1.compareToIgnoreCase(surname2);

    }

    }

    }

    privateintcompareNames(Useru1,Useru2){

    Stringname1=u1.getName();

    Stringname2=u2.getName();

    if(name1==null||name2==null){

    if(name1==null&&name2!=null){

    return-1;

    }elseif(name1!=null&&name2==null){

    return1;

    }else{

    return0;

    }

    }else{

    if(name1.equalsIgnoreCase(name2)){

    return0;

    }else{

    returnname1.compareToIgnoreCase(name2);

    }

    }

    }

    }

    Klasa UserComparator sortujaca obiekty typu User

  • Wstp Informacje o db4o Podstawy db4o Cykl ycia obiektw Db4oUtil Zapytania Podsumowanie

    Zaawansowane zapytania Native Queries

    Uycie sortowania:1 Comparator comp = new UserComparator();2 System.out.println(Wyszukuje wszystkich Janw i jankw (posortowane));3 ObjectSet users = db.query(new NamePredicate(Jan), comp);45 System.out.println(Znaleziono:);6 showUsers(users);78 System.out.println(Odwrotne sortowanie:);9 comp = Collections.reverseOrder(new UserComparator());10 users = db.query(new NamePredicate(Jan), comp);1112 System.out.println(Znaleziono:);13 showUsers(users);

    User.java (wersja 8)

    Marcin Stachniuk Zastosowanie obiektowych baz danych na przykadzie db4o. 45/51

    Userv8.java/*

    *Tochangethistemplate,chooseTools|Templates

    *andopenthetemplateintheeditor.

    */

    packagedb4otutorial;

    importcom.db4o.Db4o;

    importcom.db4o.ObjectContainer;

    importcom.db4o.ObjectSet;

    importjava.util.Collections;

    importjava.util.List;

    /**

    *

    *@authorStaszek

    */

    publicclassUser{

    privateStringname;

    privateStringsurname;

    publicStringgetName(){

    returnname;

    }

    publicvoidsetName(Stringname){

    this.name=name;

    }

    publicStringgetSurname(){

    returnsurname;

    }

    publicvoidsetSurname(Stringsurname){

    this.surname=surname;

    }

    @Override

    publicStringtoString(){

    returnname+""+surname;

    }

    publicvoidsave(ObjectContainerdb){

    db.store(this);

    }

    privatestaticObjectSetloadAllUsers(ObjectContainerdb){

    returndb.queryByExample(User.class);

    }

    publicvoiddelete(ObjectContainerdb){

    db.delete(this);

    }

    publicstaticvoidshowUsers(Listlist){

    for(Useru:list){

    System.out.println(u);

    }

    }

    publicstaticvoidmain(String[]args){

    //ustawienienazwypliku

    Db4oUtil.setDatabaseFilename("baza.yap");

    //pobranieobiektuObjectContainer

    ObjectContainerdb=Db4oUtil.getObjectContainer();

    Useruser=newUser();

    user.setName("Jan");

    user.setSurname("Kowalski");

    user.save(db);

    user=newUser();

    user.setName("janek");

    user.setSurname("Kowalski");

    user.save(db);

    System.out.println("WyszukujewszystkichJanwijankw");

    ObjectSetusers=db.query(newNamePredicate("Jan"),newUserComparator());

    System.out.println("Znaleziono:");

    showUsers(users);

    System.out.println("Odwrotnesortowanie:");

    users=db.query(newNamePredicate("Jan"),Collections.reverseOrder(newUserComparator()));

    System.out.println("Znaleziono:");

    showUsers(users);

    System.out.println("Wszystkierekordywbazie:");

    users=loadAllUsers(db);

    showUsers(users);

    //ZamknicieObjectContainergdykoniecoperacji

    Db4oUtil.closeObjectContainer();

    //zamknieciewszystkiego,przykoczeniuaplikacji

    Db4oUtil.shutdown();

    }

    }//endofclassUser

    Klasa User pokazujaca dziaanie sortowania wynikw

  • Wstp Informacje o db4o Podstawy db4o Cykl ycia obiektw Db4oUtil Zapytania Podsumowanie

    Transakcje

    Uycie transakcji:1 // zatwierdzenie transakcji2 db.commit();34 // wycofanie transakcji, a do ostatniego punktu zatwierdzenia5 db.rollback();

    Marcin Stachniuk Zastosowanie obiektowych baz danych na przykadzie db4o. 46/51

  • Wstp Informacje o db4o Podstawy db4o Cykl ycia obiektw Db4oUtil Zapytania Podsumowanie

    Plan prezentacji

    1 Wstp

    2 Informacje o db4o

    3 Podstawy db4o

    4 Cykl ycia obiektw

    5 Db4oUtil

    6 Zapytania

    7 Podsumowanie

    Marcin Stachniuk Zastosowanie obiektowych baz danych na przykadzie db4o. 47/51

  • Wstp Informacje o db4o Podstawy db4o Cykl ycia obiektw Db4oUtil Zapytania Podsumowanie

    Czego si dzisiaj nauczylimy?

    Czym jest obiektowa baza danych db4o i jak jej uywa.

    Wykorzystanie narzdzia Db4oUtil.java

    Zapisywanie, modyfikacja obiektw: db.store(...)

    Usuwanie obiektw: db.delete(...)

    Wyszukiwanie Query By Example: db.queryByExample(...)

    Wyszukiwanie za pomoc NativeQuery: db.query(...)

    Sortowanie wynikw: db.query(...) i Comparator

    Transakcje db.commit(), db.rollback()

    Marcin Stachniuk Zastosowanie obiektowych baz danych na przykadzie db4o. 48/51

  • Wstp Informacje o db4o Podstawy db4o Cykl ycia obiektw Db4oUtil Zapytania Podsumowanie

    Wicej informacji

    Strona projektu http://www.db4o.com/

    Developer Community http://developer.db4o.com/

    Object Manager 7.4 http://code.google.com/p/db4o-om/

    db4o Tutorial for Javahttp://www.db4o.com/about/productinformation/resources/db4o-7.4-tutorial-java.pdf

    Db4oUtil (aka. The Easiest Way to Get Started With Db4o)http://developer.db4o.com/Projects/useful_snippets/db4outil_aka._the_easiest_way_to_get_started_with_db4o.htmlhttp://www.spaceprogram.com/knowledge/2006/07/db4outil-aka-easiest-way-to-get.html

    Najpopularniejsze imiona i nazwiska w Polsce w 2009 rokuhttp://www.mswia.gov.pl/portal.php?serwis=pl&dzial=87&id=3057&search=74623

    Marcin Stachniuk Zastosowanie obiektowych baz danych na przykadzie db4o. 49/51

    http://www.db4o.com/http://developer.db4o.com/http://code.google.com/p/db4o-om/http://www.db4o.com/about/productinformation/resources/db4o-7.4-tutorial-java.pdfhttp://developer.db4o.com/Projects/useful_snippets/db4outil_aka._the_easiest_way_to_get_started_with_db4o.htmlhttp://developer.db4o.com/Projects/useful_snippets/db4outil_aka._the_easiest_way_to_get_started_with_db4o.htmlhttp://www.spaceprogram.com/knowledge/2006/07/db4outil-aka-easiest-way-to-get.htmlhttp://www.mswia.gov.pl/portal.php?serwis=pl&dzial=87&id=3057&search=74623

  • Wstp Informacje o db4o Podstawy db4o Cykl ycia obiektw Db4oUtil Zapytania Podsumowanie

    Pytania

    Pytania?

    Marcin Stachniuk Zastosowanie obiektowych baz danych na przykadzie db4o. 50/51

  • Wstp Informacje o db4o Podstawy db4o Cykl ycia obiektw Db4oUtil Zapytania Podsumowanie

    Dzikuj

    Dzikuj

    Marcin Stachniuk Zastosowanie obiektowych baz danych na przykadzie db4o. 51/51

    WstepInformacje o db4oPodstawy db4oCykl zycia obiektwDb4oUtilZapytaniaPodsumowanie