{"id":617,"date":"2020-04-25T08:37:25","date_gmt":"2020-04-25T08:37:25","guid":{"rendered":"https:\/\/www.juniorjavadeveloper.pl\/?p=617"},"modified":"2023-12-12T14:50:34","modified_gmt":"2023-12-12T14:50:34","slug":"pierwsza-klasa-jako-serwis-crud-kod-java-intellij-krok-po-kroku","status":"publish","type":"post","link":"https:\/\/www.juniorjavadeveloper.pl\/en\/2020\/04\/25\/pierwsza-klasa-jako-serwis-crud-kod-java-intellij-krok-po-kroku\/","title":{"rendered":"Pierwsza klasa jako serwis CRUD &#8211; kod Java, IntelliJ, krok po kroku"},"content":{"rendered":"<p class=\"wp-block-paragraph\">Przyszed\u0142 czas na po\u0142\u0105czenie ca\u0142ej zdobytej wiedzy i stworzenie pierwszego serwisu opartego na <a rel=\"noreferrer noopener\" href=\"https:\/\/pl.wikipedia.org\/wiki\/CRUD\" target=\"_blank\">CRUD<\/a>. Pisz\u0105c serwis nie mam namy\u015bli serwisu www, chodzi o klas\u0119, kt\u00f3ra ma specjalne przeznaczenie i zawiera operacje CRUD &#8211; Create, Read, Update, Delete. <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Bardzo wiele aplikacji jest tzw. CRUD&#8217;ami, czyli udost\u0119pnia podstawowe operacje tworzenia (create), odczytu (read), modyfikacji (update) oraz usuwania (delete) obiekt\u00f3w jakiej\u015b klasy. Dla przyk\u0142adu we\u017amy katalog samochod\u00f3w, gdzie mamy klas\u0119 Car.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Poni\u017cej operacje CRUD dla klasy Car:<br>&#8211; CREATE &#8211; dodawanie samochodu do katalogu,<br>&#8211; READ &#8211; odczytanie szczeg\u00f3\u0142\u00f3w samochodu z katalogu,<br>&#8211; UPDATE &#8211; zmiana, modyfikacja informacji o samochodzie w katalogu,<br>&#8211; DELETE &#8211; usuni\u0119cie samochodu z katalogu.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Dodatkowo z CRUD&#8217;em zwi\u0105zana jest metoda list(), zwracaj\u0105ca list\u0119 wszystkich obiekt\u00f3w, na kt\u00f3rych operuje CRUD, czyli w naszym przypadku metoda list() zwr\u00f3ci list\u0119 wszystkich samochod\u00f3w w katalogu.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">W poprzednich artyku\u0142ach opisa\u0142em teori\u0119 i pokaza\u0142em przyk\u0142ady kodu dotycz\u0105ce tworzenia <a rel=\"noreferrer noopener\" href=\"https:\/\/www.juniorjavadeveloper.pl\/en\/2020\/03\/07\/pierwsza-klasa-kod-java-intellij-krok-po-kroku\/\" target=\"_blank\">pierwszej klasy w j\u0119zyku Java<\/a>, jak i gdzie zapisa\u0107 <a rel=\"noreferrer noopener\" href=\"https:\/\/www.juniorjavadeveloper.pl\/en\/2020\/03\/14\/wartosci-w-pierwszej-klasie-kod-java-intellij-krok-po-kroku\/\" target=\"_blank\">warto\u015bci w klasie<\/a>, jak wykonywa\u0107 <a rel=\"noreferrer noopener\" href=\"https:\/\/www.juniorjavadeveloper.pl\/en\/2020\/03\/21\/dzialania-w-pierwszej-klasie-kod-java-intellij-krok-po-kroku\/\" target=\"_blank\">dzia\u0142ania na klasie<\/a>, jak <a rel=\"noreferrer noopener\" aria-label=\"ukry\u0107 kod klasy (otwiera si\u0119 na nowej zak\u0142adce)\" href=\"https:\/\/www.juniorjavadeveloper.pl\/en\/2020\/03\/31\/ukrywamy-hermetyzujemy-nasz-kod-w-klasie-kod-java-intellij-krok-po-kroku\/\" target=\"_blank\">ukry\u0107 kod klasy<\/a> przed niepowo\u0142anym dost\u0119pem oraz przedstawi\u0142em <a rel=\"noreferrer noopener\" aria-label=\"tablice i listy (otwiera si\u0119 na nowej zak\u0142adce)\" href=\"https:\/\/www.juniorjavadeveloper.pl\/en\/2020\/04\/11\/tablice-i-listy-kod-java-intellij-krok-po-kroku\/\" target=\"_blank\">tablice i listy<\/a> w j\u0119zyku Java. Te pi\u0119\u0107 artyku\u0142\u00f3w jest niezb\u0119dne do stworzenia serwisu z operacjami CRUD.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Zanim zaczn\u0119 pisa\u0107 dlaczego w og\u00f3le stosowa\u0107 CRUD i dlaczego jest on tak wa\u017cny poni\u017cej przedstawi\u0119 klas\u0119 Java, kt\u00f3ra jest CRUD&#8217;em, pos\u0142u\u017cy nam jako szablon dla innych klas b\u0119d\u0105cych CRUD&#8217;ami. Oczywi\u015bcie poni\u017csza klasa nic nie robi, zawiera tylko metody, kt\u00f3re nie przyjmuj\u0105 \u017cadnych parametr\u00f3w, ani nie zwracaj\u0105 \u017cadnej warto\u015bci.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"java\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ CRUD - template class\npublic class CrudServiceTemplate {\n    \/\/ C - create\n    public void create() {\n    }\n    \/\/ R - read\n    public void read() {\n    }\n    \/\/ U - update\n    public void update() {\n    }\n    \/\/ D - delete\n    public void delete() {\n    }\n    \/\/ L - list\n    public void list() {\n    }\n}<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">CRUD jest nierozerwalnie zwi\u0105zany z klas\u0105, dla kt\u00f3rej wykonywane s\u0105 operacje, \u017ceby mie\u0107 poprawny i funkcjonalny CRUD potrzebujemy jeszcze jednej klasy. Klasy, na kt\u00f3rych operuje CRUD s\u0105 po prostu zwyk\u0142ymi <a rel=\"noreferrer noopener\" aria-label=\"POJO (otwiera si\u0119 na nowej zak\u0142adce)\" href=\"https:\/\/en.wikipedia.org\/wiki\/POJO\" target=\"_blank\">POJO<\/a>, czyli klasami, kt\u00f3re maj\u0105 atrybuty\/zmienne\/pola do tego konstruktory i metody get\/set. Takie klasy cz\u0119sto s\u0105 okre\u015blane mianem: model, encja, <a href=\"https:\/\/en.wikipedia.org\/wiki\/Data_transfer_object\" target=\"_blank\" rel=\"noreferrer noopener\" aria-label=\"DTO (otwiera si\u0119 na nowej zak\u0142adce)\">DTO<\/a>, <a href=\"https:\/\/en.wikipedia.org\/wiki\/Value_object\" target=\"_blank\" rel=\"noreferrer noopener\" aria-label=\"VO (otwiera si\u0119 na nowej zak\u0142adce)\">VO<\/a>.<\/p>\n\n\n\n<p class=\"has-text-align-center wp-block-paragraph\">Poni\u017cej przyk\u0142ad klasy, z kt\u00f3rej b\u0119dzie korzysta\u0142 CRUD.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"java\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public class Car {\n    private int year;\n    private String model;\n    private String manufacturer;\n    private BigDecimal price;\n\n    \/\/ constructors\n    \/\/ getters\/setters\n    \/\/ toString()\n}<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Maj\u0105c powy\u017csz\u0105 klas\u0119 Car oraz szablon dla klas z CRUD (CrudServiceTemplate) stworzymy klas\u0119 b\u0119d\u0105c\u0105 serwisem, czyli zawieraj\u0105c\u0105 logik\u0119 odno\u015bnie CRUD&#8217;a dla klasy Car. Nale\u017cy zauwa\u017cy\u0107, \u017ce nie ma ju\u017c potrzeby dodawania w nazwie klasy s\u0142owa Crud. Poni\u017cej wspomniana klasa, na razie zwraca ona warto\u015bci null dla czytelno\u015bci kodu.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"java\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ CRUD Service dla klasy Car\npublic class CarService {\n\n    \/\/ lista przechowuj\u0105ca wszystkie samochody\n    \/\/ tylko i wy\u0142\u0105cznie dla uproszczenia kodu aplikacji\n    \/\/ docelowo dane powinny by\u0107 przechowywane w bazie danych\n    private List&lt;Car> carsCatalog = new ArrayList&lt;>();\n\n    \/\/ C - create\n    public Car create(Car car) {\n        return null;\n    }\n    \/\/ R - read\n    public Car read(Integer id) {\n        return null;\n    }\n    \/\/ U - update\n    public Car update(Integer id, Car car) {\n        return null;\n    }\n    \/\/ D - delete\n    public void delete(Integer id) {\n    }\n    \/\/ L - list\n    public List&lt;Car> list() {\n        return null;\n    }\n}<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">CRUD jest wa\u017cny poniewa\u017c systematyzuje i grupuje w jednym miejscu operacje, kt\u00f3re mo\u017cna wykona\u0107 na klasie b\u0119d\u0105cej, np. modelem. CRUD mo\u017cna zastosowa\u0107 dla wielu klas w tym samym projekcie. Dzi\u0119ki zastosowaniu CRUD w kontek\u015bcie serwisu, klasy Service separujemy dane zawarte w np. modelu od logiki aplikacji, kt\u00f3ra u\u017cywa tego modelu.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Poni\u017cej opisz\u0119 oddzielnie ka\u017cd\u0105 metod\u0119 z CRUD dla klasy CarService, a na koniec przedstawi\u0119 ca\u0142\u0105 klas\u0119 z pe\u0142n\u0105 implementacj\u0105 logiki biznesowej wraz z u\u017cyciem klasy CarService.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Nale\u017cy zauwa\u017cy\u0107, \u017ce CarService jest uproszczon\u0105 wersj\u0105, kt\u00f3ra zak\u0142ada przechowywanie wynik\u00f3w operacji metod CRUD na li\u015bcie obiekt\u00f3w <strong>private List&lt;Car&gt; carsCatalog;<\/strong> &#8211; katalogu samochod\u00f3w &#8211; docelowo dane powinny by\u0107 przechowywane w bazie danych. Na potrzeby tego przyk\u0142adu <strong>private List&lt;Car&gt; carsCatalog;<\/strong> b\u0119dzie symulowa\u0107 baz\u0119 danych.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Symuluj\u0105c baz\u0119 danych za pomoc\u0105 <strong>private List&lt;Car&gt; carsCatalog;<\/strong> musimy pami\u0119ta\u0107 o tym, \u017ce w bazie danych ka\u017cdy wiersz powinien mie\u0107 unikalny identyfikator, osi\u0105gniemy, to za pomoc\u0105 <strong>private Random randomCarId;<\/strong>. <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Dlaczego operujemy na unikalnych identyfikatorach? Poniewa\u017c mo\u017ce by\u0107 wiele takich samych samochod\u00f3w, tzn. ich marka, model, rok produkcji b\u0119d\u0105 identyczne. Dlatego musimy wprowadzi\u0107 unikalny identyfikator, taki identyfikator jest standardow\u0105 praktyk\u0105.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Poni\u017cej przyk\u0142ad listy samochod\u00f3w &#8211; katalogu samochod\u00f3w &#8211; z unikalnymi identyfikatorami.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"\"><thead><tr><th class=\"has-text-align-center\" data-align=\"center\">id<\/th><th class=\"has-text-align-center\" data-align=\"center\">year<\/th><th class=\"has-text-align-center\" data-align=\"center\">model<\/th><th class=\"has-text-align-center\" data-align=\"center\">manufacturer<\/th><th class=\"has-text-align-center\" data-align=\"center\">price<\/th><\/tr><\/thead><tbody><tr><td class=\"has-text-align-center\" data-align=\"center\">1<\/td><td class=\"has-text-align-center\" data-align=\"center\">2016<\/td><td class=\"has-text-align-center\" data-align=\"center\">Model X<\/td><td class=\"has-text-align-center\" data-align=\"center\">Tesla<\/td><td class=\"has-text-align-center\" data-align=\"center\">340 000 z\u0142<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">4<\/td><td class=\"has-text-align-center\" data-align=\"center\">2009<\/td><td class=\"has-text-align-center\" data-align=\"center\">Corolla<\/td><td class=\"has-text-align-center\" data-align=\"center\">Toyota<\/td><td class=\"has-text-align-center\" data-align=\"center\">33 000 z\u0142<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">99<\/td><td class=\"has-text-align-center\" data-align=\"center\">2020<\/td><td class=\"has-text-align-center\" data-align=\"center\">XC 90<\/td><td class=\"has-text-align-center\" data-align=\"center\">Volvo<\/td><td class=\"has-text-align-center\" data-align=\"center\">300 000 z\u0142<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"> <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Poni\u017cej szczeg\u00f3\u0142owy opis ka\u017cdej z metod z CRUD. Nale\u017cy zauwa\u017cy\u0107, \u017ce nad ka\u017cd\u0105 metod\u0105 jest specjalny komentarz w postaci <strong>\/** Tre\u015b\u0107 komentarza *\/<\/strong> jest, to <a href=\"https:\/\/www.oracle.com\/technetwork\/java\/javase\/documentation\/index-137868.html\" target=\"_blank\" rel=\"noreferrer noopener\" aria-label=\"Javadoc (otwiera si\u0119 na nowej zak\u0142adce)\">Javadoc<\/a>, specjalna forma komentarza, kt\u00f3ra jest rozpoznawana przez IDE takie jak IntelliJ i wy\u015bwietlane w postaci Tooltip oraz s\u0142u\u017cy do tworzenia dokumentacji do projektu. Dla przyk\u0142adu <a rel=\"noreferrer noopener\" aria-label=\"dokumentacja klasy Object (otwiera si\u0119 na nowej zak\u0142adce)\" href=\"https:\/\/docs.oracle.com\/javase\/10\/docs\/api\/java\/lang\/Object.html\" target=\"_blank\">dokumentacja klasy Object<\/a> jest wygenerowana z Javadoc.<\/p>\n\n\n<!DOCTYPE html PUBLIC \"-\/\/W3C\/\/DTD HTML 4.0 Transitional\/\/EN\" \"http:\/\/www.w3.org\/TR\/REC-html40\/loose.dtd\">\n<html><body><div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><a href=\"https:\/\/www.juniorjavadeveloper.pl\/wp-content\/uploads\/2020\/04\/Java-CRUD_Tooltip-Javadoc-s.png\" target=\"_blank\" rel=\"noreferrer noopener\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"559\" src=\"https:\/\/www.juniorjavadeveloper.pl\/wp-content\/uploads\/2020\/04\/Java-CRUD_Tooltip-Javadoc-s-1024x559.png\" alt=\"Javadoc Tooltip - Pierwsza klasa jako serwis CRUD \u2013 kod Java, IntelliJ, krok po kroku\" class=\"wp-image-717\" srcset=\"https:\/\/www.juniorjavadeveloper.pl\/wp-content\/uploads\/2020\/04\/Java-CRUD_Tooltip-Javadoc-s-1024x559.png 1024w, https:\/\/www.juniorjavadeveloper.pl\/wp-content\/uploads\/2020\/04\/Java-CRUD_Tooltip-Javadoc-s-300x164.png 300w, https:\/\/www.juniorjavadeveloper.pl\/wp-content\/uploads\/2020\/04\/Java-CRUD_Tooltip-Javadoc-s-768x419.png 768w, https:\/\/www.juniorjavadeveloper.pl\/wp-content\/uploads\/2020\/04\/Java-CRUD_Tooltip-Javadoc-s-1536x838.png 1536w, https:\/\/www.juniorjavadeveloper.pl\/wp-content\/uploads\/2020\/04\/Java-CRUD_Tooltip-Javadoc-s-1600x873.png 1600w, https:\/\/www.juniorjavadeveloper.pl\/wp-content\/uploads\/2020\/04\/Java-CRUD_Tooltip-Javadoc-s-1000x546.png 1000w, https:\/\/www.juniorjavadeveloper.pl\/wp-content\/uploads\/2020\/04\/Java-CRUD_Tooltip-Javadoc-s-800x437.png 800w, https:\/\/www.juniorjavadeveloper.pl\/wp-content\/uploads\/2020\/04\/Java-CRUD_Tooltip-Javadoc-s-600x328.png 600w, https:\/\/www.juniorjavadeveloper.pl\/wp-content\/uploads\/2020\/04\/Java-CRUD_Tooltip-Javadoc-s-400x218.png 400w, https:\/\/www.juniorjavadeveloper.pl\/wp-content\/uploads\/2020\/04\/Java-CRUD_Tooltip-Javadoc-s.png 1920w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption>Javadoc Tooltip &#8211; Pierwsza klasa jako serwis CRUD \u2013 kod Java, IntelliJ, krok po kroku<\/figcaption><\/figure><\/div>\n<\/body><\/html>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>C &#8211; Create &#8211; tworzenie samochodu za pomoc\u0105 serwisu.<\/strong><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"java\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/**\n * C - create - tworzy\/zapisuje samoch\u00f3d do katalogu\n * @param car Dane samochodu do utworzenia\/zapisania w katalogu\n * @return Utworzony samoch\u00f3d z unikalnym identyfikatorem\n *\/\npublic Car create(Car car) {\n    \/\/ generowanie unikalnego identyfikatora samochodu\n    int id = randomCarId.nextInt(100_000);\n    \/\/ ustawienie unikalnego identyfikatora dla samochodu\n    car.setId(id);\n\n    \/\/ dodanie nowego samochodu do katalogu\n    carsCatalog.add(car);\n    \/\/ zwr\u00f3cenie utworzonego samochodu z unikalnym identyfikatorem\n    return car;\n}<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>R &#8211; Read &#8211; odczytywanie samochodu za pomoc\u0105 serwisu.<\/strong><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"java\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/**\n * R - read - odczytuje\/wyszukuje samoch\u00f3d z katalogu\n * @param id Unikalny identyfikator samochodu w katalogu\n * @return Odczytany z katalogu samoch\u00f3d\n *\/\npublic Car read(Integer id) {\n    \/\/ iterujemy po li\u015bcie\/katlogu samachod\u00f3w\n    for (Car car : carsCatalog) {\n        \/\/ dla ka\u017cdego samochodu w katalogu ...\n        \/\/ ... sprawdzamy czy identyfiktory zgadzaj\u0105 si\u0119\n        if (car.getId().equals(id)) {\n            \/\/ je\u017celi identyfikatory s\u0105 zgodne, to ...\n            \/\/ ... zwracamy wyszukany\/odczytany samoch\u00f3d\n            return car;\n        }\n    }\n    \/\/ je\u017celi nie znaleziono szukanego samochodu zwracamy null\n    return null;\n}<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>U &#8211; Update &#8211; modyfikacja danych samochodu za pomoc\u0105 serwisu.<\/strong><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"java\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/**\n * U - update - modyfikuje dane samochodu w katalogu.\n * @param id Identyfikator samochodu do modyfikacji danych\n * @param carUpdate Aktualne\/nowe dane samochodu\n * @return Zmodyfikowany samoch\u00f3d w katalogu\n *\/\npublic Car update(Integer id, Car carUpdate) {\n    \/\/ iterujemy po li\u015bcie\/katlogu samachod\u00f3w\n    for (Car car : carsCatalog) {\n        \/\/ dla ka\u017cdego samochodu w katalogu ...\n        \/\/ ... sprawdzamy czy identyfiktory zgadzaj\u0105 si\u0119\n        if (car.getId().equals(id)) {\n            \/\/ je\u017celi identyfikatory s\u0105 zgodne, to ...\n            \/\/ ... modyfikujemy dane samochodu ...\n            car.setYear(carUpdate.getYear());\n            car.setModel(carUpdate.getModel());\n            car.setManufacturer(carUpdate.getManufacturer());\n            car.setPrice(carUpdate.getPrice());\n            \n            \/\/ ... zwracamy zmodyfikowany samoch\u00f3d \n            return car;\n        }\n    }\n    \/\/ je\u017celi nie znaleziono szukanego samochodu zwracamy null\n    return null;\n}<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>D &#8211; Delete &#8211; usuwanie samochodu za pomoc\u0105 serwisu.<\/strong><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"java\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/**\n * D - delete - usuwa samoch\u00f3d z katalogu.\n * @param id Identyfikator samochodu do usuni\u0119cia z katalogu.\n *\/\npublic void delete(Integer id) {\n    \/\/ tworzymy Iterator dla naszej listy,\n    \/\/ aby unikn\u0105\u0107 wyj\u0105tku ConcurrentModificationException \n    \/\/ podczas jednoczesnego iterowania po li\u015bcie\n    \/\/ i usuwania z niej element\u00f3w\n    Iterator&lt;Car> iterator = carsCatalog.iterator();\n    \/\/ wykonujemy operacje dop\u00f3ki Iterator ma kolejne elementy\n    while (iterator.hasNext()) {\n        \/\/ pobieramy kolejny element\n        Car car = iterator.next();\n        \/\/ je\u017celi identyfikatory s\u0105 zgodne, to ...\n        if (car.getId().equals(id)) {\n            \/\/ ... usuwamy samoch\u00f3d z listy\n            iterator.remove();\n        }\n    }\n}<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Przyszed\u0142 czas na u\u017cycie powy\u017cszych metod, tak jak wida\u0107 powsta\u0142o bardzo du\u017co kodu, kt\u00f3ry jeszcze nie zosta\u0142 u\u017cyty i nie wiadomo czy spe\u0142nia nasze oczekiwania i czy w og\u00f3le dzia\u0142a. Oczywi\u015bcie w prawdziwym projekcie powsta\u0142yby najpierw testy jednostkowe zgodnie z <a rel=\"noreferrer noopener\" aria-label=\"TDD (otwiera si\u0119 na nowej zak\u0142adce)\" href=\"https:\/\/en.wikipedia.org\/wiki\/Test-driven_development\" target=\"_blank\">TDD<\/a>. Na potrzeby przyk\u0142ad\u00f3w dla os\u00f3b dopiero zaczynaj\u0105cych przygod\u0119 z j\u0119zykiem Java powy\u017cszy kod jest wystarczaj\u0105cy.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"java\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">    public static void main(String[] args) {\n        System.out.println(\"Katalog samochod\u00f3w z wykorzystaniem CarService - CRUD'a\");\n\n        \/\/ stworzenie obiektu b\u0119d\u0105cego CRUD'em\n        CarService carService = new CarService();\n\n        System.out.println(\"Zawarto\u015b\u0107 katalogu samochod\u00f3w przed dodanie zawarto\u015bci\");\n        List&lt;Car> carsCatalog = carService.list();\n        System.out.println(carsCatalog + \"\\n\");\n\n        System.out.println(\"Dodanie jednego samochodu do katalogu\");\n        Car toyotaCorollaCar = new Car(2009, \"Corolla\", \"Toyota\", BigDecimal.valueOf(33_000.00));\n        System.out.println(\"Samoch\u00f3d poza katalogie nie posiada unikalnego identyfikatora\");\n        System.out.println(toyotaCorollaCar);\n        Car createdToyotaCorollaCar = carService.create(toyotaCorollaCar);\n        System.out.println(\"Utworzony\/dodany samoch\u00f3d w katalogu posiada unikalny identyfikator\");\n        System.out.println(createdToyotaCorollaCar + \"\\n\");\n\n        System.out.println(\"Zawarto\u015b\u0107 katalogu samochod\u00f3w po dodaniu jednego samochodu\");\n        System.out.println(carService.list() + \"\\n\");\n\n        System.out.println(\"Dodanie kolejnego samochodu do katalogu\");\n        Car teslaModelXCar = new Car(2016, \"Model X\", \"Tesla\", BigDecimal.valueOf(340_000.00));\n        carService.create(teslaModelXCar);\n\n        System.out.println(\"Zawarto\u015b\u0107 katalogu samochod\u00f3w po dodaniu kolejnego samochodu\");\n        System.out.println(carService.list() + \"\\n\");\n\n        System.out.println(\"Modyfikacja danych samochodu z katalogu\");\n        \/\/ ... najpierw pobieramy katalog samochod\u00f3w, aby zna\u0107 identyfikatory samochod\u00f3w ...\n        List&lt;Car> carsCatalogUpdate = carService.list();\n        \/\/ ... wybieramy pierwszy samoch\u00f3d do modyfikacji danych ...\n        Integer firstCarId = carsCatalogUpdate.get(0).getId();\n        Car firstCar = carService.read(firstCarId);\n        System.out.println(\"Dane samochodu do modyfikacji: \" + firstCar);\n        \/\/ ... podajemy nowe dane samochodu ...\n        Car firstCarUpdate = new Car();\n        firstCarUpdate.setId(firstCar.getId());\n        firstCarUpdate.setYear(firstCar.getYear());\n        firstCarUpdate.setModel(\"Corolla Sport\");\n        firstCarUpdate.setManufacturer(firstCar.getManufacturer());\n        firstCarUpdate.setPrice(BigDecimal.valueOf(35_000.00));\n        System.out.println(\"Dane samochodu po modyfikacji: \" + firstCarUpdate);\n        System.out.println(\"W katlogu jeszcze s\u0105 stare dane\");\n        System.out.println(carsCatalog + \"\\n\");\n        \/\/ ... identyfikator samochodu jest przekazywany do metody update() ...\n        Integer firstCarToUpdateId = firstCar.getId();\n        \/\/ ... aktulizujemy dane samochodu w katalogu za pomoc\u0105 serwisu ...\n        Car update = carService.update(firstCarToUpdateId, firstCarUpdate);\n\n        System.out.println(\"W katlogu s\u0105 ju\u017c nowe dane\");\n        System.out.println(carsCatalog + \"\\n\");\n\n        \/\/ ... usuwamy jedne samoch\u00f3d z katalogu ...\n        \/\/ ... najpierw pobieramy katalog samochod\u00f3w, aby zna\u0107 identyfikatory samochod\u00f3w ...\n        List&lt;Car> carsCatalogDelete = carService.list();\n        \/\/ .. usuwamy samoch\u00f3d za pomoc\u0105 serwisu ...\n        Car firstCarToDelete = carsCatalogDelete.get(0);\n        Integer firstCarToDeleteId = firstCarToDelete.getId();\n        carService.delete(firstCarToDeleteId);\n\n        System.out.println(\"Samoch\u00f3d zosta\u0142 usuni\u0119ty z katalogu\");\n        System.out.println(carsCatalog + \"\\n\");\n    }\n}<\/pre>\n\n\n<!DOCTYPE html PUBLIC \"-\/\/W3C\/\/DTD HTML 4.0 Transitional\/\/EN\" \"http:\/\/www.w3.org\/TR\/REC-html40\/loose.dtd\">\n<html><body><div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><a href=\"https:\/\/www.juniorjavadeveloper.pl\/wp-content\/uploads\/2020\/04\/Java-CRUD_konsola-wynik.png\" target=\"_blank\" rel=\"noreferrer noopener\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"576\" src=\"https:\/\/www.juniorjavadeveloper.pl\/wp-content\/uploads\/2020\/04\/Java-CRUD_konsola-wynik-1024x576.png\" alt=\"Wynik dzia\u0142ania klasy CarServiceMain - Pierwsza klasa jako serwis CRUD \u2013 kod Java, IntelliJ, krok po kroku\" class=\"wp-image-723\" srcset=\"https:\/\/www.juniorjavadeveloper.pl\/wp-content\/uploads\/2020\/04\/Java-CRUD_konsola-wynik-1024x576.png 1024w, https:\/\/www.juniorjavadeveloper.pl\/wp-content\/uploads\/2020\/04\/Java-CRUD_konsola-wynik-300x169.png 300w, https:\/\/www.juniorjavadeveloper.pl\/wp-content\/uploads\/2020\/04\/Java-CRUD_konsola-wynik-768x432.png 768w, https:\/\/www.juniorjavadeveloper.pl\/wp-content\/uploads\/2020\/04\/Java-CRUD_konsola-wynik-1536x864.png 1536w, https:\/\/www.juniorjavadeveloper.pl\/wp-content\/uploads\/2020\/04\/Java-CRUD_konsola-wynik-1600x900.png 1600w, https:\/\/www.juniorjavadeveloper.pl\/wp-content\/uploads\/2020\/04\/Java-CRUD_konsola-wynik-1000x563.png 1000w, https:\/\/www.juniorjavadeveloper.pl\/wp-content\/uploads\/2020\/04\/Java-CRUD_konsola-wynik-800x450.png 800w, https:\/\/www.juniorjavadeveloper.pl\/wp-content\/uploads\/2020\/04\/Java-CRUD_konsola-wynik-600x338.png 600w, https:\/\/www.juniorjavadeveloper.pl\/wp-content\/uploads\/2020\/04\/Java-CRUD_konsola-wynik-400x225.png 400w, https:\/\/www.juniorjavadeveloper.pl\/wp-content\/uploads\/2020\/04\/Java-CRUD_konsola-wynik.png 1920w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption>Wynik dzia\u0142ania klasy CarServiceMain &#8211; Pierwsza klasa jako serwis CRUD \u2013 kod Java, IntelliJ, krok po kroku<\/figcaption><\/figure><\/div>\n<\/body><\/html>\n\n\n\n<p class=\"wp-block-paragraph\">Ca\u0142o\u015b\u0107 kodu mo\u017cna znale\u017a\u0107 na:<\/p>\n\n\n<div class=\"github-embed github-embed-repository github-logo-mark\">\n<p>        <a href=\"https:\/\/github.com\/juniorjavadeveloper-pl\/java-first-class-crud-service\" target=\"_blank\">\t\t\t<strong>\t\t\t\tThis project shows how the CRUD works in Java, and how to use it as a service.\t\t\t<\/strong>\t\t<\/a>\t\t<br \/>        <a href=\"https:\/\/github.com\/juniorjavadeveloper-pl\/java-first-class-crud-service\" target=\"_blank\">https:\/\/github.com\/juniorjavadeveloper-pl\/java-first-class-crud-service<\/a><br \/>        <a href=\"https:\/\/github.com\/juniorjavadeveloper-pl\/java-first-class-crud-service\/network\" target=\"_blank\">1<\/a> forks.<br \/>        <a href=\"https:\/\/github.com\/juniorjavadeveloper-pl\/java-first-class-crud-service\/stargazers\" target=\"_blank\">0<\/a> stars.<br \/>        <a href=\"https:\/\/github.com\/juniorjavadeveloper-pl\/java-first-class-crud-service\/issues\" target=\"_blank\">0<\/a> open issues.        <\/p>\n<details open>\n<summary>Recent commits:<\/summary>\n<ul class=\"github_commits\">\n<li class=\"github_commit\">                        <a href=\"https:\/\/github.com\/juniorjavadeveloper-pl\/java-first-class-crud-service\/commit\/c095c5ca6bbeaa8f136768292170e7d6befd1b52\" target=\"_blank\">Invoke read() method. Fix id&#039;s.<\/a>, Junior Java Developer Mentor                    <\/li>\n<li class=\"github_commit\">                        <a href=\"https:\/\/github.com\/juniorjavadeveloper-pl\/java-first-class-crud-service\/commit\/f40a3e6f5d1184c77a265cbbaa4111d4c4788a34\" target=\"_blank\">Crud Service usage example.<\/a>, Junior Java Developer Mentor                    <\/li>\n<li class=\"github_commit\">                        <a href=\"https:\/\/github.com\/juniorjavadeveloper-pl\/java-first-class-crud-service\/commit\/08a46ffb34da068676497cab7c1a84ce1171ae71\" target=\"_blank\">Initial commit<\/a>, GitHub                    <\/li>\n<\/ul>\n<\/details>\n<\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Zapraszam do regularnego odwiedzania mojej strony, b\u0119d\u0105 pojawia\u0107 si\u0119 kolejne artyku\u0142y oraz do kontaktu przez email kontakt(at)juniorjavadeveloper.pl.<\/p>","protected":false},"excerpt":{"rendered":"<p>Przyszed\u0142 czas na po\u0142\u0105czenie ca\u0142ej zdobytej wiedzy i stworzenie pierwszego serwisu opartego na CRUD. Pisz\u0105c serwis nie mam namy\u015bli serwisu www, chodzi o klas\u0119, kt\u00f3ra ma specjalne przeznaczenie i zawiera operacje CRUD &#8211; Create, Read, Update, Delete. Bardzo wiele aplikacji jest tzw. CRUD&#8217;ami, czyli udost\u0119pnia podstawowe operacje tworzenia (create), odczytu (read), modyfikacji (update) oraz usuwania [&hellip;]<\/p>","protected":false},"author":1,"featured_media":701,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_ppp_document_settings_meta":"","footnotes":"","jetpack_publicize_message":"","jetpack_is_tweetstorm":false,"jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":false,"jetpack_social_options":{"image_generator_settings":{"template":"highway","enabled":false}}},"categories":[3,2,7],"tags":[],"class_list":["post-617","post","type-post","status-publish","format-standard","has-post-thumbnail","category-kod-java","category-poczatkujacy","category-poradnik"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"https:\/\/www.juniorjavadeveloper.pl\/wp-content\/uploads\/2020\/04\/CRUD-Service-Rental-Porsche-01.jpg","jetpack_sharing_enabled":true,"jetpack_likes_enabled":true,"_links":{"self":[{"href":"https:\/\/www.juniorjavadeveloper.pl\/en\/wp-json\/wp\/v2\/posts\/617","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.juniorjavadeveloper.pl\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.juniorjavadeveloper.pl\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.juniorjavadeveloper.pl\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.juniorjavadeveloper.pl\/en\/wp-json\/wp\/v2\/comments?post=617"}],"version-history":[{"count":29,"href":"https:\/\/www.juniorjavadeveloper.pl\/en\/wp-json\/wp\/v2\/posts\/617\/revisions"}],"predecessor-version":[{"id":727,"href":"https:\/\/www.juniorjavadeveloper.pl\/en\/wp-json\/wp\/v2\/posts\/617\/revisions\/727"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.juniorjavadeveloper.pl\/en\/wp-json\/wp\/v2\/media\/701"}],"wp:attachment":[{"href":"https:\/\/www.juniorjavadeveloper.pl\/en\/wp-json\/wp\/v2\/media?parent=617"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.juniorjavadeveloper.pl\/en\/wp-json\/wp\/v2\/categories?post=617"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.juniorjavadeveloper.pl\/en\/wp-json\/wp\/v2\/tags?post=617"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}