Techniki Zaawansowane
8 godz. 35 min · Java · Full-stack i Programowanie
Rafał SolarskiW poczatkowych lekcjach przyjrzymy sie pokladowi, na jakim bedziemy uruchamiali nasze programy. Wykorzystamy VisualVM do podgladania parametrów JVM. Zobaczymy równiez jakie zasoby sa tam dostepne oraz dowiesz sie jak monitorowac to, czy dobrze z nich korzystamy. Opowiemy Ci tez miedzy innymi o tym, jak zrobic heap i thread dump, oraz jak wlaczyc logi GC.
Kolejne lekcje kursu zostaly poswiecone wyrazeniom regularnym. Wyrazenia regularne mozemy wykorzystac nie tylko do walidacji danych wprowadzania przez uzytkownika, ale równiez do dzielenia tekstu oraz wyluskiwania wystapien wzorców w duzym tekscie. W tym rozdziale dowiemy sie miedzy innymi tego, jak mozemy wykorzystac ten potencjal z poziomu Javy.
Dzieki typom generycznym jestesmy w stanie osiagnac bezpieczenstwo typów w trakcie kompilacji przy zachowaniu elastycznosci pisanego kodu. W nastepnym rozdziale kursu przyjrzymy sie temu, jak mozemy je wykorzystac, oraz w jaki sposób czasami nalezy z tego bezpieczenstwa zrezygnowac.
Interfejsy funkcyjne to sposób na przeniesienie odrobiny swiata programowania funkcyjnego do Javy. Gdy polaczymy je z wyrazeniami lambda oraz API strumieni pozwola nam pisac te sama logike w duzo bardziej przejrzysty sposób.
Kolekcje, czyli listy, mapy, zbiory i kolejki to jedne z najczesciej wykorzystywanych klas w codziennej pracy. To jak dobrze poznamy ich mozliwosci ma ogromny wplyw na to, w jaki sposób bedziemy podchodzili do rozwiazywania wyzwan na naszej drodze.
System plików to zasób bez którego ciezko sobie poradzic. Pozwalaja nam na dostarczanie konfiguracji, danych wejsciowych i wyjsciowych, a przez to równiez integrowanie ze soba calych systemów.W tym rozdziale nauczymy sie korzystac z tych dobrodziejstw w bezpieczny sposób wykorzystujac m.in. IO Streams.
Trzymanie daty w String to niekoniecznie najwygodniejszy sposób. Juz od pewnego czasu Java dysponuje bardzo wygodnym Date&Time API - zobaczymy, co mozemy w nim znalezc.
Wielowatkowosc nie jest prosta... i dlugo tak jeszcze pozostanie. Nawet jesli korzystamy z frameworków, które próbuja ja przed nami ukryc, to ciagle musimy byc swiadomi problemów jakie sie z nia wiaza. W tym rozdziale poznamy glówne problemy na jakie mozna natrafic programujac wielowatkowo w Javie. Poznamy równiez klasy, które zdecydowanie pomoga nam zapanowac nad ta zlozonoscia.
JDBC to najbardziej podstawowy sposób laczenia sie z baza SQL z poziomu Javy. W wielu systemach/aplikacjach stosuje sie rozwiazania ORM takie jak JPA/Hibernate. Mimo wszystko warto wiedziec jak to pod spodem dziala oraz umiec poradzic sobie w aplikacjach, gdzie wybrano bardziej "lekkie" podejscie niz Hibernate.
Na koniec kursu wykorzystamy zdobyta wiedze, aby stworzyc prosta aplikacje pozwalajaca na przechowywanie danych o wydatkach. Po stworzeniu coreu aplikacji, mozesz spróbowac uzupelnic go za pomoca GUI.
Ten kurs stworzony zostal przede wszystkim z mysla o osobach, które juz poznaly podstawy jezyka, takie jak zmienne, mechanizmy kontroli wykonania, klasy, typy generyczne.Jezeli chcesz poczuc sie swobodnie nie tylko jesli chodzi o mechanizmy jezyka, ale równiez pod wzgledem znajomosci standardowej biblioteki Javy - to kurs w sam raz dla Ciebie. Materialy beda przydatne dla studentów, którzy znaja juz podstawowa skladnie Javy; programistów Javy chcacych poszerzyc lub uporzadkowac swoja wiedze; programistów innych jezyków, którzy chca poznac inny stack technologiczny.
Okej kiedy już mamy nasz outcome tak nasz model teraz
warto się zastanowić jak będzie wyglądała nasza integracja
nasza praca z bazą danych tutaj warto sobie stworzyć jakąś
klasę tak zwane repozytorium która będzie odpowiadała za zapisanie
do bazy za usunięcie z bazy zapdejtowanie wyciągnięcie jednego
wszystkich po id jakieś takie operacje i warto to sobie właśnie
zamknąć w takiej klasie takiego repozytorium które będziemy tworzyli ta
klasa też ten obiekt a klasy będziesz sobie tworzył połączenie lub będzie dostawał
z jakiejś puli połączeń też będzie na przykład
o transakcje tak stwórz my sobie taką klasę tutaj
zacząłem od stworzenia interfejsu z tego względu że możemy mieć różne implementacje
i na początek dobrze jest wyspecyfikować raz
jakie operacje będą na tym interfejsie i zostawić to jako interfejs
z tego względu że ułatwia to na przykład mockowanie w testach czy też
właśnie podstawienie drugiej implementacji co rzadko
się zdarza ale dobrze jest to zostawić okej wymieńmy sobie
jakie operacje chcemy mieć na takim repozytorium pierwszą rzeczą to będzie
po prostu dodanie nowego outcome'u dajemy po prostu outcome
tutaj z założenia on w środku nie ma id tak tutaj
w naszej implementacji w naszym tak jakby kontraktem tego interfejsu
jest to że on nie ma tego id w środku i też po tak
jakby wykonaniu tej metody niektóre
powiedzmy biblioteki czy różne jakieś orm'y pod
spodem modyfikują ten obiekt tak dodają mu id na przykład
właśnie tak my tego nie będziemy robić to po prostu będzie obiekt który dalej
nie ma id on w bazie dostał id tak ale jeżeli chcemy dostać tak jakby
tą pełną reprezentację już z id to musimy sobie wyciągnąć
dopiero z bazy kolejną podobną metodą jest po prostu add
all i tutaj dajemy listę outcome'ów które nie mają id i one są dodawane do
bazy później jest ciekawszy update i update tutaj możemy
sobie założyć że jest to obiekt który jest dopiero co wyciągnięty
z bazy on ma id w sobie i po prostu na
takim obiekcie będziemy robić set i apdejtowli jedno z pól na przykład
nie wiem czy to komentarz tak będziemy wstawiali to co poda użytkownik i
później z takim obiektem wołamy update i jeszcze tutaj jest boolean
z tego względu że chcę na przykład sprawdzić czy faktycznie tam coś
zostało zapdejtowane w sensie czy został czy ten obiekt który
tutaj podaliśmy czy on faktycznie istniał bo może się okazać że zrobiliśmy
update na naszym co nie istniało no i to jest też pytanie czy nie powinniśmy
wtedy rzucić czymś ja to założę po prostu że jeżeli został przynajmniej jeden wiersz
w bazie danych zapdejtowany po czymś takim no to zwracamy true
tak okej chodźmy dalej mamy delete'a i
tutaj tak samo jest flaga usuwamy po id który jest
longiem tak i jeżeli został usunięty ten wiesz no to wtedy zwracamy true
delete all działa analogicznie on tutaj ważne transakcyjnie
i usuwa wszystkie outcome'y tak z baz danych i jeszcze zwraca nam
żebyśmy mogli wyświecić na przykład informację ile zostało usuniętych w ramach tej
operacji get all zwraca nam wszystkie outcomy tak czyli
select gwiazdka from table no i jeszcze mamy get one po
id usuwaliśmy teraz wyciągamy po jednym i tutaj z tego względu że ten
ten outcome z takim id może nie istnieć no to tutaj mam opcję albo zwrócić nulla
albo w przypadku javy można zwrócić na przykład optionala i
wtedy zmusimy na przykład klienta do obsługi tego tak i już ostatnia
operacja to jest computed sum tutaj jest trochę ciekawiej zwracamy
oczywiście decimal ponieważ suma amount będzie też big decimalem
a to ciekawe są za to te parametry from date i offset
to date tak i ja w swojej implementacji chciałbym
założyć że te te parametry mogą być opcjonalne to znaczy
czyli mogę na przykład ograniczyć od jednej strony albo drugiej
albo na przykład nie ograniczać i wyliczyć sumę wszystkiego co się znajduje w bazie
prawda w tym celu tutaj będę po prostu podsstawiał nulla tak
w niektórych językach jest też można wrzucać optionala
do jako parametr w javie trochę krzywo się na to patrzy okej
tak wygląda nasz interfejs teraz będziemy starali się zaimplementować metodę po
metodzie lub na przykład w parach tak będziemy starali się na to napisać
testy i później spełniać te testy tak żeby one przechodziły